lifedebugger commited on
Commit
7c23748
·
1 Parent(s): 930b7ff

Deploy files from GitHub repository

Browse files
Quzuu_API_Collection.postman_collection.json CHANGED
@@ -5227,6 +5227,40 @@
5227
  }
5228
  ]
5229
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5230
  {
5231
  "name": "Authentication Management",
5232
  "item": [
 
5227
  }
5228
  ]
5229
  },
5230
+ {
5231
+ "name": "Repair",
5232
+ "item": [
5233
+ {
5234
+ "name": "Repair Question Storage Path",
5235
+ "request": {
5236
+ "method": "POST",
5237
+ "header": [
5238
+ {
5239
+ "key": "Authorization",
5240
+ "value": "Bearer {{access_token}}",
5241
+ "type": "text"
5242
+ }
5243
+ ],
5244
+ "url": {
5245
+ "raw": "{{base_url}}/api/v1/super-admin/repair/question/storage_path",
5246
+ "host": [
5247
+ "{{base_url}}"
5248
+ ],
5249
+ "path": [
5250
+ "api",
5251
+ "v1",
5252
+ "super-admin",
5253
+ "repair",
5254
+ "question",
5255
+ "storage_path"
5256
+ ]
5257
+ },
5258
+ "description": "Repair question storage path placeholders (super admin)"
5259
+ },
5260
+ "response": []
5261
+ }
5262
+ ]
5263
+ },
5264
  {
5265
  "name": "Authentication Management",
5266
  "item": [
controllers/repair_controller.go ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ package controllers
2
+
3
+ import (
4
+ "abdanhafidz.com/go-boilerplate/models/dto"
5
+ "abdanhafidz.com/go-boilerplate/services"
6
+ "github.com/gin-gonic/gin"
7
+ )
8
+
9
+ type RepairController interface {
10
+ RepairQuestionStoragePath(ctx *gin.Context)
11
+ }
12
+
13
+ type repairController struct {
14
+ repairService services.RepairService
15
+ }
16
+
17
+ func NewRepairController(repairService services.RepairService) RepairController {
18
+ return &repairController{repairService: repairService}
19
+ }
20
+
21
+ // RepairQuestionStoragePath godoc
22
+ // @Summary Super Admin: Repair Question Storage Path
23
+ // @Description Replace @@PLUGINFILE@@ placeholders in questions with the storage URL and problem set ID
24
+ // @Tags Super Admin Repair
25
+ // @Accept json
26
+ // @Produce json
27
+ // @Security BearerAuth
28
+ // @Success 200 {object} dto.SuccessResponse[dto.RepairQuestionStoragePathResponse]
29
+ // @Failure 401 {object} dto.ErrorResponse
30
+ // @Failure 403 {object} dto.ErrorResponse
31
+ // @Failure 500 {object} dto.ErrorResponse
32
+ // @Router /api/v1/super-admin/repair/question/storage_path [post]
33
+ func (c *repairController) RepairQuestionStoragePath(ctx *gin.Context) {
34
+ updatedRows, err := c.repairService.RepairQuestionStoragePath(ctx.Request.Context())
35
+ ResponseJSON(ctx, gin.H{}, dto.RepairQuestionStoragePathResponse{UpdatedRows: updatedRows}, err)
36
+ }
models/dto/repair_dto.go ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ package dto
2
+
3
+ type RepairQuestionStoragePathResponse struct {
4
+ UpdatedRows int64 `json:"updated_rows"`
5
+ }
provider/controller_provider.go CHANGED
@@ -22,6 +22,7 @@ type ControllerProvider interface {
22
  ProvideUploadController() controllers.UploadController
23
  ProvideUserController() controllers.UserController
24
  ProvideSuperAdminInjectController() controllers.SuperAdminInjectController
 
25
  }
26
 
27
  type controllerProvider struct {
@@ -44,6 +45,7 @@ type controllerProvider struct {
44
  uploadController controllers.UploadController
45
  userController controllers.UserController
46
  superAdminInjectController controllers.SuperAdminInjectController
 
47
  }
48
 
49
  func NewControllerProvider(servicesProvider ServicesProvider) ControllerProvider {
@@ -71,6 +73,7 @@ func NewControllerProvider(servicesProvider ServicesProvider) ControllerProvider
71
  uploadController := controllers.NewUploadController(servicesProvider.ProvideUploadService())
72
  userController := controllers.NewUserController(servicesProvider.ProvideAccountService())
73
  superAdminInjectController := controllers.NewSuperAdminInjectController(servicesProvider.ProvideProblemSetService())
 
74
  return &controllerProvider{
75
  adminAcademyController: adminAcademyController,
76
  adminEventController: adminEventController,
@@ -91,6 +94,7 @@ func NewControllerProvider(servicesProvider ServicesProvider) ControllerProvider
91
  uploadController: uploadController,
92
  userController: userController,
93
  superAdminInjectController: superAdminInjectController,
 
94
  }
95
  }
96
 
@@ -171,3 +175,7 @@ func (c *controllerProvider) ProvideUserController() controllers.UserController
171
  func (c *controllerProvider) ProvideSuperAdminInjectController() controllers.SuperAdminInjectController {
172
  return c.superAdminInjectController
173
  }
 
 
 
 
 
22
  ProvideUploadController() controllers.UploadController
23
  ProvideUserController() controllers.UserController
24
  ProvideSuperAdminInjectController() controllers.SuperAdminInjectController
25
+ ProvideRepairController() controllers.RepairController
26
  }
27
 
28
  type controllerProvider struct {
 
45
  uploadController controllers.UploadController
46
  userController controllers.UserController
47
  superAdminInjectController controllers.SuperAdminInjectController
48
+ repairController controllers.RepairController
49
  }
50
 
51
  func NewControllerProvider(servicesProvider ServicesProvider) ControllerProvider {
 
73
  uploadController := controllers.NewUploadController(servicesProvider.ProvideUploadService())
74
  userController := controllers.NewUserController(servicesProvider.ProvideAccountService())
75
  superAdminInjectController := controllers.NewSuperAdminInjectController(servicesProvider.ProvideProblemSetService())
76
+ repairController := controllers.NewRepairController(servicesProvider.ProvideRepairService())
77
  return &controllerProvider{
78
  adminAcademyController: adminAcademyController,
79
  adminEventController: adminEventController,
 
94
  uploadController: uploadController,
95
  userController: userController,
96
  superAdminInjectController: superAdminInjectController,
97
+ repairController: repairController,
98
  }
99
  }
100
 
 
175
  func (c *controllerProvider) ProvideSuperAdminInjectController() controllers.SuperAdminInjectController {
176
  return c.superAdminInjectController
177
  }
178
+
179
+ func (c *controllerProvider) ProvideRepairController() controllers.RepairController {
180
+ return c.repairController
181
+ }
provider/repositories_provider.go CHANGED
@@ -33,6 +33,7 @@ type RepositoriesProvider interface {
33
  ProvideProblemSetInjectRepository() repositories.ProblemSetInjectRepository
34
  ProvideProblemSetRepository() repositories.ProblemSetRepository
35
  ProvideQuestionsRepository() repositories.QuestionsRepository
 
36
  ProvideRegionRepository() repositories.RegionRepository
37
  ProvideResultRepository() repositories.ResultRepository
38
  }
@@ -68,6 +69,7 @@ type repositoriesProvider struct {
68
  problemSetInjectRepository repositories.ProblemSetInjectRepository
69
  problemSetRepository repositories.ProblemSetRepository
70
  questionsRepository repositories.QuestionsRepository
 
71
  regionRepository repositories.RegionRepository
72
  resultRepository repositories.ResultRepository
73
  }
@@ -106,6 +108,7 @@ func NewRepositoriesProvider(cfg ConfigProvider) RepositoriesProvider {
106
  problemSetInjectRepository := repositories.NewProblemSetInjectRepository(db)
107
  problemSetRepository := repositories.NewProblemSetRepository(db)
108
  questionsRepository := repositories.NewQuestionsRepository(db)
 
109
  regionRepository := repositories.NewRegionRepository(db)
110
  resultRepository := repositories.NewResultRepository(db)
111
 
@@ -140,6 +143,7 @@ func NewRepositoriesProvider(cfg ConfigProvider) RepositoriesProvider {
140
  problemSetInjectRepository: problemSetInjectRepository,
141
  problemSetRepository: problemSetRepository,
142
  questionsRepository: questionsRepository,
 
143
  regionRepository: regionRepository,
144
  resultRepository: resultRepository,
145
  }
@@ -265,6 +269,10 @@ func (r *repositoriesProvider) ProvideQuestionsRepository() repositories.Questio
265
  return r.questionsRepository
266
  }
267
 
 
 
 
 
268
  func (r *repositoriesProvider) ProvideRegionRepository() repositories.RegionRepository {
269
  return r.regionRepository
270
  }
 
33
  ProvideProblemSetInjectRepository() repositories.ProblemSetInjectRepository
34
  ProvideProblemSetRepository() repositories.ProblemSetRepository
35
  ProvideQuestionsRepository() repositories.QuestionsRepository
36
+ ProvideRepairRepository() repositories.RepairRepository
37
  ProvideRegionRepository() repositories.RegionRepository
38
  ProvideResultRepository() repositories.ResultRepository
39
  }
 
69
  problemSetInjectRepository repositories.ProblemSetInjectRepository
70
  problemSetRepository repositories.ProblemSetRepository
71
  questionsRepository repositories.QuestionsRepository
72
+ repairRepository repositories.RepairRepository
73
  regionRepository repositories.RegionRepository
74
  resultRepository repositories.ResultRepository
75
  }
 
