Initial commit

This commit is contained in:
Donny
2019-04-22 20:46:32 +08:00
commit 49ab8aadd1
25441 changed files with 4055000 additions and 0 deletions

View File

@@ -0,0 +1,60 @@
load(
"@io_bazel_rules_go//proto:def.bzl",
"go_proto_library",
)
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
proto_library(
name = "api_proto",
srcs = ["api.proto"],
tags = ["automanaged"],
deps = ["@gogo_special_proto//github.com/gogo/protobuf/gogoproto"],
)
go_proto_library(
name = "api_go_proto",
compilers = ["@io_bazel_rules_go//proto:gogofast_grpc"],
importpath = "go-common/app/service/main/coin/api",
proto = ":api_proto",
tags = ["automanaged"],
deps = ["@com_github_gogo_protobuf//gogoproto:go_default_library"],
)
go_library(
name = "go_default_library",
srcs = ["client.go"],
embed = [":api_go_proto"],
importpath = "go-common/app/service/main/coin/api",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//library/net/rpc/warden:go_default_library",
"@com_github_gogo_protobuf//gogoproto:go_default_library",
"@com_github_gogo_protobuf//proto:go_default_library",
"@org_golang_google_grpc//:go_default_library",
"@org_golang_x_net//context:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [
":package-srcs",
"//app/service/main/coin/api/gorpc:all-srcs",
],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,251 @@
// +bili:type=service
// Code generated by warden.
syntax = "proto3";
package community.service.coin.v1;
import "github.com/gogo/protobuf/gogoproto/gogo.proto";
option go_package = "api";
// AddCoinReply reply
message AddCoinReply {
}
// AddCoinReq req
message AddCoinReq {
// ip
string ip = 1 [(gogoproto.jsontag) = "ip", (gogoproto.customname) = "IP"];
// mid
int64 mid = 2 [(gogoproto.moretags) = "form:\"mid\" validate:\"required,min=1\""];
// up 主mid
int64 upmid = 3 [(gogoproto.moretags) = 'form:"upid" validate:"required"'];
// 最大投币数
int64 max_coin = 4 [(gogoproto.moretags) = 'form:"max"'];
// aid
int64 aid = 5 [(gogoproto.moretags) = "form:\"aid\" validate:\"required\""];
// 业务
string business = 6 [(gogoproto.moretags) = "form:\"business\" validate:\"required\""];
// 数量
int64 number = 7 [(gogoproto.moretags) = "form:\"number\" validate:\"required,min=1\""];
// 稿件typeid(稿件专用)
int32 typeid = 8 [(gogoproto.moretags) = "form:\"typeid\""];
// 稿件发布时间
int64 pub_time = 9 [(gogoproto.moretags) = "form:\"pub_time\""];
}
// AddUserCoinExpReply add coin exp reply
message AddUserCoinExpReply {
}
// AddUserCoinExpReq req
message AddUserCoinExpReq {
// ip
string ip = 1 [(gogoproto.jsontag) = "ip", (gogoproto.customname) = "IP"];
// mid
int64 mid = 2;
// business
string business = 3;
// number
int64 number = 4;
}
// CoinsLogReply reply
message CoinsLogReply {
// log
repeated ModelLog list = 1;
}
// CoinsLogReq req
message CoinsLogReq {
// mid
int64 mid = 1 [(gogoproto.moretags) = "form:\"mid\" validate:\"required,min=1\""];
// 返回最近一周还是全部
bool recent = 2 [(gogoproto.moretags) = "form:\"recent\""];
// 翻译后的格式 还是原始格式
bool translate = 3 [(gogoproto.moretags) = "form:\"translate\""];
}
// ItemUserCoinsReply reply
message ItemUserCoinsReply {
// number
int64 number = 1[(gogoproto.jsontag) = "number"] ;
}
// ItemUserCoinsReq req
message ItemUserCoinsReq {
// mid
int64 mid = 1 [(gogoproto.moretags) = 'form:"mid" validate:"required"'];
// aid
int64 aid = 2 [(gogoproto.moretags) = "form:\"aid\" validate:\"required\""];
// 业务
string business = 3 [(gogoproto.moretags) = "form:\"business\" validate:\"required\""];
}
// ListReply reply
message ListReply {
// log
repeated ModelList list = 1;
}
// ListReq .
message ListReq {
// mid
int64 mid = 1;
// business
string business = 2;
// 时间戳
int64 ts = 3;
}
// ModelArchiveUserCoins .
message ModelArchiveUserCoins {
// number
int64 number = 1;
}
// ModelArgModifyCoin .
message ModelArgModifyCoin {
// mid
int64 mid = 1;
// count
double count = 2;
// 原因
string reason = 3;
// ip
string ip = 4 [(gogoproto.jsontag) = "ip", (gogoproto.customname) = "IP"];
// 操作人
string operator = 5;
// 是否要检查余额数量 默认检查 为1则不检查
int32 check_zero = 6;
}
// ModelList .
message ModelList {
// aid
int64 aid = 1;
// number
int64 number = 2;
// 时间戳
int64 ts = 3;
// ip
uint32 ip = 4 [(gogoproto.jsontag) = "ip", (gogoproto.customname) = "IP"];
}
// ModelLog .
message ModelLog {
// 修改前硬币数
double from = 1;
// 修改后硬币数
double to = 2;
// ip
string ip = 3 [(gogoproto.jsontag) = "ip", (gogoproto.customname) = "IP"];
// 原因
string desc = 4;
// 时间戳
int64 time_stamp = 5;
}
// ModelRecord record
message ModelRecord {
// aid
int64 aid = 1;
// mid
int64 mid = 2;
// up主id
int64 up = 3;
// 时间戳
int64 timestamp = 4;
// number
int64 number = 5;
// 业务
string business = 6;
// ip
uint32 ip = 7 [(gogoproto.jsontag) = "ip", (gogoproto.customname) = "IP"];
}
// ModifyCoinsReply reply
message ModifyCoinsReply {
// result
double result = 1;
}
// ModifyCoinsReq req
message ModifyCoinsReq {
// mid
int64 mid = 1 [(gogoproto.moretags) = "form:\"mid\" validate:\"required\""];
// 变更的计数 例如10为硬币数加10
double count = 2 [(gogoproto.moretags) = "form:\"count\" validate:\"required\""];
// 改变的原因
string reason = 3 [(gogoproto.moretags) = "form:\"reason\" validate:\"required\""];
// ip
string ip = 4 [(gogoproto.jsontag) = "ip", (gogoproto.customname) = "IP"];
// 操作人
string operator = 5 [(gogoproto.moretags) = "form:\"operator\""];
// 是否要检查余额数量 默认检查 为1则不检查
int32 check_zero = 6 [(gogoproto.moretags) = "form:\"check_zero\""];
// 时间戳
int64 ts = 7;
}
// TodayExpReply reply
message TodayExpReply {
// exp
int64 exp = 1;
}
// TodayExpReq req
message TodayExpReq {
// mid
int64 mid = 1 [(gogoproto.moretags) = "form:\"mid\" validate:\"required,min=1\""];
}
// UpdateAddCoinReply reply
message UpdateAddCoinReply {
}
// UpdateAddCoinReq req
message UpdateAddCoinReq {
// aid
int64 aid = 1;
// mid
int64 mid = 2;
// up mid
int64 up = 3;
// timestamp
int64 timestamp = 4;
// number
int64 number = 5;
// business
string business = 6;
// ip
uint32 ip = 7 [(gogoproto.jsontag) = "ip", (gogoproto.customname) = "IP"];
string ipv6 = 8 [(gogoproto.jsontag) = "ip_v6", (gogoproto.customname) = "IPV6"];
}
// UserCoinsReply reply
message UserCoinsReply {
// count
double count = 1;
}
// UserCoinsReq req
message UserCoinsReq {
// mid
int64 mid = 1 [(gogoproto.moretags) = "form:\"mid\" validate:\"required,min=1\""];
}
// Coin rpc
service Coin {
// AddCoin add coin. 投币接口
rpc AddCoin(AddCoinReq) returns(AddCoinReply);
// ItemUserCoins get coins added of archive. 投币数量接口
rpc ItemUserCoins(ItemUserCoinsReq) returns(ItemUserCoinsReply);
// UserCoins get user coins. 用户硬币余额
rpc UserCoins(UserCoinsReq) returns(UserCoinsReply);
// ModifyCoins modify user coins. 修改硬币数
rpc ModifyCoins(ModifyCoinsReq) returns(ModifyCoinsReply);
// List get coin added list.投币列表
rpc List(ListReq) returns(ListReply);
// CoinsLog coins log 投币日志
rpc CoinsLog(CoinsLogReq) returns(CoinsLogReply);
// AddUserCoinExp add user coin exp for job
rpc AddUserCoinExp(AddUserCoinExpReq) returns(AddUserCoinExpReply);
// UpdateAddCoin update db after add coin for job.
rpc UpdateAddCoin(UpdateAddCoinReq) returns(UpdateAddCoinReply);
// TodayExp get today coin added exp. 今日投币经验
rpc TodayExp(TodayExpReq) returns(TodayExpReply);
}

