feat: add ppid data approval

This commit is contained in:
hanif salafi 2024-05-05 16:43:53 +07:00
parent 7a152d330e
commit 1163fd1329
13 changed files with 579 additions and 15 deletions

View File

@ -0,0 +1,7 @@
package entity
type MasterApprovalStatuses struct {
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
Name string `json:"name" gorm:"type:varchar"`
IsActive bool `json:"is_active" gorm:"type:bool"`
}

View File

@ -0,0 +1,15 @@
package entity
import "time"
type PpidDataApprovalHistories struct {
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
Message string `json:"message" gorm:"type:varchar"`
ApprovalStatusId int `json:"approval_status_id" gorm:"type:int4"`
PpidDataId int `json:"ppid_data_id" gorm:"type:int4"`
ApprovalBy int `json:"approval_by" gorm:"type:int4"`
ApprovalAtLevel int `json:"approval_at_level" gorm:"type:int4"`
IsActive bool `json:"is_active" gorm:"type:bool"`
CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`
}

View File

@ -3,18 +3,21 @@ package entity
import "time" import "time"
type PpidDatas struct { type PpidDatas struct {
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
Title string `json:"title" gorm:"type:varchar"` Title string `json:"title" gorm:"type:varchar"`
Description string `json:"description" gorm:"type:varchar"` Description string `json:"description" gorm:"type:varchar"`
Slug string `json:"slug" gorm:"type:varchar"` Slug string `json:"slug" gorm:"type:varchar"`
CategoryId uint `json:"category_id" gorm:"type:int4"` CategoryId uint `json:"category_id" gorm:"type:int4"`
CreatedById *uint `json:"created_by_id" gorm:"type:int4"` CreatedById *uint `json:"created_by_id" gorm:"type:int4"`
LevelGroupId *int `json:"level_group_id" gorm:"type:int4"` LevelGroupId *int `json:"level_group_id" gorm:"type:int4"`
Group *string `json:"group" gorm:"type:varchar"` Group *string `json:"group" gorm:"type:varchar"`
StatusId int `json:"status_id" gorm:"type:int4"` StatusId int `json:"status_id" gorm:"type:int4"`
IsPublish *bool `json:"is_publish" gorm:"type:bool;default:false"` NeedApprovalFrom *int `json:"need_approval_from" gorm:"type:int4"`
PublishedAt *time.Time `json:"published_at" gorm:"type:timestamp"` BackApprovalTo *int `json:"back_approval_to" gorm:"type:int4"`
IsActive *bool `json:"is_active" gorm:"type:bool;default:true"` IsPublish *bool `json:"is_publish" gorm:"type:bool;default:false"`
CreatedAt time.Time `json:"created_at" gorm:"default:now()"` PublishLevel *int `json:"publish_level" gorm:"type:int4"`
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` PublishedAt *time.Time `json:"published_at" gorm:"type:timestamp"`
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()"`
} }

View File

@ -0,0 +1,45 @@
package seeds
import (
"go-humas-be/app/database/entity"
"gorm.io/gorm"
)
type MasterApprovalStatusesSeeder struct{}
var masterApprovalStatuses = []entity.MasterApprovalStatuses{
{
ID: 1,
Name: "Accepted",
IsActive: true,
},
{
ID: 2,
Name: "Need Update",
IsActive: true,
},
{
ID: 3,
Name: "Rejected",
IsActive: true,
},
}
func (MasterApprovalStatusesSeeder) Seed(conn *gorm.DB) error {
for _, row := range masterApprovalStatuses {
if err := conn.Create(&row).Error; err != nil {
return err
}
}
return nil
}
func (MasterApprovalStatusesSeeder) Count(conn *gorm.DB) (int, error) {
var count int64
if err := conn.Model(&entity.MasterApprovalStatuses{}).Count(&count).Error; err != nil {
return 0, err
}
return int(count), nil
}

View File

