add base filt

This commit is contained in:
daniel.w 2024-08-24 15:04:30 +08:00
parent 3353a61005
commit 942ffab126
9 changed files with 525 additions and 0 deletions

6
.gitignore vendored Normal file
View File

@ -0,0 +1,6 @@
.idea/
go.sum
account/
gen_result/
etc/service.yaml
client/

140
.golangci.yaml Normal file
View File

@ -0,0 +1,140 @@
run:
timeout: 3m
# Exit code when at least one issue was found.
# Default: 1
issues-exit-code: 2
# Include test files or not.
# Default: true
tests: false
# Reference URL: https://golangci-lint.run/usage/linters/
linters:
# Disable everything by default so upgrades to not include new - default
# enabled- linters.
disable-all: true
# Specifically enable linters we want to use.
enable:
# - depguard
- errcheck
# - godot
- gofmt
- goimports
- gosimple
- govet
- ineffassign
- misspell
- revive
# - staticcheck
- typecheck
- unused
# - wsl
- asasalint
- asciicheck
- bidichk
- bodyclose
# - containedctx
- contextcheck
# - cyclop
# - varnamelen
# - gci
- wastedassign
- whitespace
# - wrapcheck
- thelper
- tparallel
- unconvert
- unparam
- usestdlibvars
- tenv
- testableexamples
- stylecheck
- sqlclosecheck
- nosprintfhostport
- paralleltest
- prealloc
- predeclared
- promlinter
- reassign
- rowserrcheck
- nakedret
- nestif
- nilerr
- nilnil
- nlreturn
- noctx
- nolintlint
- nonamedreturns
- decorder
- dogsled
# - dupl
- dupword
- durationcheck
- errchkjson
- errname
- errorlint
# - execinquery
- exhaustive
- exportloopref
- forbidigo
- forcetypeassert
# - gochecknoglobals
- gochecknoinits
- gocognit
- goconst
- gocritic
- gocyclo
# - godox
# - goerr113
# - gofumpt
- goheader
- gomoddirectives
# - gomodguard always failed
- goprintffuncname
- gosec
- grouper
- importas
- interfacebloat
# - ireturn
- lll
- loggercheck
- maintidx
- makezero
issues:
exclude-rules:
- path: _test\.go
linters:
- funlen
- goconst
- interfacer
- dupl
- lll
- goerr113
- errcheck
- gocritic
- cyclop
- wrapcheck
- gocognit
- contextcheck
linters-settings:
gci:
sections:
- standard # Standard section: captures all standard packages.
- default # Default section: contains all imports that could not be matched to another section type.
gocognit:
# Minimal code complexity to report.
# Default: 30 (but we recommend 10-20)
min-complexity: 40
nestif:
# Minimal complexity of if statements to report.
# Default: 5
min-complexity: 10
lll:
# Max line length, lines longer will be reported.
# '\t' is counted as 1 character by default, and can be changed with the tab-width option.
# Default: 120.
line-length: 200
# Tab width in spaces.
# Default: 1
tab-width: 1

81
Makefile Normal file
View File