View File

@@ -0,0 +1,25 @@
package api
import (
"context"
"fmt"
"go-common/library/net/rpc/warden"
"google.golang.org/grpc"
)
// AppID .
const AppID = "community.service.coin"
// NewClient new grpc client
func NewClient(cfg *warden.ClientConfig, opts ...grpc.DialOption) (CoinClient, error) {
client := warden.NewClient(cfg, opts...)
cc, err := client.Dial(context.Background(), fmt.Sprintf("discovery://default/%s", AppID))
if err != nil {
return nil, err
}
return NewCoinClient(cc), nil
}
//go:generate $GOPATH/src/go-common/app/tool/warden/protoc.sh

View File

@@ -0,0 +1,45 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["coin_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = ["//app/service/main/coin/model:go_default_library"],
)
go_library(
name = "go_default_library",
srcs = [
"coin.go",
"mock.go",
],
importpath = "go-common/app/service/main/coin/api/gorpc",
tags = ["automanaged"],
deps = [
"//app/service/main/coin/model:go_default_library",
"//library/net/rpc:go_default_library",
"//vendor/github.com/golang/mock/gomock:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,104 @@
package coin
import (
"context"
"go-common/app/service/main/coin/model"
"go-common/library/net/rpc"
)
const (
_addCoins = "RPC.AddCoins"
_archiveUserCoins = "RPC.ArchiveUserCoins"
_userCoins = "RPC.UserCoins"
_modifyCoin = "RPC.ModifyCoin"
_list = "RPC.List"
_userLog = "RPC.UserLog"
_addUserCoinExp = "RPC.AddUserCoinExp"
_updateAddCoin = "RPC.UpdateAddCoin"
_todayExp = "RPC.TodayExp"
)
const (
_appid = "community.service.coin"
)
var (
_noRes = &struct{}{}
)
// Service rpc service.
type Service struct {
client *rpc.Client2
}
//go:generate mockgen -source coin.go -destination mock.go -package coin
// RPC coin rpc
type RPC interface {
AddCoins(c context.Context, arg *model.ArgAddCoin) (err error)
ArchiveUserCoins(c context.Context, arg *model.ArgCoinInfo) (res *model.ArchiveUserCoins, err error)
UserCoins(c context.Context, arg *model.ArgCoinInfo) (count float64, err error)
}
// New new service.
func New(c *rpc.ClientConfig) (s *Service) {
s = &Service{}
s.client = rpc.NewDiscoveryCli(_appid, c)
return
}
// AddCoins coin to archive.
func (s *Service) AddCoins(c context.Context, arg *model.ArgAddCoin) (err error) {
err = s.client.Call(c, _addCoins, arg, _noRes)
return
}
// ArchiveUserCoins get archive User added coins.
func (s *Service) ArchiveUserCoins(c context.Context, arg *model.ArgCoinInfo) (res *model.ArchiveUserCoins, err error) {
res = &model.ArchiveUserCoins{}
err = s.client.Call(c, _archiveUserCoins, arg, res)
return
}
// UserCoins get user coins.
func (s *Service) UserCoins(c context.Context, arg *model.ArgCoinInfo) (count float64, err error) {
err = s.client.Call(c, _userCoins, arg, &count)
return
}
// ModifyCoin modify user coin.
func (s *Service) ModifyCoin(c context.Context, arg *model.ArgModifyCoin) (count float64, err error) {
err = s.client.Call(c, _modifyCoin, arg, &count)
return
}
// List coin added list.
func (s *Service) List(c context.Context, arg *model.ArgList) (list []*model.List, err error) {
err = s.client.Call(c, _list, arg, &list)
return
}
// UserLog user log
func (s *Service) UserLog(c context.Context, arg *model.ArgLog) (logs []*model.Log, err error) {
err = s.client.Call(c, _userLog, arg, &logs)
return
}
// AddUserCoinExp add user coin exp
func (s *Service) AddUserCoinExp(c context.Context, arg *model.ArgAddUserCoinExp) (err error) {
err = s.client.Call(c, _addUserCoinExp, arg, _noRes)
return
}
// UpdateAddCoin update db after add coin for job.
func (s *Service) UpdateAddCoin(c context.Context, arg *model.Record) (err error) {
err = s.client.Call(c, _updateAddCoin, arg, _noRes)
return
}
// TodayExp get today exp
func (s *Service) TodayExp(c context.Context, arg *model.ArgMid) (number int64, err error) {
err = s.client.Call(c, _todayExp, arg, &number)
return
}

View File

@@ -0,0 +1,38 @@
package coin
import (
"context"
"testing"
"time"
coin "go-common/app/service/main/coin/model"
)
const (
mid = 23675773
aid = 1
realIP = "127.0.0.1"
)
func TestCoin(t *testing.T) {
s := New(nil)
time.Sleep(1 * time.Second)
// coin
testAddCoins(t, s)
testArchiveUserCoins(t, s)
}
func testAddCoins(t *testing.T, s *Service) {
arg := coin.ArgAddCoin{Mid: mid, Aid: aid, Multiply: 1, RealIP: realIP}
if err := s.AddCoins(context.TODO(), &arg); err != nil {
t.Logf("call.AddCoins error(%v)", err)
}
}
func testArchiveUserCoins(t *testing.T, s *Service) {
arg := coin.ArgCoinInfo{Mid: mid, Aid: aid, RealIP: realIP}
if res, err := s.ArchiveUserCoins(context.TODO(), &arg); err != nil && res != nil {
t.Logf("call.ArchiveUserCoins error(%v)", err)
}
}

View File

@@ -0,0 +1,73 @@
// Code generated by MockGen. DO NOT EDIT.
// Source: coin.go
// Package coin is a generated GoMock package.
package coin
import (
context "context"
gomock "github.com/golang/mock/gomock"
model "go-common/app/service/main/coin/model"
reflect "reflect"
)
// MockRPC is a mock of RPC interface
type MockRPC struct {
ctrl *gomock.Controller
recorder *MockRPCMockRecorder
}
// MockRPCMockRecorder is the mock recorder for MockRPC
type MockRPCMockRecorder struct {
mock *MockRPC
}
// NewMockRPC creates a new mock instance
func NewMockRPC(ctrl *gomock.Controller) *MockRPC {
mock := &MockRPC{ctrl: ctrl}
mock.recorder = &MockRPCMockRecorder{mock}
return mock
}
// EXPECT returns an object that allows the caller to indicate expected use
func (m *MockRPC) EXPECT() *MockRPCMockRecorder {
return m.recorder
}
// AddCoins mocks base method
func (m *MockRPC) AddCoins(c context.Context, arg *model.ArgAddCoin) error {
ret := m.ctrl.Call(m, "AddCoins", c, arg)
ret0, _ := ret[0].(error)
return ret0
}
// AddCoins indicates an expected call of AddCoins
func (mr *MockRPCMockRecorder) AddCoins(c, arg interface{}) *gomock.Call {
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddCoins", reflect.TypeOf((*MockRPC)(nil).AddCoins), c, arg)
}
// ArchiveUserCoins mocks base method
func (m *MockRPC) ArchiveUserCoins(c context.Context, arg *model.ArgCoinInfo) (*model.ArchiveUserCoins, error) {
ret := m.ctrl.Call(m, "ArchiveUserCoins", c, arg)
ret0, _ := ret[0].(*model.ArchiveUserCoins)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// ArchiveUserCoins indicates an expected call of ArchiveUserCoins
func (mr *MockRPCMockRecorder) ArchiveUserCoins(c, arg interface{}) *gomock.Call {
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ArchiveUserCoins", reflect.TypeOf((*MockRPC)(nil).ArchiveUserCoins), c, arg)
}
// UserCoins mocks base method
func (m *MockRPC) UserCoins(c context.Context, arg *model.ArgCoinInfo) (float64, error) {
ret := m.ctrl.Call(m, "UserCoins", c, arg)
ret0, _ := ret[0].(float64)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// UserCoins indicates an expected call of UserCoins
func (mr *MockRPCMockRecorder) UserCoins(c, arg interface{}) *gomock.Call {
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UserCoins", reflect.TypeOf((*MockRPC)(nil).UserCoins), c, arg)
}

View File

@@ -0,0 +1,2 @@
# API文档
http://info.bilibili.co/pages/viewpage.action?pageId=3692674

View File

@@ -0,0 +1,334 @@
{
"swagger": "2.0",
"info": {
"title": "go-common api",
"description": "api",
"version": "1.0",
"contact": {
"email": "lintanghui@bilibili.com"
},
"license": {
"name": "Apache 2.0",
"url": "http://www.apache.org/licenses/LICENSE-2.0.html"
}
},
"paths": {
"/x/internal/v1/coin/add": {
"get": {
"operationId": "/x/internal/v1/coin/add",
"parameters": [
{
"in": "query",
"name": "mid",
"type": "integer",
"format": "int64"
},
{
"in": "query",
"name": "max_coin",
"type": "integer",
"format": "int64"
},
{
"in": "query",
"name": "aid",
"type": "integer",
"format": "int64"
},
{
"in": "query",
"name": "business",
"type": "string"
},
{
"in": "query",
"name": "number",
"type": "integer",
"format": "int64"
},
{
"in": "query",
"name": "ip",
"required": true,
"type": "string"
},
{
"in": "query",
"name": "upmid",
"type": "integer",
"format": "int64"
},
{
"in": "query",
"name": "typeid",
"type": "integer",
"format": "int32"
},
{
"in": "query",
"name": "pub_time",
"type": "integer",
"format": "int64"
}
],
"responses": {
"200": {
"description": "服务成功响应内容",
"schema": {
"type": "object",
"properties": {
"code": {
"description": "错误码描述",
"type": "integer"
},
"data": {
"$ref": "#/definitions/AddCoinReply",
"type": "object"
},
"message": {
"description": "错误码文本描述",
"type": "string"
},
"ttl": {
"description": "客户端限速时间",
"type": "integer",
"format": "int64"
}
}
}
}
}
}
},
"/x/internal/v1/coin/user/count": {
"get": {
"operationId": "/x/internal/v1/coin/user/count",
"parameters": [
{
"in": "query",
"name": "mid",
"type": "integer",
"format": "int64"
}
],
"responses": {
"200": {
"description": "服务成功响应内容",
"schema": {
"type": "object",
"properties": {
"code": {
"description": "错误码描述",
"type": "integer"
},
"data": {
"$ref": "#/definitions/UserCoinsReply",
"type": "object"
},
"message": {
"description": "错误码文本描述",
"type": "string"
},
"ttl": {
"description": "客户端限速时间",
"type": "integer",
"format": "int64"
}
}
}
}
}
}
},
"/x/internal/v1/coin/user/log": {
"get": {
"operationId": "/x/internal/v1/coin/user/log",
"parameters": [
{
"in": "query",
"name": "mid",
"type": "integer",
"format": "int64"
},
{
"in": "query",
"name": "recent",
"type": "boolean"
},
{
"in": "query",
"name": "translate",
"type": "boolean"
}
],
"responses": {
"200": {
"description": "服务成功响应内容",
"schema": {
"type": "object",
"properties": {
"code": {
"description": "错误码描述",
"type": "integer"
},
"data": {
"$ref": "#/definitions/CoinsLogReply",
"type": "object"
},
"message": {
"description": "错误码文本描述",
"type": "string"
},
"ttl": {
"description": "客户端限速时间",
"type": "integer",
"format": "int64"
}
}
}
}
}
}
},
"/x/internal/v1/coin/user/modify": {
"post": {
"operationId": "/x/internal/v1/coin/user/modify",
"parameters": [
{
"in": "query",
"name": "ts",
"type": "integer",
"format": "int64"
},
{
"in": "query",
"name": "mid",
"type": "integer",
"format": "int64"
},
{
"in": "query",
"name": "count",
"type": "number",
"format": "double"
},
{
"in": "query",
"name": "reason",
"type": "string"
},
{
"in": "query",
"name": "ip",
"required": true,
"type": "string"
},
{
"in": "query",
"name": "operator",
"type": "string"
},
{
"in": "query",
"name": "check_zero",
"type": "integer",
"format": "int32"
}
],
"responses": {
"200": {
"description": "服务成功响应内容",
"schema": {
"type": "object",
"properties": {
"code": {
"description": "错误码描述",
"type": "integer"
},
"data": {
"$ref": "#/definitions/ModifyCoinsReply",
"type": "object"
},
"message": {
"description": "错误码文本描述",
"type": "string"
},
"ttl": {
"description": "客户端限速时间",
"type": "integer",
"format": "int64"
}
}
}
}
}
}
}
},
"definitions": {
"AddCoinReply": {
"title": "AddCoinReply",
"type": "object"
},
"CoinsLogReply": {
"title": "CoinsLogReply",
"type": "object",
"properties": {
"list": {
"type": "array",
"items": {
"$ref": "#/definitions/ModelLog",
"type": "object"
}
}
}
},
"ModelLog": {
"title": "ModelLog",
"required": [
"ip"
],
"type": "object",
"properties": {
"desc": {
"type": "string"
},
"from": {
"type": "number",
"format": "double"
},
"ip": {
"type": "string"
},
"time_stamp": {
"type": "integer",
"format": "int64"
},
"to": {
"type": "number",
"format": "double"
}
}
},
"ModifyCoinsReply": {
"title": "ModifyCoinsReply",
"type": "object",
"properties": {
"result": {
"type": "number",
"format": "double"
}
}
},
"UserCoinsReply": {
"title": "UserCoinsReply",
"type": "object",
"properties": {
"count": {
"type": "number",
"format": "double"
}
}
}
}
}