@ -0,0 +1,13 @@
package controller
import "go-humas-be/app/module/ppid_data_approval_histories/service"
type Controller struct {
PpidDataApprovalHistories PpidDataApprovalHistoriesController
}
func NewController(PpidDataApprovalHistoriesService service.PpidDataApprovalHistoriesService) *Controller {
return &Controller{
PpidDataApprovalHistories: NewPpidDataApprovalHistoriesController(PpidDataApprovalHistoriesService),
}
}

View File

@ -0,0 +1,181 @@
package controller
import (
"github.com/gofiber/fiber/v2"
"go-humas-be/app/module/ppid_data_approval_histories/request"
"go-humas-be/app/module/ppid_data_approval_histories/service"
"go-humas-be/utils/paginator"
"strconv"
utilRes "go-humas-be/utils/response"
utilVal "go-humas-be/utils/validator"
)
type ppidDataApprovalHistoriesController struct {
ppidDataApprovalHistoriesService service.PpidDataApprovalHistoriesService
}
type PpidDataApprovalHistoriesController 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 NewPpidDataApprovalHistoriesController(ppidDataApprovalHistoriesService service.PpidDataApprovalHistoriesService) PpidDataApprovalHistoriesController {
return &ppidDataApprovalHistoriesController{
ppidDataApprovalHistoriesService: ppidDataApprovalHistoriesService,
}
}
// All get all PpidDataApprovalHistories
// @Summary Get all PpidDataApprovalHistories
// @Description API for getting all PpidDataApprovalHistories
// @Tags Task
// @Security Bearer
// @Success 200 {object} response.Response
// @Failure 401 {object} response.Response
// @Failure 404 {object} response.Response
// @Failure 422 {object} response.Response
// @Failure 500 {object} response.Response
// @Router /ppid-data-approval-histories [get]
func (_i *ppidDataApprovalHistoriesController) All(c *fiber.Ctx) error {
paginate, err := paginator.Paginate(c)
if err != nil {
return err
}
var req request.PpidDataApprovalHistoriesQueryRequest
req.Pagination = paginate
ppidDataApprovalHistoriesData, paging, err := _i.ppidDataApprovalHistoriesService.All(req)
if err != nil {
return err
}
return utilRes.Resp(c, utilRes.Response{
Messages: utilRes.Messages{"PpidDataApprovalHistories list successfully retrieved"},
Data: ppidDataApprovalHistoriesData,
Meta: paging,
})
}
// Show get one PpidDataApprovalHistories
// @Summary Get one PpidDataApprovalHistories
// @Description API for getting one PpidDataApprovalHistories
// @Tags Task
// @Security Bearer
// @Param id path int true "PpidDataApprovalHistories ID"
// @Success 200 {object} response.Response
// @Failure 401 {object} response.Response
// @Failure 404 {object} response.Response
// @Failure 422 {object} response.Response
// @Failure 500 {object} response.Response
// @Router /ppid-data-approval-histories/:id [get]
func (_i *ppidDataApprovalHistoriesController) Show(c *fiber.Ctx) error {
id, err := strconv.ParseUint(c.Params("id"), 10, 0)
if err != nil {
return err
}
ppidDataApprovalHistoriesData, err := _i.ppidDataApprovalHistoriesService.Show(uint(id))
if err != nil {
return err
}
return utilRes.Resp(c, utilRes.Response{
Messages: utilRes.Messages{"PpidDataApprovalHistories successfully retrieved"},
Data: ppidDataApprovalHistoriesData,
})
}
// Save create PpidDataApprovalHistories
// @Summary Create PpidDataApprovalHistories
// @Description API for create PpidDataApprovalHistories
// @Tags Task
// @Security Bearer
// @Body request.PpidDataApprovalHistoriesCreateRequest
// @Success 200 {object} response.Response
// @Failure 401 {object} response.Response
// @Failure 404 {object} response.Response
// @Failure 422 {object} response.Response
// @Failure 500 {object} response.Response
// @Router /ppid-data-approval-histories [post]
func (_i *ppidDataApprovalHistoriesController) Save(c *fiber.Ctx) error {
req := new(request.PpidDataApprovalHistoriesCreateRequest)
if err := utilVal.ParseAndValidate(c, req); err != nil {
return err
}
err := _i.ppidDataApprovalHistoriesService.Save(*req)
if err != nil {
return err
}
return utilRes.Resp(c, utilRes.Response{
Messages: utilRes.Messages{"PpidDataApprovalHistories successfully created"},
})
}
// Update update PpidDataApprovalHistories
// @Summary update PpidDataApprovalHistories
// @Description API for update PpidDataApprovalHistories
// @Tags Task
// @Security Bearer
// @Body request.PpidDataApprovalHistoriesUpdateRequest
// @Param id path int true "PpidDataApprovalHistories ID"
// @Success 200 {object} response.Response
// @Failure 401 {object} response.Response
// @Failure 404 {object} response.Response
// @Failure 422 {object} response.Response
// @Failure 500 {object} response.Response
// @Router /ppid-data-approval-histories/:id [put]
func (_i *ppidDataApprovalHistoriesController) Update(c *fiber.Ctx) error {
id, err := strconv.ParseUint(c.Params("id"), 10, 0)
if err != nil {
return err
}
req := new(request.PpidDataApprovalHistoriesUpdateRequest)
if err := utilVal.ParseAndValidate(c, req); err != nil {
return err
}
err = _i.ppidDataApprovalHistoriesService.Update(uint(id), *req)
if err != nil {
return err
}
return utilRes.Resp(c, utilRes.Response{
Messages: utilRes.Messages{"PpidDataApprovalHistories successfully updated"},
})
}
// Delete delete PpidDataApprovalHistories
// @Summary delete PpidDataApprovalHistories
// @Description API for delete PpidDataApprovalHistories
// @Tags Task
// @Security Bearer
// @Param id path int true "PpidDataApprovalHistories ID"
// @Success 200 {object} response.Response
// @Failure 401 {object} response.Response
// @Failure 404 {object} response.Response
// @Failure 422 {object} response.Response
// @Failure 500 {object} response.Response
// @Router /ppid-data-approval-histories/:id [delete]
func (_i *ppidDataApprovalHistoriesController) Delete(c *fiber.Ctx) error {
id, err := strconv.ParseUint(c.Params("id"), 10, 0)
if err != nil {
return err
}
err = _i.ppidDataApprovalHistoriesService.Delete(uint(id))
if err != nil {
return err
}
return utilRes.Resp(c, utilRes.Response{
Messages: utilRes.Messages{"PpidDataApprovalHistories successfully deleted"},
})
}

