939f940499
- Introduced a new ValidationService for customer operations to ensure valid username formats. - Updated customer service and handler to utilize the new validation service, enhancing input validation during registration and updates. - Modified CreateCustomerForm and UpdateCustomerForm to enforce username validation rules. - Adjusted repository indexing to improve search efficiency by refining the text index for customer data. - Ensured consistent handling of usernames across the customer module, improving overall data integrity and user experience.
210 lines
10 KiB
Go
210 lines
10 KiB
Go
package main
|
|
|
|
// @title Tender Management API
|
|
// @version 2.0.0
|
|
// @description This is a comprehensive API for the Tender Management System built with Clean Architecture principles and Domain-Driven Design (DDD) patterns. The API provides endpoints for user management, customer management, company management, and authentication for both web panel administration and mobile application access.
|
|
// @termsOfService https://tender-management.com/terms
|
|
|
|
// @contact.name Tender Management API Support
|
|
// @contact.url https://tender-management.com/support
|
|
// @contact.email api-support@tender-management.com
|
|
|
|
// @license.name MIT
|
|
// @license.url https://opensource.org/licenses/MIT
|
|
|
|
// @host localhost:8082
|
|
// @BasePath /
|
|
|
|
// @securityDefinitions.apikey BearerAuth
|
|
// @in header
|
|
// @name Authorization
|
|
// @description Type "Bearer" followed by a space and JWT token. Example: "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
|
|
|
|
// @tag.name Admin-Health
|
|
// @tag.description System health check operations for monitoring application status and dependencies
|
|
|
|
// @tag.name Admin-Authorization
|
|
// @tag.description User authentication and authorization operations including login, logout, token refresh, and password management for web panel administration
|
|
|
|
// @tag.name Admin-Users
|
|
// @tag.description Administrative user management operations including CRUD operations, role management, status updates, and profile management for web panel administrators
|
|
|
|
// @tag.name Admin-Customers
|
|
// @tag.description Administrative customer management operations for web panel including CRUD operations, company assignment, verification, status management, and comprehensive filtering with pagination
|
|
|
|
// @tag.name Admin-Companies
|
|
// @tag.description Administrative company management operations for web panel including CRUD operations, tag management, verification, status updates, comprehensive search and filtering, and statistical reporting
|
|
|
|
// @tag.name Admin-Company-Categories
|
|
// @tag.description Administrative company category management operations for web panel including CRUD operations, publish/unpublish status, and comprehensive filtering with pagination
|
|
|
|
// @tag.name Admin-Tenders
|
|
// @tag.description Administrative tender management operations for web panel including CRUD operations, search, statistics, and comprehensive filtering with pagination
|
|
|
|
// @tag.name Admin-Feedback
|
|
// @tag.description Administrative feedback management operations for web panel including CRUD operations, search, statistics, and comprehensive filtering with pagination
|
|
|
|
// @tag.name Admin-TenderApprovals
|
|
// @tag.description Administrative tender approval management operations for web panel including CRUD operations, search, statistics, and comprehensive filtering with pagination
|
|
|
|
// @tag.name Admin-Inquiries
|
|
// @tag.description Administrative inquiry management operations for web panel including CRUD operations, search, statistics, and comprehensive filtering with pagination
|
|
|
|
// @tag.name Admin-Flags
|
|
// @tag.description Administrative flag management operations for web panel including flag listing and retrieval
|
|
|
|
// @tag.name Admin-Notification
|
|
// @tag.description Administrative notification management operations for web panel including CRUD operations, bulk notifications, queue management, and comprehensive filtering with pagination
|
|
|
|
// @tag.name Authorization
|
|
// @tag.description Customer authentication and authorization operations for mobile application including login, logout, token refresh, and profile access
|
|
|
|
// @tag.name Company
|
|
// @tag.description Company information access for mobile application including company profile and company tenders
|
|
|
|
// @tag.name Tenders
|
|
// @tag.description Public tender information access for mobile application including active tender listings and detailed tender information
|
|
|
|
// @tag.name Feedback
|
|
// @tag.description Public feedback management operations for mobile application including like, dislike, and comment on tenders
|
|
|
|
// @tag.name TenderApprovals
|
|
// @tag.description Public tender approval management operations for mobile application including tender approval listing and detailed tender approval information
|
|
|
|
// @tag.name Inquiries
|
|
// @tag.description Public inquiry management operations for mobile application including inquiry submission and inquiry listing
|
|
|
|
// @tag.name Flags
|
|
// @tag.description Public flag management operations for mobile application including flag retrieval and listing
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"net/http"
|
|
"time"
|
|
"tm/internal/assets"
|
|
"tm/internal/company"
|
|
"tm/internal/company_category"
|
|
"tm/internal/customer"
|
|
"tm/internal/feedback"
|
|
"tm/internal/inquiry"
|
|
"tm/internal/notification"
|
|
"tm/internal/tender"
|
|
"tm/internal/tender_approval"
|
|
"tm/internal/user"
|
|
|
|
"tm/cmd/web/bootstrap"
|
|
_ "tm/cmd/web/docs" // This is generated by swag
|
|
"tm/cmd/web/router"
|
|
)
|
|
|
|
func main() {
|
|
conf := bootstrap.InitConfig()
|
|
|
|
logger := bootstrap.InitLogger(conf.Logging)
|
|
defer logger.Sync()
|
|
|
|
// Initialize MongoDB connection manager
|
|
mongoManager := bootstrap.InitMongoDB(conf.Database.MongoDB, logger)
|
|
defer func() {
|
|
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
|
defer cancel()
|
|
if err := mongoManager.Close(ctx); err != nil {
|
|
logger.Error("Failed to close MongoDB connection", map[string]interface{}{
|
|
"error": err.Error(),
|
|
})
|
|
}
|
|
}()
|
|
|
|
// Initialize Redis connection manager
|
|
redisClient := bootstrap.InitRedis(conf.Cache.Redis, logger)
|
|
defer func() {
|
|
if err := redisClient.Close(); err != nil {
|
|
logger.Error("Failed to close Redis connection", map[string]interface{}{
|
|
"error": err.Error(),
|
|
})
|
|
}
|
|
}()
|
|
|
|
// Initialize notification service
|
|
notificationSDK := bootstrap.InitNotificationService(conf.Notification, logger)
|
|
|
|
// Initialize authorization service
|
|
userAuthService := bootstrap.InitAuthorizationService(conf.UserAuth.JWT, redisClient, logger)
|
|
customerAuthService := bootstrap.InitAuthorizationService(conf.CustomerAuth.JWT, redisClient, logger)
|
|
|
|
// Initialize repositories with MongoDB connection manager
|
|
userRepository := user.NewRepository(mongoManager, logger)
|
|
customerRepository := customer.NewRepository(mongoManager, logger)
|
|
companyRepository := company.NewRepository(mongoManager, logger)
|
|
categoryRepository := company_category.NewRepository(mongoManager, logger)
|
|
tenderRepository := tender.NewRepository(mongoManager, logger)
|
|
feedbackRepo := feedback.NewRepository(mongoManager, logger)
|
|
tenderApprovalRepository := tender_approval.NewRepository(mongoManager, logger)
|
|
inquiryRepository := inquiry.NewRepository(mongoManager, logger)
|
|
logger.Info("Repositories initialized successfully", map[string]interface{}{
|
|
"repositories": []string{"customer", "user", "company", "category", "tender", "feedback", "tender_approval", "inquiry"},
|
|
})
|
|
|
|
// Initialize validation services
|
|
userValidator := user.NewValidationService()
|
|
customerValidator := customer.NewValidationService()
|
|
|
|
// Initialize services with repositories
|
|
userService := user.NewService(userRepository, logger, userAuthService, userValidator, notificationSDK)
|
|
categoryService := company_category.NewService(categoryRepository, logger)
|
|
companyService := company.NewService(companyRepository, categoryService, logger)
|
|
customerService := customer.NewService(customerRepository, logger, customerAuthService, companyService, redisClient, notificationSDK, customerValidator)
|
|
tenderService := tender.NewService(tenderRepository, companyService, logger)
|
|
feedbackService := feedback.NewService(feedbackRepo, tenderService, companyService, logger)
|
|
tenderApprovalService := tender_approval.NewService(tenderApprovalRepository, tenderService, logger)
|
|
inquiryService := inquiry.NewService(inquiryRepository, notificationSDK, logger)
|
|
flagService := assets.NewService(logger, conf.Assets.FlagsPath)
|
|
notificationService := notification.NewService(notificationSDK, userService, customerService, logger)
|
|
logger.Info("Services initialized successfully", map[string]interface{}{
|
|
"services": []string{"customer", "user", "company", "category", "tender", "feedback", "tender_approval", "inquiry", "flag", "notification"},
|
|
})
|
|
|
|
// Initialize handlers with services
|
|
userHandler := user.NewHandler(userService, logger, userValidator, userAuthService)
|
|
customerHandler := customer.NewHandler(customerService, userHandler, customerAuthService, logger, customerValidator)
|
|
companyHandler := company.NewHandler(companyService, userHandler, logger)
|
|
categoryHandler := company_category.NewHandler(categoryService, logger)
|
|
tenderHandler := tender.NewHandler(tenderService, logger)
|
|
feedbackHandler := feedback.NewHandler(feedbackService, userHandler, customerHandler, logger)
|
|
tenderApprovalHandler := tender_approval.NewHandler(tenderApprovalService, logger)
|
|
inquiryHandler := inquiry.NewHandler(inquiryService, logger)
|
|
flagHandler := assets.NewHandler(flagService, logger)
|
|
notificationHandler := notification.NewHandler(notificationService, logger)
|
|
logger.Info("Handlers initialized successfully", map[string]interface{}{
|
|
"handlers": []string{"customer", "user", "company", "category", "tender", "feedback", "tender_approval", "inquiry", "flag", "notification"},
|
|
})
|
|
|
|
// Initialize HTTP server
|
|
e := bootstrap.InitHTTPServer(conf, logger)
|
|
|
|
// Register routes
|
|
router.RegisterAdminRoutes(e, userHandler, companyHandler, customerHandler, tenderHandler, feedbackHandler, tenderApprovalHandler, inquiryHandler, categoryHandler, flagHandler, notificationHandler)
|
|
router.RegisterPublicRoutes(e, customerHandler, tenderHandler, feedbackHandler, tenderApprovalHandler, companyHandler, inquiryHandler, categoryHandler, flagHandler, notificationHandler)
|
|
|
|
// Start server
|
|
serverAddr := fmt.Sprintf("%s:%d", conf.Server.Host, conf.Server.Port)
|
|
logger.Info("HTTP server starting", map[string]interface{}{
|
|
"address": serverAddr,
|
|
"version": "1.0.0",
|
|
"host": conf.Server.Host,
|
|
"port": conf.Server.Port,
|
|
})
|
|
|
|
if err := e.Start(serverAddr); err != nil && err != http.ErrServerClosed {
|
|
logger.Error("Failed to start HTTP server", map[string]interface{}{
|
|
"error": err.Error(),
|
|
"address": serverAddr,
|
|
"version": "1.0.0",
|
|
"host": conf.Server.Host,
|
|
"port": conf.Server.Port,
|
|
})
|
|
panic(fmt.Sprintf("Failed to start HTTP server: %v", err))
|
|
}
|
|
}
|