diff --git a/app/database/entity/advertisement.entity.go b/app/database/entity/advertisement.entity.go new file mode 100644 index 0000000..89ccd05 --- /dev/null +++ b/app/database/entity/advertisement.entity.go @@ -0,0 +1,15 @@ +package entity + +import "time" + +type Advertisement struct { + ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` + Title string `json:"title" gorm:"type:varchar"` + Description string `json:"description" gorm:"type:varchar"` + RedirectLink string `json:"redirect_link" gorm:"type:varchar"` + Placement string `json:"placement" gorm:"type:varchar"` + StatusId int `json:"status_id" gorm:"type:int4"` + IsActive bool `json:"is_active" gorm:"type:bool;default:true"` + CreatedAt time.Time `json:"created_at" gorm:"default:now()"` + UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` +} diff --git a/app/database/index.database.go b/app/database/index.database.go index ab36c2e..ac2882d 100644 --- a/app/database/index.database.go +++ b/app/database/index.database.go @@ -85,6 +85,7 @@ func Models() []interface{} { return []interface{}{ entity.ActivityLogs{}, entity.ActivityLogTypes{}, + entity.Advertisement{}, entity.Articles{}, entity.ArticleCategories{}, entity.ArticleApprovals{}, diff --git a/app/module/advertisement/advertisement.module.go b/app/module/advertisement/advertisement.module.go new file mode 100644 index 0000000..9427e2a --- /dev/null +++ b/app/module/advertisement/advertisement.module.go @@ -0,0 +1,53 @@ +package advertisement + +import ( + "github.com/gofiber/fiber/v2" + "go-humas-be/app/module/advertisement/controller" + "go-humas-be/app/module/advertisement/repository" + "go-humas-be/app/module/advertisement/service" + "go.uber.org/fx" +) + +// struct of AdvertisementRouter +type AdvertisementRouter struct { + App fiber.Router + Controller *controller.Controller +} + +// register bulky of Advertisement module +var NewAdvertisementModule = fx.Options( + // register repository of Advertisement module + fx.Provide(repository.NewAdvertisementRepository), + + // register service of Advertisement module + fx.Provide(service.NewAdvertisementService), + + // register controller of Advertisement module + fx.Provide(controller.NewController), + + // register router of Advertisement module + fx.Provide(NewAdvertisementRouter), +) + +// init AdvertisementRouter +func NewAdvertisementRouter(fiber *fiber.App, controller *controller.Controller) *AdvertisementRouter { + return &AdvertisementRouter{ + App: fiber, + Controller: controller, + } +} + +// register routes of Advertisement module +func (_i *AdvertisementRouter) RegisterAdvertisementRoutes() { + // define controllers + advertisementController := _i.Controller.Advertisement + + // define routes + _i.App.Route("/advertisement", func(router fiber.Router) { + router.Get("/", advertisementController.All) + router.Get("/:id", advertisementController.Show) + router.Post("/", advertisementController.Save) + router.Put("/:id", advertisementController.Update) + router.Delete("/:id", advertisementController.Delete) + }) +} diff --git a/app/module/advertisement/controller/advertisement.controller.go b/app/module/advertisement/controller/advertisement.controller.go new file mode 100644 index 0000000..8db140c --- /dev/null +++ b/app/module/advertisement/controller/advertisement.controller.go @@ -0,0 +1,195 @@ +package controller + +import ( + "github.com/gofiber/fiber/v2" + "github.com/rs/zerolog" + "go-humas-be/app/module/advertisement/request" + "go-humas-be/app/module/advertisement/service" + "go-humas-be/utils/paginator" + "strconv" + + utilRes "go-humas-be/utils/response" + utilVal "go-humas-be/utils/validator" +) + +type advertisementController struct { + advertisementService service.AdvertisementService + Log zerolog.Logger +} + +type AdvertisementController interface { + All(c *fiber.Ctx) error + Show(c *fiber.Ctx) error + Save(c *fiber.Ctx) error + Update(c *fiber.Ctx) error + Delete(c *fiber.Ctx) error +} + +func NewAdvertisementController(advertisementService service.AdvertisementService, log zerolog.Logger) AdvertisementController { + return &advertisementController{ + advertisementService: advertisementService, + Log: log, + } +} + +// All get all Advertisement +// @Summary Get all Advertisement +// @Description API for getting all Advertisement +// @Tags Advertisement +// @Security Bearer +// @Param req query request.AdvertisementQueryRequest false "query parameters" +// @Param req query paginator.Pagination false "pagination parameters" +// @Success 200 {object} response.Response +// @Failure 400 {object} response.BadRequestError +// @Failure 401 {object} response.UnauthorizedError +// @Failure 500 {object} response.InternalServerError +// @Router /advertisement [get] +func (_i *advertisementController) All(c *fiber.Ctx) error { + paginate, err := paginator.Paginate(c) + if err != nil { + return err + } + + reqContext := request.AdvertisementQueryRequestContext{ + Title: c.Query("title"), + Description: c.Query("description"), + RedirectLink: c.Query("redirectLink"), + Placement: c.Query("placement"), + StatusId: c.Query("statusId"), + } + req := reqContext.ToParamRequest() + req.Pagination = paginate + + advertisementData, paging, err := _i.advertisementService.All(req) + if err != nil { + return err + } + + return utilRes.Resp(c, utilRes.Response{ + Success: true, + Messages: utilRes.Messages{"Advertisement list successfully retrieved"}, + Data: advertisementData, + Meta: paging, + }) +} + +// Show get one Advertisement +// @Summary Get one Advertisement +// @Description API for getting one Advertisement +// @Tags Advertisement +// @Security Bearer +// @Param id path int true "Advertisement ID" +// @Success 200 {object} response.Response +// @Failure 400 {object} response.BadRequestError +// @Failure 401 {object} response.UnauthorizedError +// @Failure 500 {object} response.InternalServerError +// @Router /advertisement/{id} [get] +func (_i *advertisementController) Show(c *fiber.Ctx) error { + id, err := strconv.ParseUint(c.Params("id"), 10, 0) + if err != nil { + return err + } + + advertisementData, err := _i.advertisementService.Show(uint(id)) + if err != nil { + return err + } + + return utilRes.Resp(c, utilRes.Response{ + Success: true, + Messages: utilRes.Messages{"Advertisement successfully retrieved"}, + Data: advertisementData, + }) +} + +// Save create Advertisement +// @Summary Create Advertisement +// @Description API for create Advertisement +// @Tags Advertisement +// @Security Bearer +// @Param Authorization header string true "Insert your access token" default(Bearer ) +// @Param payload body request.AdvertisementCreateRequest true "Required payload" +// @Success 200 {object} response.Response +// @Failure 400 {object} response.BadRequestError +// @Failure 401 {object} response.UnauthorizedError +// @Failure 500 {object} response.InternalServerError +// @Router /advertisement [post] +func (_i *advertisementController) Save(c *fiber.Ctx) error { + req := new(request.AdvertisementCreateRequest) + if err := utilVal.ParseAndValidate(c, req); err != nil { + return err + } + + dataResult, err := _i.advertisementService.Save(*req) + if err != nil { + return err + } + + return utilRes.Resp(c, utilRes.Response{ + Success: true, + Messages: utilRes.Messages{"Advertisement successfully created"}, + Data: dataResult, + }) +} + +// Update update Advertisement +// @Summary update Advertisement +// @Description API for update Advertisement +// @Tags Advertisement +// @Security Bearer +// @Param payload body request.AdvertisementUpdateRequest true "Required payload" +// @Param id path int true "Advertisement ID" +// @Success 200 {object} response.Response +// @Failure 400 {object} response.BadRequestError +// @Failure 401 {object} response.UnauthorizedError +// @Failure 500 {object} response.InternalServerError +// @Router /advertisement/{id} [put] +func (_i *advertisementController) Update(c *fiber.Ctx) error { + id, err := strconv.ParseUint(c.Params("id"), 10, 0) + if err != nil { + return err + } + + req := new(request.AdvertisementUpdateRequest) + if err := utilVal.ParseAndValidate(c, req); err != nil { + return err + } + + err = _i.advertisementService.Update(uint(id), *req) + if err != nil { + return err + } + + return utilRes.Resp(c, utilRes.Response{ + Success: true, + Messages: utilRes.Messages{"Advertisement successfully updated"}, + }) +} + +// Delete delete Advertisement +// @Summary delete Advertisement +// @Description API for delete Advertisement +// @Tags Advertisement +// @Security Bearer +// @Param id path int true "Advertisement ID" +// @Success 200 {object} response.Response +// @Failure 400 {object} response.BadRequestError +// @Failure 401 {object} response.UnauthorizedError +// @Failure 500 {object} response.InternalServerError +// @Router /advertisement/{id} [delete] +func (_i *advertisementController) Delete(c *fiber.Ctx) error { + id, err := strconv.ParseUint(c.Params("id"), 10, 0) + if err != nil { + return err + } + + err = _i.advertisementService.Delete(uint(id)) + if err != nil { + return err + } + + return utilRes.Resp(c, utilRes.Response{ + Success: true, + Messages: utilRes.Messages{"Advertisement successfully deleted"}, + }) +} diff --git a/app/module/advertisement/controller/controller.go b/app/module/advertisement/controller/controller.go new file mode 100644 index 0000000..1e50050 --- /dev/null +++ b/app/module/advertisement/controller/controller.go @@ -0,0 +1,16 @@ +package controller + +import ( + "github.com/rs/zerolog" + "go-humas-be/app/module/advertisement/service" +) + +type Controller struct { + Advertisement AdvertisementController +} + +func NewController(AdvertisementService service.AdvertisementService, log zerolog.Logger) *Controller { + return &Controller{ + Advertisement: NewAdvertisementController(AdvertisementService, log), + } +} diff --git a/app/module/advertisement/mapper/advertisement.mapper.go b/app/module/advertisement/mapper/advertisement.mapper.go new file mode 100644 index 0000000..695d735 --- /dev/null +++ b/app/module/advertisement/mapper/advertisement.mapper.go @@ -0,0 +1,23 @@ +package mapper + +import ( + "go-humas-be/app/database/entity" + res "go-humas-be/app/module/advertisement/response" +) + +func AdvertisementResponseMapper(advertisementReq *entity.Advertisement) (advertisementRes *res.AdvertisementResponse) { + if advertisementReq != nil { + advertisementRes = &res.AdvertisementResponse{ + ID: advertisementReq.ID, + Title: advertisementReq.Title, + Description: advertisementReq.Description, + RedirectLink: advertisementReq.RedirectLink, + Placement: advertisementReq.Placement, + StatusId: advertisementReq.StatusId, + IsActive: advertisementReq.IsActive, + CreatedAt: advertisementReq.CreatedAt, + UpdatedAt: advertisementReq.UpdatedAt, + } + } + return advertisementRes +} diff --git a/app/module/advertisement/repository/advertisement.repository.go b/app/module/advertisement/repository/advertisement.repository.go new file mode 100644 index 0000000..b655e60 --- /dev/null +++ b/app/module/advertisement/repository/advertisement.repository.go @@ -0,0 +1,104 @@ +package repository + +import ( + "fmt" + "github.com/rs/zerolog" + "go-humas-be/app/database" + "go-humas-be/app/database/entity" + "go-humas-be/app/module/advertisement/request" + "go-humas-be/utils/paginator" + "strings" +) + +type advertisementRepository struct { + DB *database.Database + Log zerolog.Logger +} + +// AdvertisementRepository define interface of IAdvertisementRepository +type AdvertisementRepository interface { + GetAll(req request.AdvertisementQueryRequest) (advertisements []*entity.Advertisement, paging paginator.Pagination, err error) + FindOne(id uint) (advertisement *entity.Advertisement, err error) + Create(advertisement *entity.Advertisement) (advertisementReturn *entity.Advertisement, err error) + Update(id uint, advertisement *entity.Advertisement) (err error) + Delete(id uint) (err error) +} + +func NewAdvertisementRepository(db *database.Database, logger zerolog.Logger) AdvertisementRepository { + return &advertisementRepository{ + DB: db, + Log: logger, + } +} + +// implement interface of IAdvertisementRepository +func (_i *advertisementRepository) GetAll(req request.AdvertisementQueryRequest) (advertisements []*entity.Advertisement, paging paginator.Pagination, err error) { + var count int64 + + query := _i.DB.DB.Model(&entity.Advertisement{}) + query = query.Where("is_active = ?", true) + + if req.Title != nil && *req.Title != "" { + title := strings.ToLower(*req.Title) + query = query.Where("LOWER(title) LIKE ?", "%"+strings.ToLower(title)+"%") + } + if req.Description != nil && *req.Description != "" { + description := strings.ToLower(*req.Description) + query = query.Where("LOWER(description) LIKE ?", "%"+strings.ToLower(description)+"%") + } + if req.RedirectLink != nil && *req.RedirectLink != "" { + redirectLink := strings.ToLower(*req.RedirectLink) + query = query.Where("LOWER(redirect_link) LIKE ?", "%"+strings.ToLower(redirectLink)+"%") + } + if req.Placement != nil && *req.Placement != "" { + placement := strings.ToLower(*req.Placement) + query = query.Where("LOWER(placement) LIKE ?", "%"+strings.ToLower(placement)+"%") + } + if req.StatusId != nil { + query = query.Where("status_id = ?", req.StatusId) + } + query.Count(&count) + + if req.Pagination.SortBy != "" { + direction := "ASC" + if req.Pagination.Sort == "desc" { + direction = "DESC" + } + query.Order(fmt.Sprintf("%s %s", req.Pagination.SortBy, direction)) + } + + req.Pagination.Count = count + req.Pagination = paginator.Paging(req.Pagination) + + err = query.Offset(req.Pagination.Offset).Limit(req.Pagination.Limit).Find(&advertisements).Error + if err != nil { + return + } + + paging = *req.Pagination + + return +} + +func (_i *advertisementRepository) FindOne(id uint) (advertisement *entity.Advertisement, err error) { + if err := _i.DB.DB.First(&advertisement, id).Error; err != nil { + return nil, err + } + + return advertisement, nil +} + +func (_i *advertisementRepository) Create(advertisement *entity.Advertisement) (advertisementReturn *entity.Advertisement, err error) { + result := _i.DB.DB.Create(advertisement) + return advertisement, result.Error +} + +func (_i *advertisementRepository) Update(id uint, advertisement *entity.Advertisement) (err error) { + return _i.DB.DB.Model(&entity.Advertisement{}). + Where(&entity.Advertisement{ID: id}). + Updates(advertisement).Error +} + +func (_i *advertisementRepository) Delete(id uint) error { + return _i.DB.DB.Delete(&entity.Advertisement{}, id).Error +} diff --git a/app/module/advertisement/request/advertisement.request.go b/app/module/advertisement/request/advertisement.request.go new file mode 100644 index 0000000..cd29b47 --- /dev/null +++ b/app/module/advertisement/request/advertisement.request.go @@ -0,0 +1,90 @@ +package request + +import ( + "go-humas-be/app/database/entity" + "go-humas-be/utils/paginator" + "strconv" + "time" +) + +type AdvertisementGeneric interface { + ToEntity() +} + +type AdvertisementQueryRequest struct { + Title *string `json:"title"` + Description *string `json:"description"` + RedirectLink *string `json:"redirectLink"` + Placement *string `json:"placement"` + StatusId *int `json:"statusId"` + Pagination *paginator.Pagination `json:"pagination"` +} + +type AdvertisementCreateRequest struct { + Title string `json:"title" validate:"required"` + Description string `json:"description" validate:"required"` + RedirectLink string `json:"redirectLink" validate:"required"` + Placement string `json:"placement" validate:"required"` +} + +func (req AdvertisementCreateRequest) ToEntity() *entity.Advertisement { + return &entity.Advertisement{ + Title: req.Title, + Description: req.Description, + RedirectLink: req.RedirectLink, + Placement: req.Placement, + StatusId: 1, + } +} + +type AdvertisementUpdateRequest struct { + ID uint `json:"id" validate:"required"` + Title string `json:"title" validate:"required"` + Description string `json:"description" validate:"required"` + RedirectLink string `json:"redirectLink" validate:"required"` + Placement string `json:"placement" validate:"required"` +} + +func (req AdvertisementUpdateRequest) ToEntity() *entity.Advertisement { + return &entity.Advertisement{ + ID: req.ID, + Title: req.Title, + Description: req.Description, + RedirectLink: req.RedirectLink, + Placement: req.Placement, + UpdatedAt: time.Now(), + } +} + +type AdvertisementQueryRequestContext struct { + Title string `json:"title"` + Description string `json:"description"` + RedirectLink string `json:"redirectLink"` + Placement string `json:"placement"` + StatusId string `json:"statusId"` +} + +func (req AdvertisementQueryRequestContext) ToParamRequest() AdvertisementQueryRequest { + var request AdvertisementQueryRequest + + if title := req.Title; title != "" { + request.Title = &title + } + if description := req.Description; description != "" { + request.Description = &description + } + if redirectLink := req.RedirectLink; redirectLink != "" { + request.RedirectLink = &redirectLink + } + if placement := req.Placement; placement != "" { + request.Placement = &placement + } + if statusIdStr := req.StatusId; statusIdStr != "" { + statusId, err := strconv.Atoi(statusIdStr) + if err == nil { + request.StatusId = &statusId + } + } + + return request +} diff --git a/app/module/advertisement/response/advertisement.response.go b/app/module/advertisement/response/advertisement.response.go new file mode 100644 index 0000000..619a808 --- /dev/null +++ b/app/module/advertisement/response/advertisement.response.go @@ -0,0 +1,15 @@ +package response + +import "time" + +type AdvertisementResponse struct { + ID uint `json:"id"` + Title string `json:"title"` + Description string `json:"description"` + RedirectLink string `json:"redirectLink"` + Placement string `json:"placement"` + StatusId int `json:"statusId"` + IsActive bool `json:"isActive"` + CreatedAt time.Time `json:"createdAt"` + UpdatedAt time.Time `json:"updatedAt"` +} diff --git a/app/module/advertisement/service/advertisement.service.go b/app/module/advertisement/service/advertisement.service.go new file mode 100644 index 0000000..4c106bf --- /dev/null +++ b/app/module/advertisement/service/advertisement.service.go @@ -0,0 +1,82 @@ +package service + +import ( + "github.com/rs/zerolog" + "go-humas-be/app/database/entity" + "go-humas-be/app/module/advertisement/mapper" + "go-humas-be/app/module/advertisement/repository" + "go-humas-be/app/module/advertisement/request" + "go-humas-be/app/module/advertisement/response" + usersRepository "go-humas-be/app/module/users/repository" + "go-humas-be/utils/paginator" +) + +// AdvertisementService +type advertisementService struct { + Repo repository.AdvertisementRepository + UsersRepo usersRepository.UsersRepository + Log zerolog.Logger +} + +// AdvertisementService define interface of IAdvertisementService +type AdvertisementService interface { + All(req request.AdvertisementQueryRequest) (advertisement []*response.AdvertisementResponse, paging paginator.Pagination, err error) + Show(id uint) (advertisement *response.AdvertisementResponse, err error) + Save(req request.AdvertisementCreateRequest) (advertisement *entity.Advertisement, err error) + Update(id uint, req request.AdvertisementUpdateRequest) (err error) + Delete(id uint) error +} + +// NewAdvertisementService init AdvertisementService +func NewAdvertisementService(repo repository.AdvertisementRepository, log zerolog.Logger, usersRepo usersRepository.UsersRepository) AdvertisementService { + + return &advertisementService{ + Repo: repo, + Log: log, + UsersRepo: usersRepo, + } +} + +// All implement interface of AdvertisementService +func (_i *advertisementService) All(req request.AdvertisementQueryRequest) (advertisements []*response.AdvertisementResponse, paging paginator.Pagination, err error) { + results, paging, err := _i.Repo.GetAll(req) + if err != nil { + return + } + + for _, result := range results { + advertisements = append(advertisements, mapper.AdvertisementResponseMapper(result)) + } + + return +} + +func (_i *advertisementService) Show(id uint) (advertisement *response.AdvertisementResponse, err error) { + result, err := _i.Repo.FindOne(id) + if err != nil { + return nil, err + } + + return mapper.AdvertisementResponseMapper(result), nil +} + +func (_i *advertisementService) Save(req request.AdvertisementCreateRequest) (advertisement *entity.Advertisement, err error) { + _i.Log.Info().Interface("data", req).Msg("") + newReq := req.ToEntity() + return _i.Repo.Create(newReq) +} + +func (_i *advertisementService) Update(id uint, req request.AdvertisementUpdateRequest) (err error) { + _i.Log.Info().Interface("data", req).Msg("") + return _i.Repo.Update(id, req.ToEntity()) +} + +func (_i *advertisementService) Delete(id uint) error { + result, err := _i.Repo.FindOne(id) + if err != nil { + return err + } + + result.IsActive = false + return _i.Repo.Update(id, result) +} diff --git a/app/module/articles/service/articles.service.go b/app/module/articles/service/articles.service.go index e8d3b14..aeb1a2b 100644 --- a/app/module/articles/service/articles.service.go +++ b/app/module/articles/service/articles.service.go @@ -184,7 +184,7 @@ func (_i *articlesService) Save(req request.ArticlesCreateRequest, authToken str statusIdTwo := 2 isPublishFalse := false createdBy := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken) - if createdBy != nil && *createdBy.UserLevel.IsApprovalActive == true { + if createdBy != nil && *createdBy.UserLevel.IsApprovalActive == false { newReq.NeedApprovalFrom = nil newReq.StatusId = &statusIdTwo } else { diff --git a/app/router/api.go b/app/router/api.go index 490e1ce..85a53e4 100644 --- a/app/router/api.go +++ b/app/router/api.go @@ -4,6 +4,7 @@ import ( swagger "github.com/arsmn/fiber-swagger/v2" "github.com/gofiber/fiber/v2" "go-humas-be/app/module/activity_logs" + "go-humas-be/app/module/advertisement" "go-humas-be/app/module/article_approvals" "go-humas-be/app/module/article_categories" "go-humas-be/app/module/article_category_details" @@ -33,6 +34,7 @@ type Router struct { Cfg *config.Config ActivityLogsRouter *activity_logs.ActivityLogsRouter + AdvertisementRouter *advertisement.AdvertisementRouter ArticleCategoriesRouter *article_categories.ArticleCategoriesRouter ArticleCategoryDetailsRouter *article_category_details.ArticleCategoryDetailsRouter ArticleFilesRouter *article_files.ArticleFilesRouter @@ -60,6 +62,7 @@ func NewRouter( cfg *config.Config, activityLogsRouter *activity_logs.ActivityLogsRouter, + advertisementRouter *advertisement.AdvertisementRouter, articleCategoriesRouter *article_categories.ArticleCategoriesRouter, articleCategoryDetailsRouter *article_category_details.ArticleCategoryDetailsRouter, articleFilesRouter *article_files.ArticleFilesRouter, @@ -85,6 +88,7 @@ func NewRouter( App: fiber, Cfg: cfg, ActivityLogsRouter: activityLogsRouter, + AdvertisementRouter: advertisementRouter, ArticleCategoriesRouter: articleCategoriesRouter, ArticleCategoryDetailsRouter: articleCategoryDetailsRouter, ArticleFilesRouter: articleFilesRouter, @@ -120,6 +124,7 @@ func (r *Router) Register() { // Register routes of modules r.ActivityLogsRouter.RegisterActivityLogsRoutes() + r.AdvertisementRouter.RegisterAdvertisementRoutes() r.ArticleCategoriesRouter.RegisterArticleCategoriesRoutes() r.ArticleCategoryDetailsRouter.RegisterArticleCategoryDetailsRoutes() r.ArticleFilesRouter.RegisterArticleFilesRoutes() diff --git a/docs/swagger/docs.go b/docs/swagger/docs.go index 8a9c4d4..7a6841a 100644 --- a/docs/swagger/docs.go +++ b/docs/swagger/docs.go @@ -325,6 +325,322 @@ const docTemplate = `{ } } }, + "/advertisement": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "description": "API for getting all Advertisement", + "tags": [ + "Advertisement" + ], + "summary": "Get all Advertisement", + "parameters": [ + { + "type": "string", + "name": "description", + "in": "query" + }, + { + "type": "string", + "name": "placement", + "in": "query" + }, + { + "type": "string", + "name": "redirectLink", + "in": "query" + }, + { + "type": "integer", + "name": "statusId", + "in": "query" + }, + { + "type": "string", + "name": "title", + "in": "query" + }, + { + "type": "integer", + "name": "count", + "in": "query" + }, + { + "type": "integer", + "name": "limit", + "in": "query" + }, + { + "type": "integer", + "name": "nextPage", + "in": "query" + }, + { + "type": "integer", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "name": "previousPage", + "in": "query" + }, + { + "type": "string", + "name": "sort", + "in": "query" + }, + { + "type": "string", + "name": "sortBy", + "in": "query" + }, + { + "type": "integer", + "name": "totalPage", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.Response" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/response.BadRequestError" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/response.UnauthorizedError" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/response.InternalServerError" + } + } + } + }, + "post": { + "security": [ + { + "Bearer": [] + } + ], + "description": "API for create Advertisement", + "tags": [ + "Advertisement" + ], + "summary": "Create Advertisement", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cAdd access token here\u003e", + "description": "Insert your access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "description": "Required payload", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.AdvertisementCreateRequest" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.Response" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/response.BadRequestError" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/response.UnauthorizedError" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/response.InternalServerError" + } + } + } + } + }, + "/advertisement/{id}": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "description": "API for getting one Advertisement", + "tags": [ + "Advertisement" + ], + "summary": "Get one Advertisement", + "parameters": [ + { + "type": "integer", + "description": "Advertisement ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.Response" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/response.BadRequestError" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/response.UnauthorizedError" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/response.InternalServerError" + } + } + } + }, + "put": { + "security": [ + { + "Bearer": [] + } + ], + "description": "API for update Advertisement", + "tags": [ + "Advertisement" + ], + "summary": "update Advertisement", + "parameters": [ + { + "description": "Required payload", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.AdvertisementUpdateRequest" + } + }, + { + "type": "integer", + "description": "Advertisement ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.Response" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/response.BadRequestError" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/response.UnauthorizedError" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/response.InternalServerError" + } + } + } + }, + "delete": { + "security": [ + { + "Bearer": [] + } + ], + "description": "API for delete Advertisement", + "tags": [ + "Advertisement" + ], + "summary": "delete Advertisement", + "parameters": [ + { + "type": "integer", + "description": "Advertisement ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.Response" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/response.BadRequestError" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/response.UnauthorizedError" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/response.InternalServerError" + } + } + } + } + }, "/article-approvals": { "get": { "security": [ @@ -8379,6 +8695,56 @@ const docTemplate = `{ } } }, + "request.AdvertisementCreateRequest": { + "type": "object", + "required": [ + "description", + "placement", + "redirectLink", + "title" + ], + "properties": { + "description": { + "type": "string" + }, + "placement": { + "type": "string" + }, + "redirectLink": { + "type": "string" + }, + "title": { + "type": "string" + } + } + }, + "request.AdvertisementUpdateRequest": { + "type": "object", + "required": [ + "description", + "id", + "placement", + "redirectLink", + "title" + ], + "properties": { + "description": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "placement": { + "type": "string" + }, + "redirectLink": { + "type": "string" + }, + "title": { + "type": "string" + } + } + }, "request.ArticleApprovalsCreateRequest": { "type": "object", "required": [ diff --git a/docs/swagger/swagger.json b/docs/swagger/swagger.json index c3e1aa2..8bd3078 100644 --- a/docs/swagger/swagger.json +++ b/docs/swagger/swagger.json @@ -314,6 +314,322 @@ } } }, + "/advertisement": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "description": "API for getting all Advertisement", + "tags": [ + "Advertisement" + ], + "summary": "Get all Advertisement", + "parameters": [ + { + "type": "string", + "name": "description", + "in": "query" + }, + { + "type": "string", + "name": "placement", + "in": "query" + }, + { + "type": "string", + "name": "redirectLink", + "in": "query" + }, + { + "type": "integer", + "name": "statusId", + "in": "query" + }, + { + "type": "string", + "name": "title", + "in": "query" + }, + { + "type": "integer", + "name": "count", + "in": "query" + }, + { + "type": "integer", + "name": "limit", + "in": "query" + }, + { + "type": "integer", + "name": "nextPage", + "in": "query" + }, + { + "type": "integer", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "name": "previousPage", + "in": "query" + }, + { + "type": "string", + "name": "sort", + "in": "query" + }, + { + "type": "string", + "name": "sortBy", + "in": "query" + }, + { + "type": "integer", + "name": "totalPage", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.Response" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/response.BadRequestError" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/response.UnauthorizedError" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/response.InternalServerError" + } + } + } + }, + "post": { + "security": [ + { + "Bearer": [] + } + ], + "description": "API for create Advertisement", + "tags": [ + "Advertisement" + ], + "summary": "Create Advertisement", + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cAdd access token here\u003e", + "description": "Insert your access token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "description": "Required payload", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.AdvertisementCreateRequest" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.Response" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/response.BadRequestError" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/response.UnauthorizedError" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/response.InternalServerError" + } + } + } + } + }, + "/advertisement/{id}": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "description": "API for getting one Advertisement", + "tags": [ + "Advertisement" + ], + "summary": "Get one Advertisement", + "parameters": [ + { + "type": "integer", + "description": "Advertisement ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.Response" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/response.BadRequestError" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/response.UnauthorizedError" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/response.InternalServerError" + } + } + } + }, + "put": { + "security": [ + { + "Bearer": [] + } + ], + "description": "API for update Advertisement", + "tags": [ + "Advertisement" + ], + "summary": "update Advertisement", + "parameters": [ + { + "description": "Required payload", + "name": "payload", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.AdvertisementUpdateRequest" + } + }, + { + "type": "integer", + "description": "Advertisement ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.Response" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/response.BadRequestError" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/response.UnauthorizedError" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/response.InternalServerError" + } + } + } + }, + "delete": { + "security": [ + { + "Bearer": [] + } + ], + "description": "API for delete Advertisement", + "tags": [ + "Advertisement" + ], + "summary": "delete Advertisement", + "parameters": [ + { + "type": "integer", + "description": "Advertisement ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.Response" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/response.BadRequestError" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/response.UnauthorizedError" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/response.InternalServerError" + } + } + } + } + }, "/article-approvals": { "get": { "security": [ @@ -8368,6 +8684,56 @@ } } }, + "request.AdvertisementCreateRequest": { + "type": "object", + "required": [ + "description", + "placement", + "redirectLink", + "title" + ], + "properties": { + "description": { + "type": "string" + }, + "placement": { + "type": "string" + }, + "redirectLink": { + "type": "string" + }, + "title": { + "type": "string" + } + } + }, + "request.AdvertisementUpdateRequest": { + "type": "object", + "required": [ + "description", + "id", + "placement", + "redirectLink", + "title" + ], + "properties": { + "description": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "placement": { + "type": "string" + }, + "redirectLink": { + "type": "string" + }, + "title": { + "type": "string" + } + } + }, "request.ArticleApprovalsCreateRequest": { "type": "object", "required": [ diff --git a/docs/swagger/swagger.yaml b/docs/swagger/swagger.yaml index 3c893cb..9b54328 100644 --- a/docs/swagger/swagger.yaml +++ b/docs/swagger/swagger.yaml @@ -49,6 +49,41 @@ definitions: - id - url type: object + request.AdvertisementCreateRequest: + properties: + description: + type: string + placement: + type: string + redirectLink: + type: string + title: + type: string + required: + - description + - placement + - redirectLink + - title + type: object + request.AdvertisementUpdateRequest: + properties: + description: + type: string + id: + type: integer + placement: + type: string + redirectLink: + type: string + title: + type: string + required: + - description + - id + - placement + - redirectLink + - title + type: object request.ArticleApprovalsCreateRequest: properties: articleId: @@ -1067,6 +1102,205 @@ paths: summary: update ActivityLogs tags: - ActivityLogs + /advertisement: + get: + description: API for getting all Advertisement + parameters: + - in: query + name: description + type: string + - in: query + name: placement + type: string + - in: query + name: redirectLink + type: string + - in: query + name: statusId + type: integer + - in: query + name: title + type: string + - in: query + name: count + type: integer + - in: query + name: limit + type: integer + - in: query + name: nextPage + type: integer + - in: query + name: page + type: integer + - in: query + name: previousPage + type: integer + - in: query + name: sort + type: string + - in: query + name: sortBy + type: string + - in: query + name: totalPage + type: integer + responses: + "200": + description: OK + schema: + $ref: '#/definitions/response.Response' + "400": + description: Bad Request + schema: + $ref: '#/definitions/response.BadRequestError' + "401": + description: Unauthorized + schema: + $ref: '#/definitions/response.UnauthorizedError' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/response.InternalServerError' + security: + - Bearer: [] + summary: Get all Advertisement + tags: + - Advertisement + post: + description: API for create Advertisement + parameters: + - default: Bearer + description: Insert your access token + in: header + name: Authorization + required: true + type: string + - description: Required payload + in: body + name: payload + required: true + schema: + $ref: '#/definitions/request.AdvertisementCreateRequest' + responses: + "200": + description: OK + schema: + $ref: '#/definitions/response.Response' + "400": + description: Bad Request + schema: + $ref: '#/definitions/response.BadRequestError' + "401": + description: Unauthorized + schema: + $ref: '#/definitions/response.UnauthorizedError' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/response.InternalServerError' + security: + - Bearer: [] + summary: Create Advertisement + tags: + - Advertisement + /advertisement/{id}: + delete: + description: API for delete Advertisement + parameters: + - description: Advertisement ID + in: path + name: id + required: true + type: integer + responses: + "200": + description: OK + schema: + $ref: '#/definitions/response.Response' + "400": + description: Bad Request + schema: + $ref: '#/definitions/response.BadRequestError' + "401": + description: Unauthorized + schema: + $ref: '#/definitions/response.UnauthorizedError' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/response.InternalServerError' + security: + - Bearer: [] + summary: delete Advertisement + tags: + - Advertisement + get: + description: API for getting one Advertisement + parameters: + - description: Advertisement ID + in: path + name: id + required: true + type: integer + responses: + "200": + description: OK + schema: + $ref: '#/definitions/response.Response' + "400": + description: Bad Request + schema: + $ref: '#/definitions/response.BadRequestError' + "401": + description: Unauthorized + schema: + $ref: '#/definitions/response.UnauthorizedError' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/response.InternalServerError' + security: + - Bearer: [] + summary: Get one Advertisement + tags: + - Advertisement + put: + description: API for update Advertisement + parameters: + - description: Required payload + in: body + name: payload + required: true + schema: + $ref: '#/definitions/request.AdvertisementUpdateRequest' + - description: Advertisement ID + in: path + name: id + required: true + type: integer + responses: + "200": + description: OK + schema: + $ref: '#/definitions/response.Response' + "400": + description: Bad Request + schema: + $ref: '#/definitions/response.BadRequestError' + "401": + description: Unauthorized + schema: + $ref: '#/definitions/response.UnauthorizedError' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/response.InternalServerError' + security: + - Bearer: [] + summary: update Advertisement + tags: + - Advertisement /article-approvals: get: description: API for getting all ArticleApprovals diff --git a/main.go b/main.go index 1e413a8..177822a 100644 --- a/main.go +++ b/main.go @@ -5,6 +5,7 @@ import ( "go-humas-be/app/database" "go-humas-be/app/middleware" "go-humas-be/app/module/activity_logs" + "go-humas-be/app/module/advertisement" "go-humas-be/app/module/article_approvals" "go-humas-be/app/module/article_categories" "go-humas-be/app/module/article_category_details" @@ -58,6 +59,7 @@ func main() { // provide modules activity_logs.NewActivityLogsModule, + advertisement.NewAdvertisementModule, article_categories.NewArticleCategoriesModule, article_category_details.NewArticleCategoryDetailsModule, article_files.NewArticleFilesModule,