View File

@ -0,0 +1,23 @@
package mapper
import (
"go-humas-be/app/database/entity"
res "go-humas-be/app/module/ppid_data_approval_histories/response"
)
func PpidDataApprovalHistoriesResponseMapper(ppidDataApprovalHistoriesReq *entity.PpidDataApprovalHistories) (ppidDataApprovalHistoriesRes *res.PpidDataApprovalHistoriesResponse) {
if ppidDataApprovalHistoriesReq != nil {
ppidDataApprovalHistoriesRes = &res.PpidDataApprovalHistoriesResponse{
ID: ppidDataApprovalHistoriesReq.ID,
Message: ppidDataApprovalHistoriesReq.Message,
ApprovalStatusId: ppidDataApprovalHistoriesReq.ApprovalStatusId,
PpidDataId: ppidDataApprovalHistoriesReq.PpidDataId,
ApprovalBy: ppidDataApprovalHistoriesReq.ApprovalBy,
ApprovalAtLevel: ppidDataApprovalHistoriesReq.ApprovalAtLevel,
IsActive: ppidDataApprovalHistoriesReq.IsActive,
CreatedAt: ppidDataApprovalHistoriesReq.CreatedAt,
UpdatedAt: ppidDataApprovalHistoriesReq.UpdatedAt,
}
}
return ppidDataApprovalHistoriesRes
}

View File

