From ae4bde279e003e27d5bdb43a15fbf19cafee7e42 Mon Sep 17 00:00:00 2001 From: azuki774s Date: Tue, 17 Sep 2024 01:36:01 +0900 Subject: [PATCH 1/3] fix: no install-go with staticcheck --- .github/workflows/go.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 3e99a26..3dc2fef 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -26,6 +26,7 @@ jobs: uses: dominikh/staticcheck-action@v1.2.0 with: version: "2022.1" + install-go: false - name: Test run: go test -v ./... From fcaf8c39ae929d0cb97d30122cd12605c3a868c9 Mon Sep 17 00:00:00 2001 From: azuki774s Date: Tue, 17 Sep 2024 01:40:09 +0900 Subject: [PATCH 2/3] remove register image --- .github/workflows/go.yml | 2 +- .github/workflows/publish.yml | 45 ----------- build/Dockerfile-register | 23 ------ cmd/mawinter-register/fixmonth.go | 70 ---------------- cmd/mawinter-register/main.go | 5 -- cmd/mawinter-register/root.go | 38 --------- internal/factory/default.go | 5 -- internal/register/mock.go | 70 ---------------- internal/register/service.go | 79 ------------------- internal/register/service_test.go | 70 ---------------- .../v2/{db_register.go => db_fixregister.go} | 3 +- 11 files changed, 2 insertions(+), 408 deletions(-) delete mode 100644 build/Dockerfile-register delete mode 100644 cmd/mawinter-register/fixmonth.go delete mode 100644 cmd/mawinter-register/main.go delete mode 100644 cmd/mawinter-register/root.go delete mode 100644 internal/register/mock.go delete mode 100644 internal/register/service.go delete mode 100644 internal/register/service_test.go rename internal/repository/v2/{db_register.go => db_fixregister.go} (94%) diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 3dc2fef..ce42bc5 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -25,7 +25,7 @@ jobs: - name: Run Lint staticcheck uses: dominikh/staticcheck-action@v1.2.0 with: - version: "2022.1" + version: "latest" install-go: false - name: Test diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index e53f2a9..a5b2380 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -50,48 +50,3 @@ jobs: push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} - - build_and_push_register: - runs-on: ubuntu-latest - - steps: - - name: checkout - uses: actions/checkout@v3 - - - name: Set meta - id: meta - uses: docker/metadata-action@v4 - with: - # list of Docker images to use as base name for tags - images: | - ghcr.io/azuki774/mawinter-register - # generate Docker tags based on the following events/attributes - tags: | - type=semver,pattern={{version}} - type=semver,pattern={{major}}.{{minor}} - type=semver,pattern={{major}} - type=semver,pattern=latest - - - name: Set up QEMU - uses: docker/setup-qemu-action@v2 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 - - - name: Login to GitHub Container Registry - uses: docker/login-action@v2 - with: - registry: ghcr.io - username: ${{ github.repository_owner }} - password: ${{ secrets.GH_ACCESS_TOKEN }} - - - name: Docker Build and push - uses: docker/build-push-action@v2 - with: - context: . - builder: ${{ steps.buildx.outputs.name }} - platforms: linux/amd64 # ,linux/arm64 - file: ./build/Dockerfile-register - push: true - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} diff --git a/build/Dockerfile-register b/build/Dockerfile-register deleted file mode 100644 index 8eaca8c..0000000 --- a/build/Dockerfile-register +++ /dev/null @@ -1,23 +0,0 @@ -# syntax=docker/dockerfile:1 - -FROM golang:1.23 AS builder -LABEL description="mawinter-register scripts" - -WORKDIR /app - -RUN --mount=type=cache,target=/go/pkg/mod/ \ - --mount=type=bind,source=go.mod,target=go.mod \ - --mount=type=bind,target=. \ - go mod download -x - -RUN --mount=type=bind,target=. \ - go build -a -tags "netgo" -installsuffix netgo -ldflags="-s -w -extldflags \"-static\" \ - -X main.version=$(git describe --tag --abbrev=0) \ - -X main.revision=$(git rev-list -1 HEAD) \ - -X main.build=$(git describe --tags)" \ - -o /bin/ ./... - -FROM gcr.io/distroless/base-debian12 -ENV TZ=Asia/Tokyo -COPY --from=builder /bin/mawinter-register /usr/local/bin/mawinter-register -ENTRYPOINT ["/usr/local/bin/mawinter-register"] diff --git a/cmd/mawinter-register/fixmonth.go b/cmd/mawinter-register/fixmonth.go deleted file mode 100644 index 1ece64f..0000000 --- a/cmd/mawinter-register/fixmonth.go +++ /dev/null @@ -1,70 +0,0 @@ -package main - -import ( - "context" - "fmt" - "mawinter-server/internal/factory" - "time" - - "github.com/spf13/cobra" - "go.uber.org/zap" -) - -type fixMonthlyOption struct { - Logger *zap.Logger - DBInfo struct { - Host string - Port string - User string - Pass string - Name string - } -} - -var fixMonthlyOpt fixMonthlyOption - -// fixMonthlyOptCmd represents the start command -var fixMonthlyOptCmd = &cobra.Command{ - Use: "fixmonth", - Short: "A brief description of your command", - Long: `A longer description that spans multiple lines and likely contains examples -and usage of using your command. For example: - -Cobra is a CLI library for Go that empowers applications. -This application is a tool to generate the needed files -to quickly create a Cobra application.`, - SilenceErrors: true, - SilenceUsage: true, - RunE: func(cmd *cobra.Command, args []string) error { - return startFixMonthly() - }, -} - -func startFixMonthly() (err error) { - l, err := factory.NewLogger() - if err != nil { - fmt.Println(err) - return err - } - defer l.Sync() - db, err := factory.NewDBRepositoryV1(fixMonthlyOpt.DBInfo.Host, fixMonthlyOpt.DBInfo.Port, fixMonthlyOpt.DBInfo.User, fixMonthlyOpt.DBInfo.Pass, fixMonthlyOpt.DBInfo.Name) - if err != nil { - l.Error("failed to connect DB", zap.Error(err)) - return err - } - defer db.CloseDB() - mc := factory.NewMailClient() - ap := factory.NewRegisterService(l, db, mc) - ctx := context.Background() - return ap.InsertMonthlyFixBilling(ctx, time.Now().Local().Format("200601")) -} - -func init() { - rootCmd.AddCommand(fixMonthlyOptCmd) - fixMonthlyOptCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle") - fixMonthlyOptCmd.Flags().StringVar(&fixMonthlyOpt.DBInfo.Host, "db-host", "mawinter-db", "DB Host") - fixMonthlyOptCmd.Flags().StringVar(&fixMonthlyOpt.DBInfo.Port, "db-port", "3306", "DB Port") - fixMonthlyOptCmd.Flags().StringVar(&fixMonthlyOpt.DBInfo.Name, "db-name", "mawinter", "DB Name") - fixMonthlyOptCmd.Flags().StringVar(&fixMonthlyOpt.DBInfo.User, "db-user", "root", "DB User") - fixMonthlyOptCmd.Flags().StringVar(&fixMonthlyOpt.DBInfo.Pass, "db-pass", "password", "DB Pass") -} diff --git a/cmd/mawinter-register/main.go b/cmd/mawinter-register/main.go deleted file mode 100644 index 736ef31..0000000 --- a/cmd/mawinter-register/main.go +++ /dev/null @@ -1,5 +0,0 @@ -package main - -func main() { - Execute() -} diff --git a/cmd/mawinter-register/root.go b/cmd/mawinter-register/root.go deleted file mode 100644 index e353e6a..0000000 --- a/cmd/mawinter-register/root.go +++ /dev/null @@ -1,38 +0,0 @@ -package main - -import ( - "os" - - "github.com/spf13/cobra" -) - -// rootCmd represents the base command when called without any subcommands -var rootCmd = &cobra.Command{ - Use: "root", - Short: "A brief description of your application", - Long: `A longer description that spans multiple lines and likely contains -examples and usage of using your application. For example: -Cobra is a CLI library for Go that empowers applications. -This application is a tool to generate the needed files -to quickly create a Cobra application.`, -} - -// Execute adds all child commands to the root command and sets flags appropriately. -// This is called by main.main(). It only needs to happen once to the rootCmd. -func Execute() { - err := rootCmd.Execute() - if err != nil { - os.Exit(1) - } -} -func init() { - // Here you will define your flags and configuration settings. - // Cobra supports persistent flags, which, if defined here, - // will be global for your application. - - // rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.bill-manager.yaml)") - - // Cobra also supports local flags, which will only run - // when this action is called directly. - rootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle") -} diff --git a/internal/factory/default.go b/internal/factory/default.go index aa0a2f9..09ceb02 100644 --- a/internal/factory/default.go +++ b/internal/factory/default.go @@ -4,7 +4,6 @@ import ( "fmt" v2 "mawinter-server/internal/api/v2" "mawinter-server/internal/client" - "mawinter-server/internal/register" v2db "mawinter-server/internal/repository/v2" "mawinter-server/internal/server" "os" @@ -37,10 +36,6 @@ func NewServiceV2(l *zap.Logger, db *v2db.DBRepository) (ap *v2.APIService) { return &v2.APIService{Logger: l, Repo: db} } -func NewRegisterService(l *zap.Logger, db *v2db.DBRepository, mc *client.MailClient) (ap *register.RegisterService) { - return ®ister.RegisterService{Logger: l, DB: db, MailClient: mc} -} - func NewServer(l *zap.Logger, ap2 *v2.APIService) *server.Server { return &server.Server{Logger: l, Ap2: ap2, BasicAuth: struct { User string diff --git a/internal/register/mock.go b/internal/register/mock.go deleted file mode 100644 index bc18a27..0000000 --- a/internal/register/mock.go +++ /dev/null @@ -1,70 +0,0 @@ -package register - -import ( - "context" - "mawinter-server/internal/model" - "mawinter-server/internal/openapi" - "time" -) - -type mockRepo struct { - err error - monthlyFixDone bool - errGetMonthly error -} - -type mockMailClient struct { - err error -} - -func (m *mockRepo) InsertUniqueCatIDRecord(req openapi.Record) (res openapi.Record, err error) { - if m.err != nil { - return openapi.Record{}, m.err - } - - return openapi.Record{ - Id: 1, - CategoryId: 210, - Datetime: time.Now(), - From: "bill-manager-api", - Type: "", - Price: 1234, - }, nil -} - -func (m *mockRepo) GetMonthlyFixDone(yyyymm string) (flag bool, err error) { - if m.errGetMonthly != nil { - return false, m.errGetMonthly - } - return m.monthlyFixDone, nil -} - -func (m *mockRepo) GetMonthlyFixBilling() (fixBills []model.MonthlyFixBilling, err error) { - if m.errGetMonthly != nil { - return []model.MonthlyFixBilling{}, m.errGetMonthly - } - return []model.MonthlyFixBilling{ - { - CategoryID: 100, - Day: 2, - Type: "type1", - Memo: "memo1", - }, - { - CategoryID: 101, - Day: 4, - Type: "type2", - Memo: "memo2", - }, - }, nil -} -func (m *mockRepo) InsertMonthlyFixBilling(yyyymm string) (recs []openapi.Record, err error) { - return []openapi.Record{}, m.errGetMonthly -} - -func (m *mockMailClient) Send(ctx context.Context, to string, title string, body string) (err error) { - if m.err != nil { - return m.err - } - return nil -} diff --git a/internal/register/service.go b/internal/register/service.go deleted file mode 100644 index b1cfdb4..0000000 --- a/internal/register/service.go +++ /dev/null @@ -1,79 +0,0 @@ -package register - -import ( - "context" - "errors" - "mawinter-server/internal/model" - "mawinter-server/internal/openapi" - "os" - - "go.uber.org/zap" -) - -var ( - ErrAlreadyRegisted = errors.New("already registed") -) - -type DBRepository interface { - InsertUniqueCatIDRecord(req openapi.Record) (res openapi.Record, err error) - GetMonthlyFixDone(yyyymm string) (flag bool, err error) - GetMonthlyFixBilling() (fixBills []model.MonthlyFixBilling, err error) - InsertMonthlyFixBilling(yyyymm string) (recs []openapi.Record, err error) -} - -type MailClient interface { - Send(ctx context.Context, to string, title string, body string) (err error) -} -type RegisterService struct { - Logger *zap.Logger - DB DBRepository - MailClient MailClient -} - -// InsertMonthlyFixBilling は 固定費を登録する -func (r *RegisterService) InsertMonthlyFixBilling(ctx context.Context, yyyymm string) (err error) { - // すでに処理済なら skip - done, err := r.DB.GetMonthlyFixDone(yyyymm) - if err != nil { - r.Logger.Error("failed to get done status", zap.Error(err)) - return err - } - - if done { - r.Logger.Warn("this month is processed") - return model.ErrAlreadyRecorded - } - lg := r.Logger.With(zap.String("yyyymm", yyyymm)) - - // Insert - recs, err := r.DB.InsertMonthlyFixBilling(yyyymm) - if err != nil { - lg.Error("failed to insert fix billing records", zap.Error(err)) - return err - } - - lg.Info("insert fix billing records to DB") - - // 環境変数 MAIL_TO に何か入ったときのみ通知メールを送信する。 - if os.Getenv("MAIL_TO") != "" { - err = notifyMailInsertMonthlyFixBilling(ctx, r.MailClient, recs) - if err != nil { - // send error - r.Logger.Error("notify mail send error", zap.Error(err)) - return err - } - r.Logger.Info("send notify mail", zap.String("mail_address", os.Getenv("MAIL_TO"))) - } else { - r.Logger.Info("MAIL_TO is not set. sending a notify mail skipped.") - } - - return nil -} - -func notifyMailInsertMonthlyFixBilling(ctx context.Context, MailClient MailClient, recs []openapi.Record) (err error) { - to := os.Getenv("MAIL_TO") - title := "[Mawinter] 月次固定費の登録完了" - body := model.NewMailMonthlyFixBilling(recs) - - return MailClient.Send(ctx, to, title, body) -} diff --git a/internal/register/service_test.go b/internal/register/service_test.go deleted file mode 100644 index a6f92c5..0000000 --- a/internal/register/service_test.go +++ /dev/null @@ -1,70 +0,0 @@ -package register - -import ( - "context" - "fmt" - "testing" - "time" - - "go.uber.org/zap" - "go.uber.org/zap/zapcore" -) - -var l *zap.Logger - -func init() { - config := zap.NewProductionConfig() - // config.Level = zap.NewAtomicLevelAt(zap.DebugLevel) - config.EncoderConfig.EncodeTime = JSTTimeEncoder - l, _ = config.Build() - - l.WithOptions(zap.AddStacktrace(zap.ErrorLevel)) -} - -func JSTTimeEncoder(t time.Time, enc zapcore.PrimitiveArrayEncoder) { - const layout = "2006-01-02T15:04:05+09:00" - jst := time.FixedZone("Asia/Tokyo", 9*60*60) - enc.AppendString(t.In(jst).Format(layout)) -} - -func TestAPIService_InsertMonthlyFixBilling(t *testing.T) { - type fields struct { - Logger *zap.Logger - DB DBRepository - MailClient MailClient - } - type args struct { - ctx context.Context - yyyymm string - } - tests := []struct { - name string - fields fields - args args - wantErr bool - }{ - { - name: "ok", - fields: fields{Logger: l, DB: &mockRepo{}, MailClient: &mockMailClient{}}, - args: args{ctx: context.Background(), yyyymm: "202201"}, - wantErr: false, - }, - { - name: "error", - fields: fields{Logger: l, DB: &mockRepo{errGetMonthly: fmt.Errorf("error")}, MailClient: &mockMailClient{}}, - args: args{ctx: context.Background(), yyyymm: "202201"}, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - a := &RegisterService{ - Logger: tt.fields.Logger, - DB: tt.fields.DB, - } - if err := a.InsertMonthlyFixBilling(tt.args.ctx, tt.args.yyyymm); (err != nil) != tt.wantErr { - t.Errorf("APIService.InsertMonthlyFixBilling() error = %v, wantErr %v", err, tt.wantErr) - } - }) - } -} diff --git a/internal/repository/v2/db_register.go b/internal/repository/v2/db_fixregister.go similarity index 94% rename from internal/repository/v2/db_register.go rename to internal/repository/v2/db_fixregister.go index 534c4ce..ca30423 100644 --- a/internal/repository/v2/db_register.go +++ b/internal/repository/v2/db_fixregister.go @@ -4,7 +4,6 @@ import ( "errors" "mawinter-server/internal/model" "mawinter-server/internal/openapi" - "mawinter-server/internal/register" "gorm.io/gorm" ) @@ -25,7 +24,7 @@ func (d *DBRepository) InsertUniqueCatIDRecord(req openapi.Record) (res openapi. if err == nil { // already recorded - return openapi.Record{}, register.ErrAlreadyRegisted + return openapi.Record{}, model.ErrAlreadyRecorded } else if !errors.Is(err, gorm.ErrRecordNotFound) { // unknown error return openapi.Record{}, err From 389277ec6d392fd3b398f0bb5ccc559b35c240c7 Mon Sep 17 00:00:00 2001 From: azuki774s Date: Tue, 17 Sep 2024 02:03:27 +0900 Subject: [PATCH 3/3] update README.md --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index aee4322..7ff4c20 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,6 @@ ## API Information See https://azk774.stoplight.io/docs/azk-home-project/iayxih3222x5z-mawinter-api -## DB Schema -See https://azuki774.github.io/mawinter-server/build/README.htm + ## Coverage See https://azuki774.github.io/mawinter-server/coverage.html