diff --git a/internal/app/app_verification.go b/internal/app/app_verification.go index 9f5d5dd..850dc31 100644 --- a/internal/app/app_verification.go +++ b/internal/app/app_verification.go @@ -99,7 +99,7 @@ func Run(cfg *config.Config, build Build) { adminSrv := server.NewHTTP(server.ServerConfig{ Logger: logger, - Controllers: []server.Controller{cons.VerificationAdmin}, + Controllers: []server.Controller{cons.VerificationAdmin, cons.HealthCheck}, HLogger: loggerHlog, }) diff --git a/internal/controllers/admin/health_check/health_check.go b/internal/controllers/admin/health_check/health_check.go index 7af4c0d..04e7830 100644 --- a/internal/controllers/admin/health_check/health_check.go +++ b/internal/controllers/admin/health_check/health_check.go @@ -1,33 +1,25 @@ package health_check import ( - "context" - "fmt" "gitea.pena/PenaSide/verification/internal/client" "gitea.pena/PenaSide/verification/internal/repository" "github.com/gofiber/fiber/v2" - "github.com/minio/minio-go/v7" - "go.mongodb.org/mongo-driver/mongo" - "time" ) type Deps struct { - TgClient *client.Telegram - MongoDB *mongo.Client - S3Client *minio.Client + TgClient *client.Telegram + Repository *repository.VerificationRepository } type HealthCheck struct { - tgClient *client.Telegram - mongoDB *mongo.Client - s3Client *minio.Client + tgClient *client.Telegram + repository *repository.VerificationRepository } func NewHealthCheck(deps Deps) *HealthCheck { return &HealthCheck{ - tgClient: deps.TgClient, - mongoDB: deps.MongoDB, - s3Client: deps.S3Client, + tgClient: deps.TgClient, + repository: deps.Repository, } } @@ -36,7 +28,7 @@ func (receiver *HealthCheck) Liveness(ctx *fiber.Ctx) error { } func (receiver *HealthCheck) Readiness(ctx *fiber.Ctx) error { - if err := receiver.checkMongoDB(); err != nil { + if err := receiver.repository.CheckMongoDB(); err != nil { return ctx.Status(fiber.StatusServiceUnavailable).SendString("mongoDB is unavailable: " + err.Error()) } @@ -44,37 +36,9 @@ func (receiver *HealthCheck) Readiness(ctx *fiber.Ctx) error { return ctx.Status(fiber.StatusServiceUnavailable).SendString("could not connect to Telegram: " + err.Error()) } - if err := receiver.checkS3(); err != nil { + if err := receiver.repository.CheckS3(); err != nil { return ctx.Status(fiber.StatusServiceUnavailable).SendString("could not connect to S3: " + err.Error()) } return ctx.SendStatus(fiber.StatusOK) } - -func (receiver *HealthCheck) checkMongoDB() error { - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) - defer cancel() - - if err := receiver.mongoDB.Ping(ctx, nil); err != nil { - return fmt.Errorf("failed to ping MongoDB: %v", err) - } - return nil -} - -func (receiver *HealthCheck) checkS3() error { - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) - defer cancel() - - buckets, err := receiver.s3Client.ListBuckets(ctx) - if err != nil { - return fmt.Errorf("failed to list buckets: %v", err) - } - - for _, b := range buckets { - if b.Name == repository.VerificationBucket { - return nil - } - } - - return fmt.Errorf("failed to find verification bucket") -} diff --git a/internal/initialize/controllers.go b/internal/initialize/controllers.go index ef05aeb..2b16215 100644 --- a/internal/initialize/controllers.go +++ b/internal/initialize/controllers.go @@ -1,15 +1,17 @@ package initialize import ( + "gitea.pena/PenaSide/customer/pkg/customer_clients" "gitea.pena/PenaSide/verification/internal/client" "gitea.pena/PenaSide/verification/internal/controllers/admin" + "gitea.pena/PenaSide/verification/internal/controllers/admin/health_check" "gitea.pena/PenaSide/verification/internal/controllers/user" - "gitea.pena/PenaSide/customer/pkg/customer_clients" ) type Controllers struct { VerificationAdmin *admin.VerifyAdminController VerificationUser *user.VerifyUserController + HealthCheck *health_check.HealthCheck } func NewControllers(reps *Repositories, telegram *client.Telegram, customer *customer_clients.CustomersClient) *Controllers { @@ -22,5 +24,9 @@ func NewControllers(reps *Repositories, telegram *client.Telegram, customer *cus Repository: reps.Verification, Telegram: telegram, }), + HealthCheck: health_check.NewHealthCheck(health_check.Deps{ + TgClient: telegram, + Repository: reps.Verification, + }), } } diff --git a/internal/repository/verification.go b/internal/repository/verification.go index 644fd51..d2d3657 100644 --- a/internal/repository/verification.go +++ b/internal/repository/verification.go @@ -5,16 +5,16 @@ import ( "errors" "fmt" "mime/multipart" - "time" "strings" + "time" + "gitea.pena/PenaSide/verification/internal/models" "github.com/minio/minio-go/v7" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" "go.uber.org/zap" - "gitea.pena/PenaSide/verification/internal/models" ) type VerificationRepository struct { @@ -195,17 +195,17 @@ func (r *VerificationRepository) UpdateFile(ctx context.Context, userID, fileNam return nil, err } - fileURL := fmt.Sprintf("%s/%s/%s/%s", r.url, r.folder, userID, fileHeader.Filename) + fileURL := fmt.Sprintf("%s/%s/%s/%s", r.url, r.folder, userID, fileHeader.Filename) // remove old file verification, err := r.GetByUserID(ctx, userID) if r.err(err) { return nil, err } - - if verification == nil { - return nil, fmt.Errorf("no verification found") - } + + if verification == nil { + return nil, fmt.Errorf("no verification found") + } found := false for iterator, file := range verification.Files { @@ -228,7 +228,6 @@ func (r *VerificationRepository) UpdateFile(ctx context.Context, userID, fileNam // update in mongodb - result, err := r.Update(ctx, &models.Verification{ID: verification.ID, Files: verification.Files}) if r.err(err) { return nil, err @@ -244,3 +243,31 @@ func (r *VerificationRepository) err(err error) bool { } return false } + +func (r *VerificationRepository) CheckMongoDB() error { + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + if err := r.mongo.Database().Client().Ping(ctx, nil); err != nil { + return fmt.Errorf("failed to ping MongoDB: %v", err) + } + return nil +} + +func (r *VerificationRepository) CheckS3() error { + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + buckets, err := r.s3.ListBuckets(ctx) + if err != nil { + return fmt.Errorf("failed to list buckets: %v", err) + } + + for _, b := range buckets { + if b.Name == VerificationBucket { + return nil + } + } + + return fmt.Errorf("failed to find verification bucket") +}