@ -0,0 +1,81 @@
# go-zero 生成風格
GO_ZERO_STYLE=go_zero
GO ?= go
GOFMT ?= gofmt "-s"
GOFILES := $(shell find . -name "*.go")
LDFLAGS := -s -w
VERSION="v1.0.3"
DOCKER_REPO="igs170911/notification"
.PHONY: test
test: # 進行測試
go test -v --cover ./...
.PHONY: fmt
fmt: # 格式優化
$(GOFMT) -w $(GOFILES)
goimports -w ./
.PHONY: gen-rpc
gen-rpc: # 建立 rpc code
goctl rpc protoc ./generate/protobuf/service.proto -m --style=$(GO_ZERO_STYLE) --go_out=./gen_result/pb --go-grpc_out=./gen_result/pb --zrpc_out=.
go mod tidy
@echo "Generate core-api files successfully"
.PHONY: gen-clean
gen-clean: # 建立 rpc code
rm -rf ./client
rm -rf ./etc
rm -rf ./gen_result
rm -rf ./internal
rm -rf go.mod
rm -rf go.sum
rm -rf service.go
@echo "Generate core-api files successfully"
.PHONY: run-docker
run-docker: # 建立 rpc code
docker run --platform=linux/arm64/v8 -p 8080:8080 $(DOCKER_REPO):$(VERSION)
.PHONY: build-docker
build-docker:
cp ./build/Dockerfile Dockerfile
docker buildx build -t $(DOCKER_REPO):$(VERSION) --build-arg SSH_PRIVATE_KEY="$(cat ~/.ssh/ed_25519)" .
rm -rf Dockerfile
@echo "Generate core-api files successfully"
.PHONY: gen-my-sql-model
gen-my-sql-model: # 建立 rpc 資料庫
goctl model mysql ddl -c no -s ./generate/database/mysql/20230529020011_account_table.up.sql --style $(GO_ZERO_STYLE) -d ./internal/model -i ''
goctl model mysql ddl -c no -s ./generate/database/mysql/20230529020012_account_uid_table.up.sql --style $(GO_ZERO_STYLE) -d ./internal/model -i ''
goctl model mysql ddl -c no -s ./generate/database/mysql/20230529020013_user_table.up.sql --style $(GO_ZERO_STYLE) -d ./internal/model -i ''
goctl model mysql ddl -c no -s ./generate/database/mysql/20230719061241_machine_node.up.sql --style $(GO_ZERO_STYLE) -d ./internal/model -i ''
@echo "Generate mysql model files successfully"
gen-mongo-model: # 建立 rpc 資料庫
# 只產生 Model 剩下的要自己撰寫,連欄位名稱也是
goctl model mongo -t AutoId --dir ./internal/model/mongo --style $(GO_ZERO_STYLE)
@echo "Generate mongo model files successfully"
#goctl model mysql ddl -s ./generate/database/mysql/20240819090248_create_role_permission_table.up.sql --style go_zero -d ./internal/model -i '' (沒cache)
#goctl model mysql ddl -c no -s ./generate/database/mysql/20240816014305_create_permission_table.up.sql --style go_zero -d ./internal/model -i '' (有cache)
.PHONY: mock-gen
mock-gen: # 建立 mock 資料
mockgen -source=./internal/domain/usecase/uid_generate.go -destination=./internal/mock/usecase/uid_generate.go -package=mock
mockgen -source=./internal/model/account_model_gen.go -destination=./internal/mock/model/account_model_gen.go -package=mock
mockgen -source=./internal/model/account_model.go -destination=./internal/mock/model/account_model.go -package=mock
mockgen -source=./internal/model/account_to_uid_model_gen.go -destination=./internal/mock/model/account_to_uid_model_gen.go -package=mock
mockgen -source=./internal/model/account_to_uid_model.go -destination=./internal/mock/model/account_to_uidmodel.go -package=mock
mockgen -source=./internal/model/machine_node_model_gen.go -destination=./internal/mock/model/machine_node_model_gen.go -package=mock
mockgen -source=./internal/model/machine_node_model.go -destination=./internal/mock/model/machine_node_model.go -package=mock
mockgen -source=./internal/model/user_table_model_gen.go -destination=./internal/mock/model/user_table_model_gen.go -package=mock
mockgen -source=./internal/model/user_table_model.go -destination=./internal/mock/model/user_table_model.go -package=mock
mockgen -source=./internal/model/mongo/auto_id_model_gen.go -destination=./internal/mock/model/auto_id_model_gen.go -package=mock
mockgen -source=./internal/model/mongo/auto_id_model.go -destination=./internal/mock/model/auto_id_model.go -package=mock
@echo "Generate mock files successfully"
.PHONY: migrate-database
migrate-database:
migrate -source file://generate/database/mysql -database 'mysql://root:yytt@tcp(127.0.0.1:3306)/digimon_member' up

