Skip to content

Commit 37ff0d8

Browse files
Merge pull request #15 from one-project-one-month/ft/cms1-10
feat: added create page request and get page requests with pagination
2 parents 30d8d78 + 6cd0964 commit 37ff0d8

File tree

13 files changed

+424
-11
lines changed

13 files changed

+424
-11
lines changed

backend/cms-sys/cmd/main.go

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ type DISection struct {
2727
srv service.AuthService
2828
handler handler.AuthHandle
2929
ownerHandler handler.OwnerHandle
30+
pageRequestHandler handler.PageRequestHandle
3031
}
3132

3233
func main() {
@@ -63,7 +64,7 @@ func main() {
6364
appLogger.WithError(err).Fatal("Failed to initialize database connection")
6465
}
6566

66-
err := dbConnection.DB.AutoMigrate(&types.CMSWholeSysRole{}, &types.CMSUser{}, &types.CMSCusPurchase{}, &types.UserPageRequest{})
67+
err := dbConnection.DB.AutoMigrate(&types.CMSWholeSysRole{}, &types.CMSUser{}, &types.CMSCusPurchase{}, &types.UserPageRequest{}, &types.Page{}, &types.PageRequest{})
6768
if err != nil {
6869
appLogger.WithError(err).Fatal("Failed to migrate database")
6970
return
@@ -157,6 +158,7 @@ func main() {
157158
di := DependencyInjectionSection(appLogger, dbConnection.DB)
158159
routes.SetupRoutes(app, di.handler)
159160
routes.SetupOwnerRoutes(app, di.ownerHandler)
161+
routes.SetupPageRequestRoutes(app, di.pageRequestHandler)
160162

161163
port := utils.GetEnv("PORT", "8080")
162164

@@ -197,10 +199,16 @@ func DependencyInjectionSection(logger *logrus.Logger, db *gorm.DB) *DISection {
197199
ownerService := service.NewOwnerService(logger, ownerRepo, repo)
198200
ownerHandler := handler.NewOwnerHandler(ownerService)
199201

202+
// Page Request
203+
pageRequestRepo := repository.NewPageRequestRepository(logger, db)
204+
pageRequestSrv := service.NewPageRequestService(logger, pageRequestRepo)
205+
pageRequestHandler := handler.NewPageRequestHandler(pageRequestSrv)
206+
200207
return &DISection{
201-
repo: repo,
202-
srv: srv,
203-
handler: authHandler,
208+
repo: repo,
209+
srv: srv,
210+
handler: authHandler,
204211
ownerHandler: ownerHandler,
212+
pageRequestHandler: pageRequestHandler,
205213
}
206214
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package handler
2+
3+
import (
4+
"github.com/go-playground/validator/v10"
5+
"github.com/gofiber/fiber/v2"
6+
7+
"github.com/multi-tenants-cms-golang/cms-sys/internal/service"
8+
"github.com/multi-tenants-cms-golang/cms-sys/internal/types"
9+
"github.com/multi-tenants-cms-golang/cms-sys/pkg/utils"
10+
)
11+
12+
type PageRequestHandle interface {
13+
Create(c *fiber.Ctx) error
14+
GetAll(c *fiber.Ctx) error
15+
}
16+
17+
type PageRequestHandler struct {
18+
service service.PageRequestService
19+
validator *validator.Validate
20+
}
21+
22+
var _ PageRequestHandle = (*PageRequestHandler)(nil)
23+
24+
func NewPageRequestHandler(service service.PageRequestService) PageRequestHandle {
25+
return &PageRequestHandler{
26+
service: service,
27+
validator: validator.New(),
28+
}
29+
}
30+
31+
func (h *PageRequestHandler) Create(c *fiber.Ctx) error {
32+
var req types.CreatePageRequest
33+
if err := c.BodyParser(&req); err != nil {
34+
return utils.BadRequestResponse(c, "Invalid request body", err.Error())
35+
}
36+
37+
if err := h.validator.Struct(req); err != nil {
38+
return utils.BadRequestResponse(c, "Validation failed", err.Error())
39+
}
40+
41+
pageRequestResponse, err := h.service.CreatePageRequest(req)
42+
if err != nil {
43+
return utils.InternalServerErrorResponse(c, "Failed to create page request", err.Error())
44+
}
45+
46+
return utils.CreatedResponse(c, "Page request created", pageRequestResponse)
47+
}
48+
49+
func (h *PageRequestHandler) GetAll(c *fiber.Ctx) error {
50+
var req types.PaginateRequest
51+
if err := c.QueryParser(&req); err != nil {
52+
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
53+
"error": "Invalid query parameters",
54+
})
55+
}
56+
57+
if req.Page <= 0 {
58+
req.Page = 1
59+
}
60+
if req.Limit <= 0 {
61+
req.Limit = 10
62+
}
63+
64+
pageRequests, pagination, err := h.service.GetAllPageRequests(&req)
65+
if err != nil {
66+
return utils.InternalServerErrorResponse(c, "Failed to get page requests", err.Error())
67+
}
68+
69+
return utils.PaginatedSuccessResponse(c, "Page requests retrieved successfully", pageRequests, *pagination)
70+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package mapper
2+
3+
import (
4+
"github.com/multi-tenants-cms-golang/cms-sys/internal/types"
5+
"github.com/multi-tenants-cms-golang/cms-sys/pkg/utils"
6+
)
7+
8+
func ToPageRequestResponse(model *types.PageRequest) *types.PageRequestResponse {
9+
return &types.PageRequestResponse{
10+
ID: model.RequestID,
11+
OwnerID: model.OwnerID,
12+
RequestType: model.RequestType,
13+
Title: model.Title,
14+
Description: utils.SafeString(model.Description),
15+
PageUrl: model.PageUrl,
16+
LogoUrl: model.LogoUrl,
17+
CreatedAt: model.CreatedAt,
18+
}
19+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package repository
2+
3+
import (
4+
"github.com/multi-tenants-cms-golang/cms-sys/internal/types"
5+
"github.com/sirupsen/logrus"
6+
"gorm.io/gorm"
7+
)
8+
9+
type PageRequestRepository interface {
10+
CreatePageRequest(pageRequest *types.PageRequest) error
11+
GetAllPageRequests(offset, limit int) ([]*types.PageRequest, error)
12+
CountPageRequests() (int64, error)
13+
}
14+
15+
type PageRequestRepositoryImpl struct {
16+
logger *logrus.Logger
17+
db *gorm.DB
18+
}
19+
20+
var _ PageRequestRepository = (*PageRequestRepositoryImpl)(nil)
21+
22+
func NewPageRequestRepository(logger *logrus.Logger, db *gorm.DB) PageRequestRepository {
23+
return &PageRequestRepositoryImpl{
24+
logger: logger,
25+
db: db,
26+
}
27+
}
28+
29+
func (r *PageRequestRepositoryImpl) CreatePageRequest(pageRequest *types.PageRequest) error {
30+
if err := r.db.Create(pageRequest).Error; err != nil {
31+
r.logger.WithError(err).Error("Failed to create page request")
32+
return err
33+
}
34+
return nil
35+
}
36+
37+
func (r *PageRequestRepositoryImpl) GetAllPageRequests(offset, limit int) ([]*types.PageRequest, error) {
38+
var pageRequests []*types.PageRequest
39+
if err := r.db.Offset(offset).Limit(limit).Find(&pageRequests).Error; err != nil {
40+
r.logger.WithError(err).Error("Failed to get all page requests")
41+
return nil, err
42+
}
43+
return pageRequests, nil
44+
}
45+
46+
func (r *PageRequestRepositoryImpl) CountPageRequests() (int64, error) {
47+
var count int64
48+
if err := r.db.Model(&types.PageRequest{}).Count(&count).Error; err != nil {
49+
r.logger.WithError(err).Error("Failed to count page requests")
50+
return 0, err
51+
}
52+
return count, nil
53+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package routes
2+
3+
import (
4+
"github.com/gofiber/fiber/v2"
5+
"github.com/multi-tenants-cms-golang/cms-sys/internal/handler"
6+
)
7+
8+
func SetupPageRequestRoutes(app *fiber.App, handler handler.PageRequestHandle) {
9+
pageRequest := app.Group("/page-request")
10+
pageRequest.Post("/", handler.Create)
11+
pageRequest.Get("/", handler.GetAll)
12+
}

backend/cms-sys/internal/service/auth_service.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,7 @@ func (s *Service) UpdateUserProfile(id uuid.UUID, req types.UserUpdateRequest) (
241241
CreatedAt: user.CreatedAt,
242242
UpdatedAt: user.UpdatedAt,
243243
}, nil
244+
}
244245

245246
}
246247
func (s *Service) Logout(accessToken, refreshToken string) error {
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package service
2+
3+
import (
4+
"errors"
5+
"math"
6+
"github.com/google/uuid"
7+
"strings"
8+
9+
"github.com/multi-tenants-cms-golang/cms-sys/internal/repository"
10+
"github.com/multi-tenants-cms-golang/cms-sys/internal/types"
11+
"github.com/multi-tenants-cms-golang/cms-sys/pkg/utils"
12+
"github.com/multi-tenants-cms-golang/cms-sys/internal/mapper"
13+
"github.com/sirupsen/logrus"
14+
"time"
15+
)
16+
17+
type PageRequestService interface {
18+
CreatePageRequest(req types.CreatePageRequest) (*types.PageRequestResponse, error)
19+
GetAllPageRequests(req *types.PaginateRequest) ([]*types.PageRequestResponse, *utils.Pagination, error)
20+
}
21+
22+
type PageRequestServiceImpl struct {
23+
logger *logrus.Logger
24+
repo repository.PageRequestRepository
25+
}
26+
27+
var _ PageRequestService = (*PageRequestServiceImpl)(nil)
28+
29+
func NewPageRequestService(logger *logrus.Logger, repo repository.PageRequestRepository) *PageRequestServiceImpl {
30+
return &PageRequestServiceImpl{
31+
logger: logger,
32+
repo: repo,
33+
}
34+
}
35+
36+
func (s *PageRequestServiceImpl) CreatePageRequest(req types.CreatePageRequest) (*types.PageRequestResponse, error) {
37+
ownerUUID, err := uuid.Parse(strings.TrimSpace(req.OwnerID))
38+
if err != nil {
39+
return nil, errors.New("invalid owner ID format")
40+
}
41+
42+
pageRequest := &types.PageRequest{
43+
RequestID: uuid.New(),
44+
OwnerID: ownerUUID,
45+
RequestType: req.RequestType,
46+
Title: req.Title,
47+
Description: &req.Description,
48+
PageUrl: req.PageUrl,
49+
LogoUrl: req.Logo, // ko swan will integrate with s3 later
50+
CreatedAt: time.Now(),
51+
UpdatedAt: time.Now(),
52+
}
53+
54+
if err := s.repo.CreatePageRequest(pageRequest); err != nil {
55+
s.logger.WithError(err).Error("Failed to create page request")
56+
return nil, err
57+
}
58+
59+
return mapper.ToPageRequestResponse(pageRequest), nil
60+
}
61+
62+
func (s *PageRequestServiceImpl) GetAllPageRequests(req *types.PaginateRequest) ([]*types.PageRequestResponse, *utils.Pagination, error) {
63+
total, err := s.repo.CountPageRequests()
64+
if err != nil {
65+
s.logger.WithError(err).Error("Failed to count page requests")
66+
return nil, nil, err
67+
}
68+
69+
offset := utils.CalculateOffset(req.Page, req.Limit)
70+
71+
pageRequests, err := s.repo.GetAllPageRequests(offset, req.Limit)
72+
if err != nil {
73+
s.logger.WithError(err).Error("Failed to get all page requests")
74+
return nil, nil, err
75+
}
76+
77+
var responses []*types.PageRequestResponse
78+
for _, pr := range pageRequests {
79+
responses = append(responses, mapper.ToPageRequestResponse(pr))
80+
}
81+
82+
pagination := &utils.Pagination{
83+
Page: req.Page,
84+
Limit: req.Limit,
85+
Total: total,
86+
TotalPages: int(math.Ceil(float64(total) / float64(req.Limit))),
87+
}
88+
89+
return responses, pagination, nil
90+
}

0 commit comments

Comments
 (0)