108
  problemSetInjectRepository := repositories.NewProblemSetInjectRepository(db)
109
  problemSetRepository := repositories.NewProblemSetRepository(db)
110
  questionsRepository := repositories.NewQuestionsRepository(db)
111
+ repairRepository := repositories.NewRepairRepository(db)
112
  regionRepository := repositories.NewRegionRepository(db)
113
  resultRepository := repositories.NewResultRepository(db)
114
 
 
143
  problemSetInjectRepository: problemSetInjectRepository,
144
  problemSetRepository: problemSetRepository,
145
  questionsRepository: questionsRepository,
146
+ repairRepository: repairRepository,
147
  regionRepository: regionRepository,
148
  resultRepository: resultRepository,
149
  }
 
269
  return r.questionsRepository
270
  }
271
 
272
+ func (r *repositoriesProvider) ProvideRepairRepository() repositories.RepairRepository {
273
+ return r.repairRepository
274
+ }
275
+
276
  func (r *repositoriesProvider) ProvideRegionRepository() repositories.RegionRepository {
277
  return r.regionRepository
278
  }
provider/services_provider.go CHANGED
@@ -18,6 +18,7 @@ type ServicesProvider interface {
18
  ProvidePaymentService() services.PaymentService
19
  ProvideUploadService() services.UploadService
20
  ProvideProblemSetService() services.ProblemSetService
 
21
  ProvideOptionService() services.OptionService
22
  ProvideAccountService() services.AccountService
23
  ProvideForgotPasswordService() services.ForgotPasswordService
@@ -40,6 +41,7 @@ type servicesProvider struct {
40
  paymentService services.PaymentService
41
  uploadService services.UploadService
42
  problemSetService services.ProblemSetService
 
43
  optionService services.OptionService
44
  accountService services.AccountService
45
  forgotPasswordService services.ForgotPasswordService
@@ -68,6 +70,7 @@ func NewServicesProvider(repoProvider RepositoriesProvider, configProvider Confi
68
  repoProvider.ProvideProblemSetExamAssignRepository(),
69
  repoProvider.ProvideProblemSetInjectRepository(),
70
  )
 
71
  optionService := services.NewOptionService(repoProvider.ProvideOptionRepository())
72
  accountService := services.NewAccountService(jWTService, repoProvider.ProvideAccountRepository(), repoProvider.ProvideAccountDetailRepository(), configProvider.ProvideSuperAdminConfig())
73
  forgotPasswordService := services.NewForgotPasswordService(jWTService, repoProvider.ProvideAccountRepository(), repoProvider.ProvideForgotPasswordRepository())
@@ -108,6 +111,7 @@ func NewServicesProvider(repoProvider RepositoriesProvider, configProvider Confi
108
  paymentService: paymentService,
109
  uploadService: uploadService,
110
  problemSetService: problemSetService,
 
111
  optionService: optionService,
112
  accountService: accountService,
113
  forgotPasswordService: forgotPasswordService,
@@ -160,6 +164,10 @@ func (s *servicesProvider) ProvideProblemSetService() services.ProblemSetService
160
  return s.problemSetService
161
  }
162
 
 
 
 
 
163
  func (s *servicesProvider) ProvideOptionService() services.OptionService {
164
  return s.optionService
165
  }
 
18
  ProvidePaymentService() services.PaymentService
19
  ProvideUploadService() services.UploadService
20
  ProvideProblemSetService() services.ProblemSetService
21
+ ProvideRepairService() services.RepairService
22
  ProvideOptionService() services.OptionService
23
  ProvideAccountService() services.AccountService
24
  ProvideForgotPasswordService() services.ForgotPasswordService
 
41
  paymentService services.PaymentService
42
  uploadService services.UploadService
43
  problemSetService services.ProblemSetService
44
+ repairService services.RepairService
45
  optionService services.OptionService
46
  accountService services.AccountService
47
  forgotPasswordService services.ForgotPasswordService
 
70
  repoProvider.ProvideProblemSetExamAssignRepository(),
71
  repoProvider.ProvideProblemSetInjectRepository(),
72
  )
73
+ repairService := services.NewRepairService(repoProvider.ProvideRepairRepository())
74
  optionService := services.NewOptionService(repoProvider.ProvideOptionRepository())
75
  accountService := services.NewAccountService(jWTService, repoProvider.ProvideAccountRepository(), repoProvider.ProvideAccountDetailRepository(), configProvider.ProvideSuperAdminConfig())
76
  forgotPasswordService := services.NewForgotPasswordService(jWTService, repoProvider.ProvideAccountRepository(), repoProvider.ProvideForgotPasswordRepository())
 
111
  paymentService: paymentService,
112
  uploadService: uploadService,
113
  problemSetService: problemSetService,
114
+ repairService: repairService,
115
  optionService: optionService,
116
  accountService: accountService,
117
  forgotPasswordService: forgotPasswordService,
 
164
  return s.problemSetService
165
  }