47
build/Dockerfile Normal file
View File

@ -0,0 +1,47 @@
###########
# BUILDER #
###########
FROM golang:1.22.3 as builder
ARG VERSION
ARG BUILT
ARG GIT_COMMIT
ARG SSH_PRV_KEY
# private go packages
ENV GOPRIVATE=code.30cm.net
ENV FLAG="-s -w -X main.Version=${VERSION} -X main.Built=${BUILT} -X main.GitCommit=${GIT_COMMIT}"
WORKDIR /app
COPY . .
RUN apt-get update && \
apt-get install git
# Make the root foler for our ssh
RUN mkdir -p /root/.ssh && \
chmod 0700 /root/.ssh && \
ssh-keyscan git.30cm.net > /root/.ssh/known_hosts && \
echo "$SSH_PRV_KEY" > /root/.ssh/id_rsa && \
chmod 600 /root/.ssh/id_rsa
RUN --mount=type=ssh go mod download
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build \
-ldflags "$FLAG" \
-o service
##########
## FINAL #
##########
#
FROM gcr.io/distroless/static-debian11
WORKDIR /app
COPY --from=builder /app/service /app/service
COPY --from=builder /app/etc/service.yaml /app/etc/service.yaml
EXPOSE 8080
CMD ["/app/service"]

1
chart/readme.md Normal file
View File

@ -0,0 +1 @@
// TODO 未來要放 helm 的地方

View File

@ -0,0 +1 @@
DROP DATABASE IF EXISTS `digimon_permission`;

View File

