a342da193e
- Updated feedback repository and service methods to use a consistent naming convention, changing `NewTenderRepository` and similar methods to `NewRepository`. - Refactored feedback handler methods to improve clarity by renaming methods such as `ListFeedback` to `Search` and `GetFeedback` to `Get`. - Enhanced feedback response structures to include detailed company and tender information, improving the clarity of feedback data returned to API consumers. - Updated Swagger documentation to reflect changes in feedback response structures and endpoint paths, ensuring accurate representation of the API for consumers.
209 lines
9.9 KiB
Go
209 lines
9.9 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 service
|
|
userValidator := user.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)
|
|
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)
|
|
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))
|
|
}
|
|
}
|