166
 
167
+ func (s *servicesProvider) ProvideRepairService() services.RepairService {
168
+ return s.repairService
169
+ }
170
+
171
  func (s *servicesProvider) ProvideOptionService() services.OptionService {
172
  return s.optionService
173
  }
repositories/repair_repository.go ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ package repositories
2
+
3
+ import (
4
+ "context"
5
+
6
+ "gorm.io/gorm"
7
+ )
8
+
9
+ type RepairRepository interface {
10
+ RepairQuestionStoragePath(ctx context.Context) (int64, error)
11
+ }
12
+
13
+ type repairRepository struct {
14
+ db *gorm.DB
15
+ }
16
+
17
+ func NewRepairRepository(db *gorm.DB) RepairRepository {
18
+ return &repairRepository{db: db}
19
+ }
20
+
21
+ func (r *repairRepository) RepairQuestionStoragePath(ctx context.Context) (int64, error) {
22
+ sql := `
23
+ UPDATE questions
24
+ SET question = REPLACE(
25
+ question,
26
+ '@@PLUGINFILE@@',
27
+ CONCAT('https://storage.quzuu.id', '/', problem_set_id)
28
+ )
29
+ WHERE question LIKE '%@@PLUGINFILE@@%';
30
+ `
31
+
32
+ records := r.db.WithContext(ctx).Exec(sql)
33
+ return records.RowsAffected, records.Error
34
+ }
router/super_admin_router.go CHANGED
@@ -11,6 +11,7 @@ func SuperAdminRouter(router *gin.Engine, middleware provider.MiddlewareProvider
11
 
12
  userController := controller.ProvideUserController()
13
  injectController := controller.ProvideSuperAdminInjectController()
 
14
 
15
  // Super Admin Users Routes
16
  userSuperAdminGroup := router.Group("/api/v1/super-admin/users", authenticationMiddleware.VerifyAccount, authorizationMiddleware.VerifySuperAdmin)
@@ -26,4 +27,9 @@ func SuperAdminRouter(router *gin.Engine, middleware provider.MiddlewareProvider
26
  {
27
  injectSuperAdminGroup.POST("/probset", injectController.InjectProblemSet)
28
  }
 
 
 
 
 
29
  }
 
11
 
12
  userController := controller.ProvideUserController()
13
  injectController := controller.ProvideSuperAdminInjectController()
14
+ repairController := controller.ProvideRepairController()
15
 
16
  // Super Admin Users Routes
17
  userSuperAdminGroup := router.Group("/api/v1/super-admin/users", authenticationMiddleware.VerifyAccount, authorizationMiddleware.VerifySuperAdmin)
 
27
  {
28
  injectSuperAdminGroup.POST("/probset", injectController.InjectProblemSet)
29
  }
30
+
31
+ repairSuperAdminGroup := router.Group("/api/v1/super-admin/repair", authenticationMiddleware.VerifyAccount, authorizationMiddleware.VerifySuperAdmin)
32
+ {
33
+ repairSuperAdminGroup.POST("/question/storage_path", repairController.RepairQuestionStoragePath)
34
+ }
35
  }
services/repair_service.go ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ package services
2
+
3
+ import (
4
+ "context"
5
+
6
+ "abdanhafidz.com/go-boilerplate/repositories"
7
+ )
8
+
9
+ type RepairService interface {
10
+ RepairQuestionStoragePath(ctx context.Context) (int64, error)
11
+ }
12
+
13
+ type repairService struct {
14
+ repairRepository repositories.RepairRepository
15
+ }
16
+
17
+ func NewRepairService(repairRepository repositories.RepairRepository) RepairService {
18
+ return &repairService{repairRepository: repairRepository}
19
+ }
20
+
21
+ func (s *repairService) RepairQuestionStoragePath(ctx context.Context) (int64, error) {
22
+ return s.repairRepository.RepairQuestionStoragePath(ctx)
23
+ }