Add CMS Management Functionality
- Introduced a new CMS management feature, including the ability to create, retrieve, update, search, and delete CMS entries. - Implemented the CMS entity, repository, service, and handler layers following Clean Architecture principles. - Added API endpoints for CMS operations in Swagger documentation, ensuring comprehensive API specifications. - Enhanced error handling and validation for CMS data, improving robustness and user experience. - Updated the main application to initialize the CMS repository and service, integrating them into the existing system.
This commit is contained in:
+21
-5
@@ -53,6 +53,12 @@ package main
|
||||
// @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 Admin-Contacts
|
||||
// @tag.description Administrative contact management operations for web panel including CRUD operations, search, statistics, and comprehensive filtering with pagination
|
||||
|
||||
// @tag.name Admin-CMS
|
||||
// @tag.description Administrative CMS management operations for web panel including CRUD operations, search, statistics, 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
|
||||
|
||||
@@ -77,12 +83,19 @@ package main
|
||||
// @tag.name Notification
|
||||
// @tag.description Public notification management operations for mobile application including notification listing and detailed notification information
|
||||
|
||||
// @tag.name Contacts
|
||||
// @tag.description Public contact management operations for mobile application including contact submission and contact listing
|
||||
|
||||
// @tag.name CMS
|
||||
// @tag.description Public CMS management operations for mobile application including CMS listing and detailed CMS information
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"time"
|
||||
"tm/internal/assets"
|
||||
"tm/internal/cms"
|
||||
"tm/internal/company"
|
||||
"tm/internal/company_category"
|
||||
"tm/internal/contact"
|
||||
@@ -144,8 +157,9 @@ func main() {
|
||||
tenderApprovalRepository := tender_approval.NewRepository(mongoManager, logger)
|
||||
inquiryRepository := inquiry.NewRepository(mongoManager, logger)
|
||||
contactRepository := contact.NewContactRepository(mongoManager, logger)
|
||||
cmsRepository := cms.NewRepository(mongoManager, logger)
|
||||
logger.Info("Repositories initialized successfully", map[string]interface{}{
|
||||
"repositories": []string{"customer", "user", "company", "category", "tender", "feedback", "tender_approval", "inquiry", "contact"},
|
||||
"repositories": []string{"customer", "user", "company", "category", "tender", "feedback", "tender_approval", "inquiry", "contact", "cms"},
|
||||
})
|
||||
|
||||
// Initialize validation services
|
||||
@@ -164,8 +178,9 @@ func main() {
|
||||
flagService := assets.NewService(logger, conf.Assets.FlagsPath)
|
||||
notificationService := notification.NewService(notificationSDK, userService, customerService, logger)
|
||||
contactService := contact.NewService(contactRepository, logger)
|
||||
cmsService := cms.NewService(cmsRepository, logger)
|
||||
logger.Info("Services initialized successfully", map[string]interface{}{
|
||||
"services": []string{"customer", "user", "company", "category", "tender", "feedback", "tender_approval", "inquiry", "flag", "notification", "contact"},
|
||||
"services": []string{"customer", "user", "company", "category", "tender", "feedback", "tender_approval", "inquiry", "flag", "notification", "contact", "cms"},
|
||||
})
|
||||
|
||||
// Initialize handlers with services
|
||||
@@ -180,16 +195,17 @@ func main() {
|
||||
flagHandler := assets.NewHandler(flagService, logger)
|
||||
notificationHandler := notification.NewHandler(notificationService)
|
||||
contactHandler := contact.NewHandler(contactService)
|
||||
cmsHandler := cms.NewHandler(cmsService)
|
||||
logger.Info("Handlers initialized successfully", map[string]interface{}{
|
||||
"handlers": []string{"customer", "user", "company", "category", "tender", "feedback", "tender_approval", "inquiry", "flag", "notification", "contact"},
|
||||
"handlers": []string{"customer", "user", "company", "category", "tender", "feedback", "tender_approval", "inquiry", "flag", "notification", "contact", "cms"},
|
||||
})
|
||||
|
||||
// Initialize HTTP server
|
||||
e := bootstrap.InitHTTPServer(conf, logger)
|
||||
|
||||
// Register routes
|
||||
router.RegisterAdminRoutes(e, userHandler, companyHandler, customerHandler, tenderHandler, feedbackHandler, tenderApprovalHandler, inquiryHandler, categoryHandler, flagHandler, notificationHandler, contactHandler)
|
||||
router.RegisterPublicRoutes(e, customerHandler, tenderHandler, feedbackHandler, tenderApprovalHandler, companyHandler, inquiryHandler, categoryHandler, flagHandler, notificationHandler, contactHandler)
|
||||
router.RegisterAdminRoutes(e, userHandler, companyHandler, customerHandler, tenderHandler, feedbackHandler, tenderApprovalHandler, inquiryHandler, categoryHandler, flagHandler, notificationHandler, contactHandler, cmsHandler)
|
||||
router.RegisterPublicRoutes(e, customerHandler, tenderHandler, feedbackHandler, tenderApprovalHandler, companyHandler, inquiryHandler, categoryHandler, flagHandler, notificationHandler, contactHandler, cmsHandler)
|
||||
|
||||
// Start server
|
||||
serverAddr := fmt.Sprintf("%s:%d", conf.Server.Host, conf.Server.Port)
|
||||
|
||||
@@ -2,8 +2,10 @@ package router
|
||||
|
||||
import (
|
||||
"tm/internal/assets"
|
||||
"tm/internal/cms"
|
||||
"tm/internal/company"
|
||||
"tm/internal/company_category"
|
||||
"tm/internal/contact"
|
||||
"tm/internal/customer"
|
||||
"tm/internal/feedback"
|
||||
"tm/internal/inquiry"
|
||||
@@ -15,7 +17,7 @@ import (
|
||||
"github.com/labstack/echo/v4"
|
||||
)
|
||||
|
||||
func RegisterAdminRoutes(e *echo.Echo, userHandler *user.Handler, companyHandler *company.Handler, customerHandler *customer.Handler, tenderHandler *tender.TenderHandler, feedbackHandler *feedback.Handler, tenderApprovalHandler *tender_approval.Handler, inquiryHandler *inquiry.Handler, categoryHandler *company_category.Handler, flagHandler *assets.Handler, notificationHandler *notification.NotificationHandler) {
|
||||
func RegisterAdminRoutes(e *echo.Echo, userHandler *user.Handler, companyHandler *company.Handler, customerHandler *customer.Handler, tenderHandler *tender.TenderHandler, feedbackHandler *feedback.Handler, tenderApprovalHandler *tender_approval.Handler, inquiryHandler *inquiry.Handler, categoryHandler *company_category.Handler, flagHandler *assets.Handler, notificationHandler *notification.NotificationHandler, contactHandler *contact.Handler, cmsHandler *cms.Handler) {
|
||||
adminV1 := e.Group("/admin/v1")
|
||||
|
||||
// Admin Users Routes
|
||||
@@ -141,9 +143,31 @@ func RegisterAdminRoutes(e *echo.Echo, userHandler *user.Handler, companyHandler
|
||||
notificationsGP.GET("/mark-seen/:id", notificationHandler.MarkSeen)
|
||||
notificationsGP.GET("/my", notificationHandler.AdminNotifications)
|
||||
}
|
||||
|
||||
// Admin Contact Routes
|
||||
contactsGP := adminV1.Group("/contacts")
|
||||
{
|
||||
contactsGP.Use(userHandler.AuthMiddleware())
|
||||
contactsGP.GET("", contactHandler.Search)
|
||||
contactsGP.GET("/stats", contactHandler.GetStats)
|
||||
contactsGP.GET("/:id", contactHandler.GetByID)
|
||||
contactsGP.PUT("/:id/status", contactHandler.UpdateStatus)
|
||||
contactsGP.DELETE("/:id", contactHandler.Delete)
|
||||
}
|
||||
|
||||
// Admin CMS Routes
|
||||
cmsGP := adminV1.Group("/cms")
|
||||
{
|
||||
// cmsGP.Use(userHandler.AuthMiddleware())
|
||||
cmsGP.POST("", cmsHandler.Create)
|
||||
cmsGP.GET("", cmsHandler.Search)
|
||||
cmsGP.GET("/:id", cmsHandler.GetByID)
|
||||
cmsGP.PUT("/:id", cmsHandler.Update)
|
||||
cmsGP.DELETE("/:id", cmsHandler.Delete)
|
||||
}
|
||||
}
|
||||
|
||||
func RegisterPublicRoutes(e *echo.Echo, customerHandler *customer.Handler, tenderHandler *tender.TenderHandler, feedbackHandler *feedback.Handler, tenderApprovalHandler *tender_approval.Handler, companyHandler *company.Handler, inquiryHandler *inquiry.Handler, categoryHandler *company_category.Handler, flagHandler *assets.Handler, notificationHandler *notification.NotificationHandler) {
|
||||
func RegisterPublicRoutes(e *echo.Echo, customerHandler *customer.Handler, tenderHandler *tender.TenderHandler, feedbackHandler *feedback.Handler, tenderApprovalHandler *tender_approval.Handler, companyHandler *company.Handler, inquiryHandler *inquiry.Handler, categoryHandler *company_category.Handler, flagHandler *assets.Handler, notificationHandler *notification.NotificationHandler, contactHandler *contact.Handler, cmsHandler *cms.Handler) {
|
||||
v1 := e.Group("/api/v1")
|
||||
|
||||
customerGP := v1.Group("/profile")
|
||||
@@ -221,4 +245,16 @@ func RegisterPublicRoutes(e *echo.Echo, customerHandler *customer.Handler, tende
|
||||
notificationsGP.GET("/mark", notificationHandler.PublicAllMarkSeen)
|
||||
notificationsGP.GET("/mark/:id", notificationHandler.PublicMarkSeen)
|
||||
}
|
||||
|
||||
// Public Contact Routes
|
||||
contactsPublicGP := v1.Group("/contacts")
|
||||
{
|
||||
contactsPublicGP.POST("", contactHandler.Create)
|
||||
}
|
||||
|
||||
// Public CMS Routes
|
||||
cmsGP := v1.Group("/cms")
|
||||
{
|
||||
cmsGP.GET("/:key", cmsHandler.GetByKey)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user