From a56fe30f83f627474b88d74b105cbb590d26f73f Mon Sep 17 00:00:00 2001 From: d3m0k1d Date: Tue, 3 Feb 2026 18:03:53 +0300 Subject: [PATCH] chore: add storage logger and handler in /int --- backend/Makefile | 6 ++- backend/cmd/main.go | 23 ++++++++--- backend/go.mod | 1 + backend/go.sum | 2 + backend/internal/handlers/post_handlers.go | 7 ++++ backend/internal/logger/logger.go | 45 ++++++++++++++++++++++ backend/internal/storage/db.go | 32 +++++++++++++++ backend/internal/storage/migrations.go | 10 +++++ backend/internal/storage/models.go | 8 ++++ 9 files changed, 128 insertions(+), 6 deletions(-) create mode 100644 backend/internal/handlers/post_handlers.go create mode 100644 backend/internal/logger/logger.go create mode 100644 backend/internal/storage/db.go create mode 100644 backend/internal/storage/migrations.go create mode 100644 backend/internal/storage/models.go diff --git a/backend/Makefile b/backend/Makefile index 1dca6ef..bd98eea 100644 --- a/backend/Makefile +++ b/backend/Makefile @@ -1,4 +1,4 @@ -.PHONY: test build clean lint +.PHONY: test build clean lint dev test: @@ -15,3 +15,7 @@ clean: lint: golangci-lint run --fix + +dev: + swag init -g ./cmd/main.go --parseDependency --parseInternal + go run ./cmd/main.go diff --git a/backend/cmd/main.go b/backend/cmd/main.go index 2b18496..205b15b 100644 --- a/backend/cmd/main.go +++ b/backend/cmd/main.go @@ -1,18 +1,31 @@ package main import ( - docs "gitea.d3m0k1d.ru/d3m0k1d/d3m0k1d.ru/backend/docs" + "gitea.d3m0k1d.ru/d3m0k1d/d3m0k1d.ru/backend/docs" + _ "gitea.d3m0k1d.ru/d3m0k1d/d3m0k1d.ru/backend/internal/handlers" + "gitea.d3m0k1d.ru/d3m0k1d/d3m0k1d.ru/backend/internal/logger" "github.com/gin-gonic/gin" + swaggerFiles "github.com/swaggo/files" + ginSwagger "github.com/swaggo/gin-swagger" ) func main() { + log := logger.New(false) + router := gin.Default() + + // Swagger config docs.SwaggerInfo.BasePath = "/api/v1" - docs.SwaggerInfo.Title = "d3m0k1d.ru" + docs.SwaggerInfo.Title = "d3m0k1d.ru API" docs.SwaggerInfo.Version = "1.0" - err := router.Run() - if err != nil { + docs.SwaggerInfo.Description = "API for d3m0k1d.ru" + docs.SwaggerInfo.Host = "d3m0k1d.ru" + docs.SwaggerInfo.Schemes = []string{"https"} + router.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) + + log.Info("Starting server on :8080...") + if err := router.Run(":8080"); err != nil { + log.Error("Error starting server: " + err.Error()) panic(err) } - } diff --git a/backend/go.mod b/backend/go.mod index 170543c..4e7eb31 100644 --- a/backend/go.mod +++ b/backend/go.mod @@ -62,6 +62,7 @@ require ( golang.org/x/text v0.33.0 // indirect golang.org/x/tools v0.41.0 // indirect google.golang.org/protobuf v1.36.11 // indirect + gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect modernc.org/libc v1.67.6 // indirect diff --git a/backend/go.sum b/backend/go.sum index 440ec09..da97b44 100644 --- a/backend/go.sum +++ b/backend/go.sum @@ -169,6 +169,8 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= +gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/backend/internal/handlers/post_handlers.go b/backend/internal/handlers/post_handlers.go new file mode 100644 index 0000000..b698e2f --- /dev/null +++ b/backend/internal/handlers/post_handlers.go @@ -0,0 +1,7 @@ +package handlers + +import ( + "gitea.d3m0k1d.ru/d3m0k1d/d3m0k1d.ru/backend/internal/logger" +) + +var log = logger.New(false) diff --git a/backend/internal/logger/logger.go b/backend/internal/logger/logger.go new file mode 100644 index 0000000..ffa8233 --- /dev/null +++ b/backend/internal/logger/logger.go @@ -0,0 +1,45 @@ +package logger + +import ( + "io" + "log/slog" + "os" + "path/filepath" + + "gopkg.in/natefinch/lumberjack.v2" +) + +type Logger struct { + *slog.Logger +} + +func New(debug bool) *Logger { + logDir := "/var/log/banforge" + if err := os.MkdirAll(logDir, 0750); err != nil { + return nil + } + + fileWriter := &lumberjack.Logger{ + Filename: filepath.Join(logDir, "banforge.log"), + MaxSize: 500, + MaxBackups: 3, + MaxAge: 28, + Compress: true, + } + + var level slog.Level + if debug { + level = slog.LevelDebug + } else { + level = slog.LevelInfo + } + multiWriter := io.MultiWriter(fileWriter, os.Stdout) + + handler := slog.NewTextHandler(multiWriter, &slog.HandlerOptions{ + Level: level, + }) + + return &Logger{ + Logger: slog.New(handler), + } +} diff --git a/backend/internal/storage/db.go b/backend/internal/storage/db.go new file mode 100644 index 0000000..e982f4a --- /dev/null +++ b/backend/internal/storage/db.go @@ -0,0 +1,32 @@ +package storage + +import ( + "database/sql" + "gitea.d3m0k1d.ru/d3m0k1d/d3m0k1d.ru/backend/internal/logger" + _ "modernc.org/sqlite" + "os" +) + +var db_path = os.Getenv("DB_PATH") + +func CreateTables() error { + logger := logger.New(false) + db, err := sql.Open("sqlite", db_path) + if err != nil { + logger.Error(err.Error()) + return err + } + _, err = db.Exec(Migrations) + if err != nil { + logger.Error(err.Error()) + return err + } + + defer func() { + err = db.Close() + if err != nil { + logger.Error(err.Error()) + } + }() + return nil +} diff --git a/backend/internal/storage/migrations.go b/backend/internal/storage/migrations.go new file mode 100644 index 0000000..288f888 --- /dev/null +++ b/backend/internal/storage/migrations.go @@ -0,0 +1,10 @@ +package storage + +const Migrations = ` +CREATE TABLE IF NOT EXISTS posts( + id INTEGER PRIMARY KEY AUTOINCREMENT + title TEXT NOT NULL + content TEXT NOT NULL + CREATED_AT DATETIME DEFAULT CURRENT_TIMESTAMP + ); +` diff --git a/backend/internal/storage/models.go b/backend/internal/storage/models.go new file mode 100644 index 0000000..ab6b536 --- /dev/null +++ b/backend/internal/storage/models.go @@ -0,0 +1,8 @@ +package storage + +type Post struct { + ID int `db:"id"` + Title string `db:"title"` + Content string `db:"content"` + CreatedAt string `db:"created_at"` +}