@ -0,0 +1,53 @@
package ppid_data_approval_histories
import (
"github.com/gofiber/fiber/v2"
"go-humas-be/app/module/ppid_data_approval_histories/controller"
"go-humas-be/app/module/ppid_data_approval_histories/repository"
"go-humas-be/app/module/ppid_data_approval_histories/service"
"go.uber.org/fx"
)
// struct of PpidDataApprovalHistoriesRouter
type PpidDataApprovalHistoriesRouter struct {
App fiber.Router
Controller *controller.Controller
}
// register bulky of PpidDataApprovalHistories module
var NewPpidDataApprovalHistoriesModule = fx.Options(
// register repository of PpidDataApprovalHistories module
fx.Provide(repository.NewPpidDataApprovalHistoriesRepository),
// register service of PpidDataApprovalHistories module
fx.Provide(service.NewPpidDataApprovalHistoriesService),
// register controller of PpidDataApprovalHistories module
fx.Provide(controller.NewController),
// register router of PpidDataApprovalHistories module
fx.Provide(NewPpidDataApprovalHistoriesRouter),
)
// init PpidDataApprovalHistoriesRouter
func NewPpidDataApprovalHistoriesRouter(fiber *fiber.App, controller *controller.Controller) *PpidDataApprovalHistoriesRouter {
return &PpidDataApprovalHistoriesRouter{
App: fiber,
Controller: controller,
}
}
// register routes of PpidDataApprovalHistories module
func (_i *PpidDataApprovalHistoriesRouter) RegisterPpidDataApprovalHistoriesRoutes() {
// define controllers
ppidDataApprovalHistoriesController := _i.Controller.PpidDataApprovalHistories
// define routes
_i.App.Route("/ppid-data-approval-histories", func(router fiber.Router) {
router.Get("/", ppidDataApprovalHistoriesController.All)
router.Get("/:id", ppidDataApprovalHistoriesController.Show)
router.Post("/", ppidDataApprovalHistoriesController.Save)
router.Put("/:id", ppidDataApprovalHistoriesController.Update)
router.Delete("/:id", ppidDataApprovalHistoriesController.Delete)
})
}

View File

@ -0,0 +1,69 @@
package repository
import (
"go-humas-be/app/database"
"go-humas-be/app/database/entity"
"go-humas-be/app/module/ppid_data_approval_histories/request"
"go-humas-be/utils/paginator"
)
type ppidDataApprovalHistoriesRepository struct {
DB *database.Database
}
// PpidDataApprovalHistoriesRepository define interface of IPpidDataApprovalHistoriesRepository
type PpidDataApprovalHistoriesRepository interface {
GetAll(req request.PpidDataApprovalHistoriesQueryRequest) (ppidDataApprovalHistoriess []*entity.PpidDataApprovalHistories, paging paginator.Pagination, err error)
FindOne(id uint) (ppidDataApprovalHistories *entity.PpidDataApprovalHistories, err error)
Create(ppidDataApprovalHistories *entity.PpidDataApprovalHistories) (err error)
Update(id uint, ppidDataApprovalHistories *entity.PpidDataApprovalHistories) (err error)
Delete(id uint) (err error)
}
func NewPpidDataApprovalHistoriesRepository(db *database.Database) PpidDataApprovalHistoriesRepository {
return &ppidDataApprovalHistoriesRepository{
DB: db,
}
}
// implement interface of IPpidDataApprovalHistoriesRepository
func (_i *ppidDataApprovalHistoriesRepository) GetAll(req request.PpidDataApprovalHistoriesQueryRequest) (ppidDataApprovalHistoriess []*entity.PpidDataApprovalHistories, paging paginator.Pagination, err error) {
var count int64
query := _i.DB.DB.Model(&entity.PpidDataApprovalHistories{})
query.Count(&count)
req.Pagination.Count = count
req.Pagination = paginator.Paging(req.Pagination)
err = query.Offset(req.Pagination.Offset).Limit(req.Pagination.Limit).Find(&ppidDataApprovalHistoriess).Error
if err != nil {
return
}
paging = *req.Pagination
return
}
func (_i *ppidDataApprovalHistoriesRepository) FindOne(id uint) (ppidDataApprovalHistories *entity.PpidDataApprovalHistories, err error) {
if err := _i.DB.DB.First(&ppidDataApprovalHistories, id).Error; err != nil {
return nil, err
}
return ppidDataApprovalHistories, nil
}
func (_i *ppidDataApprovalHistoriesRepository) Create(ppidDataApprovalHistories *entity.PpidDataApprovalHistories) (err error) {
return _i.DB.DB.Create(ppidDataApprovalHistories).Error
}
func (_i *ppidDataApprovalHistoriesRepository) Update(id uint, ppidDataApprovalHistories *entity.PpidDataApprovalHistories) (err error) {
return _i.DB.DB.Model(&entity.PpidDataApprovalHistories{}).
Where(&entity.PpidDataApprovalHistories{ID: id}).
Updates(ppidDataApprovalHistories).Error
}
func (_i *ppidDataApprovalHistoriesRepository) Delete(id uint) error {
return _i.DB.DB.Delete(&entity.PpidDataApprovalHistories{}, id).Error
}