@ -0,0 +1,39 @@
# migrate
數據庫遷移工具
[golang-migrate](https://github.com/golang-migrate/migrate)
## 安裝 make
```shell
brew install Makefile
```
## 安裝 golang-migrate
```shell
brew install golang-migrate
```
## 執行刪除 mysql schema
```shell
migrate -source file://database/migrations/mysql -database 'mysql://account:password@tcp(127.0.0.1:3306)/esc_c2c' down
```
## 執行安裝 mysql schema
```shell
migrate -source file://database/migrations/mysql -database 'mysql://account:password@tcp(127.0.0.1:3306)/esc_c2c' up
```
## 執行刪除 mongo schema
```shell
migrate -source file://database/migrations/mongodb -database 'mongodb://127.0.0.1:27017/esc_c2c' down
```
## 執行安裝 mongo schema
```shell
migrate -source file://database/migrations/mongodb -database 'mongodb://127.0.0.1:27017/esc_c2c' up
```

View File

@ -0,0 +1,210 @@
syntax = "proto3";
package member;
option go_package="./member";
// OKResp
message OKResp {}
// NoneReq
message NoneReq {}
// ================ enum ================
enum VerifyType {
VERIFY_NONE = 0; //
VERIFY_EMAIL = 1;
VERIFY_PHONE = 2;
VERIFY_GOOGLE = 3; // google
VERIFY_NOT = 4; //
}
enum AlarmType {
ALARM_NONE = 0; //
ALARM_NOT = 1; //
ALARM_SYSTEM = 2; //
}
enum MemberStatus {
STATUS_NONE = 0; //
STATUS_VERIFY = 1; //
STATUS_COMPLETE = 2; //
STATUS_DISABLE = 3; //
STATUS_EMAIL = 4; //
STATUS_PHONE = 5; //
STATUS_GA = 6; // GA
}
// ================ enum ================
// ================ common ================
message Pager {
int64 total =1;
int64 size=2;
int64 index=3;
}
// ================ common ================
// ================ account ================
message CreateLoginUserReq {
string login_id = 1;
int64 platform = 2;
string token = 3;
}
message BindingUserReq {
string uid = 1;
string login_id = 2;
int64 type = 3;
}
message BindingUserResp {
string uid = 1;
string login_id = 2;
int64 type = 3;
}
message CreateUserInfoReq {
string uid = 1;
VerifyType verify_type = 2;
AlarmType alarm_type = 3;
MemberStatus status = 4;
string language = 5;
string currency = 6;
optional string avatar= 7;
optional string nick_name = 8;
}
message GetAccountInfoResp {
CreateLoginUserReq data = 1;
}
// UpdateUserInfoReq
message UpdateUserInfoReq {
string uid = 1;
optional string language = 2;
optional string currency = 3;
optional string nick_name = 4;
optional string avatar = 5;
optional VerifyType verify_type = 6;
optional AlarmType alarm_type = 7;
optional MemberStatus status = 8;
}
message GetUIDByAccountReq {
string account = 1;
}
message GetUidByAccountResp {
string uid = 1;
string account =2;
}
message UpdateTokenReq {
string account = 1;
string token = 2;
int64 platform=3;
}
message GenerateRefreshCodeReq {
string account = 1;
int32 code_type =2;
}
message VerifyCode {
string verify_code = 1;
}
message GenerateRefreshCodeResp {
VerifyCode data = 1;
}
message VerifyRefreshCodeReq {
string account = 1;
int32 code_type =2;
string verify_code = 3;
}
message UpdateStatusReq {
string uid = 1;
MemberStatus status = 2;
}
message GetUserInfoReq {
string uid = 1;
optional string nick_name =2;
}
message UserInfo {
string uid = 1;
VerifyType verify_type = 2;
AlarmType alarm_type = 3;
MemberStatus status = 4;
string language = 5;
string currency = 6;
string avatar = 7;
int64 create_time=8;
int64 update_time=9;
optional string nick_name = 10;
}
message GetUserInfoResp {
UserInfo data = 1;
}
message ListUserInfoReq {
optional VerifyType verify_type = 1;
optional AlarmType alarm_type = 2;
optional MemberStatus status = 3;
optional int64 create_start_time = 4;
optional int64 create_end_time = 5;
int64 page_size =6;
int64 page_index=7;
}
message ListUserInfoResp {
repeated UserInfo data = 1;
Pager page =2;
}
message VerifyAuthResultReq {
string token = 1;
}
message VerifyAuthResultResp {
bool status = 1;
}
message TwitterAccessTokenResp {
string token = 1;
}
service Account {
// CreateUserAccount ->
rpc CreateUserAccount(CreateLoginUserReq) returns(OKResp);
// GetUserAccountInfo
rpc GetUserAccountInfo(GetUIDByAccountReq) returns(GetAccountInfoResp);
// UpdateUserToken
rpc UpdateUserToken(UpdateTokenReq) returns(OKResp);
// GetUidByAccount UID
rpc GetUidByAccount(GetUIDByAccountReq) returns(GetUidByAccountResp);
// BindAccount -> account bind to UID
rpc BindAccount(BindingUserReq) returns(BindingUserResp);
// BindUserInfo User Info
rpc BindUserInfo(CreateUserInfoReq) returns(OKResp);
// UpdateUserInfo User Info
rpc UpdateUserInfo(UpdateUserInfoReq) returns(OKResp);
// UpdateStatus
rpc UpdateStatus(UpdateStatusReq) returns(OKResp);
// GetUserInfo
rpc GetUserInfo(GetUserInfoReq) returns(GetUserInfoResp);
// ListMember
rpc ListMember(ListUserInfoReq) returns(ListUserInfoResp);
// GenerateRefreshCode
rpc GenerateRefreshCode(GenerateRefreshCodeReq) returns(GenerateRefreshCodeResp);
// VerifyRefreshCode token
rpc VerifyRefreshCode(VerifyRefreshCodeReq) returns(OKResp);
// VerifyGoogleAuthResult google
rpc VerifyGoogleAuthResult(VerifyAuthResultReq)returns(VerifyAuthResultResp);
}
// ================ account ================