View File

@ -0,0 +1,67 @@
package request
import (
"go-humas-be/app/database/entity"
"go-humas-be/utils/paginator"
"time"
)
type PpidDataApprovalHistoriesGeneric interface {
ToEntity()
}
type PpidDataApprovalHistoriesQueryRequest struct {
Message string `json:"message" validate:"required"`
ApprovalStatusId int `json:"approval_status_id" validate:"required"`
PpidDataId int `json:"ppid_data_id" validate:"required"`
ApprovalBy int `json:"approval_by" validate:"required"`
ApprovalAtLevel int `json:"approval_at_level" validate:"required"`
IsActive bool `json:"is_active" validate:"required"`
Pagination *paginator.Pagination `json:"pagination"`
}
type PpidDataApprovalHistoriesCreateRequest struct {
Message string `json:"message" validate:"required"`
ApprovalStatusId int `json:"approval_status_id" validate:"required"`
PpidDataId int `json:"ppid_data_id" validate:"required"`
ApprovalBy int `json:"approval_by" validate:"required"`
ApprovalAtLevel int `json:"approval_at_level" validate:"required"`
IsActive bool `json:"is_active" validate:"required"`
}
func (req PpidDataApprovalHistoriesCreateRequest) ToEntity() *entity.PpidDataApprovalHistories {
return &entity.PpidDataApprovalHistories{
Message: req.Message,
ApprovalStatusId: req.ApprovalStatusId,
PpidDataId: req.PpidDataId,
ApprovalBy: req.ApprovalBy,
ApprovalAtLevel: req.ApprovalAtLevel,
IsActive: req.IsActive,
}
}
type PpidDataApprovalHistoriesUpdateRequest struct {
ID uint `json:"id" validate:"required"`
Message string `json:"message" validate:"required"`
ApprovalStatusId int `json:"approval_status_id" validate:"required"`
PpidDataId int `json:"ppid_data_id" validate:"required"`
ApprovalBy int `json:"approval_by" validate:"required"`
ApprovalAtLevel int `json:"approval_at_level" validate:"required"`
IsActive bool `json:"is_active" validate:"required"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
func (req PpidDataApprovalHistoriesUpdateRequest) ToEntity() *entity.PpidDataApprovalHistories {
return &entity.PpidDataApprovalHistories{
ID: req.ID,
Message: req.Message,
ApprovalStatusId: req.ApprovalStatusId,
PpidDataId: req.PpidDataId,
ApprovalBy: req.ApprovalBy,
ApprovalAtLevel: req.ApprovalAtLevel,
IsActive: req.IsActive,
CreatedAt: req.CreatedAt,
UpdatedAt: req.UpdatedAt,
}
}

View File

@ -0,0 +1,15 @@
package response
import "time"
type PpidDataApprovalHistoriesResponse struct {
ID uint `json:"id"`
Message string `json:"message"`
ApprovalStatusId int `json:"approval_status_id"`
PpidDataId int `json:"ppid_data_id"`
ApprovalBy int `json:"approval_by"`
ApprovalAtLevel int `json:"approval_at_level"`
IsActive bool `json:"is_active"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}

View File

@ -0,0 +1,72 @@
package service
import (
"github.com/rs/zerolog"
"go-humas-be/app/module/ppid_data_approval_histories/mapper"
"go-humas-be/app/module/ppid_data_approval_histories/repository"
"go-humas-be/app/module/ppid_data_approval_histories/request"
"go-humas-be/app/module/ppid_data_approval_histories/response"
"go-humas-be/utils/paginator"
)
// PpidDataApprovalHistoriesService
type ppidDataApprovalHistoriesService struct {
Repo repository.PpidDataApprovalHistoriesRepository
Log zerolog.Logger
}
// PpidDataApprovalHistoriesService define interface of IPpidDataApprovalHistoriesService
type PpidDataApprovalHistoriesService interface {
All(req request.PpidDataApprovalHistoriesQueryRequest) (ppidDataApprovalHistories []*response.PpidDataApprovalHistoriesResponse, paging paginator.Pagination, err error)
Show(id uint) (ppidDataApprovalHistories *response.PpidDataApprovalHistoriesResponse, err error)
Save(req request.PpidDataApprovalHistoriesCreateRequest) (err error)
Update(id uint, req request.PpidDataApprovalHistoriesUpdateRequest) (err error)
Delete(id uint) error
}
// NewPpidDataApprovalHistoriesService init PpidDataApprovalHistoriesService
func NewPpidDataApprovalHistoriesService(repo repository.PpidDataApprovalHistoriesRepository, log zerolog.Logger) PpidDataApprovalHistoriesService {
return &ppidDataApprovalHistoriesService{
Repo: repo,
Log: log,
}
}
// All implement interface of PpidDataApprovalHistoriesService
func (_i *ppidDataApprovalHistoriesService) All(req request.PpidDataApprovalHistoriesQueryRequest) (ppidDataApprovalHistoriess []*response.PpidDataApprovalHistoriesResponse, paging paginator.Pagination, err error) {
results, paging, err := _i.Repo.GetAll(req)
if err != nil {
return
}
for _, result := range results {
ppidDataApprovalHistoriess = append(ppidDataApprovalHistoriess, mapper.PpidDataApprovalHistoriesResponseMapper(result))
}
return
}
func (_i *ppidDataApprovalHistoriesService) Show(id uint) (ppidDataApprovalHistories *response.PpidDataApprovalHistoriesResponse, err error) {
result, err := _i.Repo.FindOne(id)
if err != nil {
return nil, err
}
return mapper.PpidDataApprovalHistoriesResponseMapper(result), nil
}
func (_i *ppidDataApprovalHistoriesService) Save(req request.PpidDataApprovalHistoriesCreateRequest) (err error) {
_i.Log.Info().Interface("data", req).Msg("")
return _i.Repo.Create(req.ToEntity())
}
func (_i *ppidDataApprovalHistoriesService) Update(id uint, req request.PpidDataApprovalHistoriesUpdateRequest) (err error) {
_i.Log.Info().Interface("data", req).Msg("")
return _i.Repo.Update(id, req.ToEntity())
}
func (_i *ppidDataApprovalHistoriesService) Delete(id uint) error {
return _i.Repo.Delete(id)
}

View File

@ -119,7 +119,8 @@ func Start(lifecycle fx.Lifecycle, cfg *config.Config, fiber *fiber.App, router
// init seed models // init seed models
masterStatusSeeder := seeds.MasterStatusesSeeder{} masterStatusSeeder := seeds.MasterStatusesSeeder{}
allSeeders := []database.Seeder{masterStatusSeeder} masterApprovalStatusSeeder := seeds.MasterApprovalStatusesSeeder{}
allSeeders := []database.Seeder{masterStatusSeeder, masterApprovalStatusSeeder}
db.SeedModels(allSeeders) db.SeedModels(allSeeders)
} }