feat: initial commit

This commit is contained in:
hanif salafi 2024-03-06 02:15:53 +07:00
commit 07064f13ce
205 changed files with 24655 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/vendor

8
.idea/.gitignore vendored Normal file
View File

@ -0,0 +1,8 @@
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

1
.idea/.name Normal file
View File

@ -0,0 +1 @@
go-humas-be

9
.idea/go-humas-be.iml Normal file
View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4">
<component name="Go" enabled="true" />
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

8
.idea/modules.xml Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/../go-humas-be/.idea/go-humas-be.iml" filepath="$PROJECT_DIR$/../go-humas-be/.idea/go-humas-be.iml" />
</modules>
</component>
</project>

6
.idea/vcs.xml Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

View File

@ -0,0 +1,20 @@
package entity
import "time"
type ArticleCategories struct {
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
Title string `json:"title" gorm:"type:varchar"`
Description string `json:"description" gorm:"type:varchar"`
ThumbnailPath string `json:"thumbnail_path" gorm:"type:varchar"`
ThumbnailUrl string `json:"thumbnail_url" gorm:"type:varchar"`
ParentId int `json:"parent_id" gorm:"type:int4"`
CreatedById int `json:"created_by_id" gorm:"type:int4"`
StatusId int `json:"status_id" gorm:"type:int4"`
IsPublish bool `json:"is_publish" gorm:"type:bool"`
PublishedAt time.Time `json:"published_at" gorm:"type:timestamp"`
IsEnabled bool `json:"is_enabled" gorm:"type:bool"`
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

@ -0,0 +1,12 @@
package entity
import "time"
type ArticleCategoryDetails struct {
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
ArticleId int `json:"article_id" gorm:"type:int4"`
CategoryId int `json:"category_id" 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

@ -0,0 +1,24 @@
package entity
import "time"
type ArticleFiles struct {
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
ArticleId int `json:"article_id" gorm:"type:int4"`
FilePath string `json:"file_path" gorm:"type:varchar"`
FileUrl string `json:"file_url" gorm:"type:varchar"`
FileName string `json:"file_name" gorm:"type:varchar"`
FileThumbnail string `json:"file_thumbnail" gorm:"type:varchar"`
FileAlt string `json:"file_alt" gorm:"type:varchar"`
WidthPixel string `json:"width_pixel" gorm:"type:varchar"`
HeightPixel string `json:"height_pixel" gorm:"type:varchar"`
Size string `json:"size" gorm:"type:varchar"`
DownloadCount int `json:"download_count" gorm:"type:int4"`
CreatedById int `json:"created_by_id" gorm:"type:int4"`
StatusId int `json:"status_id" gorm:"type:int4"`
IsPublish bool `json:"is_publish" gorm:"type:bool"`
PublishedAt time.Time `json:"published_at" gorm:"type:timestamp"`
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

@ -0,0 +1,26 @@
package entity
import "time"
type Articles struct {
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
Title string `json:"title" gorm:"type:varchar"`
Slug string `json:"slug" gorm:"type:varchar"`
Description string `json:"description" gorm:"type:varchar"`
HtmlDescription string `json:"html_description" gorm:"type:varchar"`
TypeId int `json:"type_id" gorm:"type:int4"`
Tags string `json:"tags" gorm:"type:varchar"`
ThumbnailPath string `json:"thumbnail_path" gorm:"type:varchar"`
ThumbnailUrl string `json:"thumbnail_url" gorm:"type:varchar"`
PageUrl string `json:"page_url" gorm:"type:varchar"`
CreatedById int `json:"created_by_id" gorm:"type:int4"`
ShareCount int `json:"share_count" gorm:"type:int4"`
ViewCount int `json:"view_count" gorm:"type:int4"`
DownloadCount int `json:"download_count" gorm:"type:int4"`
StatusId int `json:"status_id" gorm:"type:int4"`
IsPublish bool `json:"is_publish" gorm:"type:bool"`
PublishedAt time.Time `json:"published_at" gorm:"type:timestamp"`
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

@ -0,0 +1,7 @@
package entity
type Cities struct {
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
CityName string `json:"city_name" gorm:"type:varchar"`
ProvId int `json:"prov_id" gorm:"type:int4"`
}

View File

@ -0,0 +1,7 @@
package entity
type Districts struct {
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
DisNam string `json:"dis_nam" gorm:"type:varchar"`
CityId int `json:"city_id" gorm:"type:int4"`
}

View File

@ -0,0 +1,17 @@
package entity
import "time"
type MagazineFiles struct {
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
Title string `json:"title" gorm:"type:varchar"`
Description string `json:"description" gorm:"type:varchar"`
MagazineId int `json:"magazine_id" gorm:"type:int4"`
DownloadCount int `json:"download_count" gorm:"type:int4"`
StatusId int `json:"status_id" gorm:"type:int4"`
IsPublish bool `json:"is_publish" gorm:"type:bool"`
PublishedAt time.Time `json:"published_at" gorm:"type:timestamp"`
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

@ -0,0 +1,19 @@
package entity
import "time"
type Magazines struct {
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
Title string `json:"title" gorm:"type:varchar"`
Description string `json:"description" gorm:"type:varchar"`
ThumbnailPath string `json:"thumbnail_path" gorm:"type:varchar"`
ThumbnailUrl string `json:"thumbnail_url" gorm:"type:varchar"`
PageUrl string `json:"page_url" gorm:"type:varchar"`
CreatedById int `json:"created_by_id" gorm:"type:int4"`
StatusId int `json:"status_id" gorm:"type:int4"`
IsPublish bool `json:"is_publish" gorm:"type:bool"`
PublishedAt time.Time `json:"published_at" gorm:"type:timestamp"`
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

@ -0,0 +1,17 @@
package entity
import "time"
type MasterMenus struct {
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
Name string `json:"name" gorm:"type:varchar"`
Description string `json:"description" gorm:"type:varchar"`
ModuleId int `json:"module_id" gorm:"type:int4"`
ParentMenuId int `json:"parent_menu_id" gorm:"type:int4"`
Icon string `json:"icon" gorm:"type:varchar"`
Position int `json:"position" gorm:"type:int4"`
StatusId int `json:"status_id" 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

@ -0,0 +1,14 @@
package entity
import "time"
type MasterModules struct {
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
Name string `json:"name" gorm:"type:varchar"`
Description string `json:"description" gorm:"type:varchar"`
PathUrl string `json:"path_url" gorm:"type:varchar"`
StatusId int `json:"status_id" 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

@ -0,0 +1,7 @@
package entity
type MasterStatuses 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,13 @@
package entity
import "time"
type PpidDataCategories struct {
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
Title string `json:"title" gorm:"type:varchar"`
Description string `json:"description" gorm:"type:varchar"`
Slug string `json:"slug" gorm:"type:varchar"`
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

@ -0,0 +1,20 @@
package entity
import "time"
type PpidDataFiles struct {
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
Title string `json:"title" gorm:"type:varchar"`
PpidDataId int `json:"ppid_data_id" gorm:"type:int4"`
Description string `json:"description" gorm:"type:varchar"`
Unit string `json:"unit" gorm:"type:varchar"`
FileType string `json:"file_type" gorm:"type:varchar"`
DownloadCount int `json:"download_count" gorm:"type:int4"`
CreatedById int `json:"created_by_id" gorm:"type:int4"`
StatusId int `json:"status_id" gorm:"type:int4"`
IsPublish bool `json:"is_publish" gorm:"type:bool"`
PublishedAt time.Time `json:"published_at" gorm:"type:timestamp"`
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

@ -0,0 +1,17 @@
package entity
import "time"
type PpidDatas struct {
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
Title string `json:"title" gorm:"type:varchar"`
Description string `json:"description" gorm:"type:varchar"`
CategoryId int `json:"category_id" gorm:"type:int4"`
CreatedById int `json:"created_by_id" gorm:"type:int4"`
StatusId int `json:"status_id" gorm:"type:int4"`
IsPublish bool `json:"is_publish" gorm:"type:bool"`
PublishedAt time.Time `json:"published_at" gorm:"type:timestamp"`
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

@ -0,0 +1,9 @@
package entity
type Provinces struct {
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
ProvName string `json:"prov_name" gorm:"type:varchar"`
LocationId int `json:"location_id" gorm:"type:int4"`
Status int `json:"status" gorm:"type:int4"`
Timezone string `json:"timezone" gorm:"type:varchar"`
}

View File

@ -0,0 +1,15 @@
package entity
import "time"
type UserLevels struct {
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
Name string `json:"name" gorm:"type:varchar"`
AliasName string `json:"alias_name" gorm:"type:varchar"`
LevelNumber int `json:"level_number" gorm:"type:int4"`
ParentLevelId int `json:"parent_level_id" gorm:"type:int4"`
ProvinceId int `json:"province_id" 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

@ -0,0 +1,18 @@
package entity
import "time"
type UserRoleAccesses struct {
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
UserRoleId int `json:"user_role_id" gorm:"type:int4"`
MenuId int `json:"menu_id" gorm:"type:int4"`
IsViewEnabled bool `json:"is_view_enabled" gorm:"type:bool"`
IsInsertEnabled bool `json:"is_insert_enabled" gorm:"type:bool"`
IsUpdateEnabled bool `json:"is_update_enabled" gorm:"type:bool"`
IsDeleteEnabled bool `json:"is_delete_enabled" gorm:"type:bool"`
IsApprovalEnabled bool `json:"is_approval_enabled" gorm:"type:bool"`
IsAdminEnabled bool `json:"is_admin_enabled" gorm:"type:bool"`
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

@ -0,0 +1,16 @@
package entity
import "time"
type UserRoles struct {
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
Name string `json:"name" gorm:"type:varchar"`
Description string `json:"description" gorm:"type:varchar"`
Code string `json:"code" gorm:"type:varchar"`
LevelNumber int `json:"level_number" gorm:"type:int4"`
StatusId int `json:"status_id" gorm:"type:int4"`
CreatedById int `json:"created_by_id" 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

@ -0,0 +1,27 @@
package entity
import "time"
type Users struct {
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
Username string `json:"username" gorm:"type:varchar"`
Email string `json:"email" gorm:"type:varchar"`
Fullname string `json:"fullname" gorm:"type:varchar"`
Address string `json:"address" gorm:"type:varchar"`
PhoneNumber string `json:"phone_number" gorm:"type:varchar"`
WorkType string `json:"work_type" gorm:"type:varchar"`
GenderType string `json:"gender_type" gorm:"type:varchar"`
IdentityType string `json:"identity_type" gorm:"type:varchar"`
IdentityNumber string `json:"identity_number" gorm:"type:varchar"`
DateOfBirth string `json:"date_of_birth" gorm:"type:varchar"`
LastEducation string `json:"last_education" gorm:"type:varchar"`
KeycloakId string `json:"keycloak_id" gorm:"type:varchar"`
UserRoleId int `json:"user_role_id" gorm:"type:int4"`
StatusId int `json:"status_id" gorm:"type:int4"`
UserLevelsId int `json:"user_levels_id" gorm:"type:int4"`
CreatedById int `json:"created_by_id" gorm:"type:int4"`
ProfilePicturePath string `json:"profile_picture_path" gorm:"type:varchar"`
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

@ -0,0 +1,111 @@
package database
import (
"github.com/rs/zerolog"
"go-humas-be/app/database/entity"
"go-humas-be/config/config"
"gorm.io/driver/postgres"
"gorm.io/gorm"
)
// Database setup database with gorm
type Database struct {
DB *gorm.DB
Log zerolog.Logger
Cfg *config.Config
}
type Seeder interface {
Seed(*gorm.DB) error
Count(*gorm.DB) (int, error)
}
func NewDatabase(cfg *config.Config, log zerolog.Logger) *Database {
db := &Database{
Cfg: cfg,
Log: log,
}
return db
}
// ConnectDatabase connect database
func (_db *Database) ConnectDatabase() {
conn, err := gorm.Open(postgres.Open(_db.Cfg.DB.Postgres.DSN), &gorm.Config{})
if err != nil {
_db.Log.Error().Err(err).Msg("An unknown error occurred when to connect the database!")
} else {
_db.Log.Info().Msg("Connected the database succesfully!")
}
_db.DB = conn
}
// ShutdownDatabase shutdown database
func (_db *Database) ShutdownDatabase() {
sqlDB, err := _db.DB.DB()
if err != nil {
_db.Log.Error().Err(err).Msg("An unknown error occurred when to shutdown the database!")
} else {
_db.Log.Info().Msg("Shutdown the database succesfully!")
}
sqlDB.Close()
}
// MigrateModels migrate models
func (_db *Database) MigrateModels() {
err := _db.DB.AutoMigrate(
Models()...,
)
if err != nil {
_db.Log.Error().Err(err).Msg("An unknown error occurred when to migrate the database!")
} else {
_db.Log.Info().Msg("Migrate the database entity succesfully!")
}
}
// Models list of models for migration
func Models() []interface{} {
return []interface{}{
entity.ArticleCategories{},
entity.ArticleCategoryDetails{},
entity.ArticleFiles{},
entity.Cities{},
entity.Districts{},
entity.Magazines{},
entity.MagazineFiles{},
entity.MasterMenus{},
entity.MasterModules{},
entity.MasterStatuses{},
entity.PpidDatas{},
entity.PpidDataFiles{},
entity.PpidDataCategories{},
entity.Provinces{},
entity.UserLevels{},
entity.UserRoles{},
entity.UserRoleAccesses{},
entity.Users{},
}
}
// SeedModels seed data
func (_db *Database) SeedModels(seeder []Seeder) {
for _, seed := range seeder {
count, err := seed.Count(_db.DB)
if err != nil {
_db.Log.Error().Err(err).Msg("An unknown error occurred when to seed the database!")
}
if count == 0 {
if err := seed.Seed(_db.DB); err != nil {
_db.Log.Error().Err(err).Msg("An unknown error occurred when to seed the database!")
}
_db.Log.Info().Msg("Seeded the database successfully!")
} else {
_db.Log.Info().Msg("Database is already seeded!")
}
}
_db.Log.Info().Msg("Seeded the database succesfully!")
}

View File

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

View File

@ -0,0 +1,61 @@
package middleware
import (
"go-humas-be/config/config"
"go-humas-be/utils"
"time"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/compress"
"github.com/gofiber/fiber/v2/middleware/limiter"
"github.com/gofiber/fiber/v2/middleware/monitor"
"github.com/gofiber/fiber/v2/middleware/pprof"
"github.com/gofiber/fiber/v2/middleware/recover"
)
// Middleware is a struct that contains all the middleware functions
type Middleware struct {
App *fiber.App
Cfg *config.Config
}
func NewMiddleware(app *fiber.App, cfg *config.Config) *Middleware {
return &Middleware{
App: app,
Cfg: cfg,
}
}
// Register registers all the middleware functions
func (m *Middleware) Register() {
// Add Extra Middlewares
m.App.Use(limiter.New(limiter.Config{
Next: utils.IsEnabled(m.Cfg.Middleware.Limiter.Enable),
Max: m.Cfg.Middleware.Limiter.Max,
Expiration: m.Cfg.Middleware.Limiter.Expiration * time.Second,
}))
m.App.Use(compress.New(compress.Config{
Next: utils.IsEnabled(m.Cfg.Middleware.Compress.Enable),
Level: m.Cfg.Middleware.Compress.Level,
}))
m.App.Use(recover.New(recover.Config{
Next: utils.IsEnabled(m.Cfg.Middleware.Recover.Enable),
}))
m.App.Use(pprof.New(pprof.Config{
Next: utils.IsEnabled(m.Cfg.Middleware.Pprof.Enable),
}))
//m.App.Use(filesystem.New(filesystem.Config{
// Next: utils.IsEnabled(m.Cfg.Middleware.FileSystem.Enable),
// Root: http.Dir(m.Cfg.Middleware.FileSystem.Root),
// Browse: m.Cfg.Middleware.FileSystem.Browse,
// MaxAge: m.Cfg.Middleware.FileSystem.MaxAge,
//}))
m.App.Get(m.Cfg.Middleware.Monitor.Path, monitor.New(monitor.Config{
Next: utils.IsEnabled(m.Cfg.Middleware.Monitor.Enable),
}))
}

View File

@ -0,0 +1,53 @@
package article_categories
import (
"github.com/gofiber/fiber/v2"
"go-humas-be/app/module/article_categories/controller"
"go-humas-be/app/module/article_categories/repository"
"go-humas-be/app/module/article_categories/service"
"go.uber.org/fx"
)
// struct of ArticleCategoriesRouter
type ArticleCategoriesRouter struct {
App fiber.Router
Controller *controller.Controller
}
// register bulky of ArticleCategories module
var NewArticleCategoriesModule = fx.Options(
// register repository of ArticleCategories module
fx.Provide(repository.NewArticleCategoriesRepository),
// register service of ArticleCategories module
fx.Provide(service.NewArticleCategoriesService),
// register controller of ArticleCategories module
fx.Provide(controller.NewController),
// register router of ArticleCategories module
fx.Provide(NewArticleCategoriesRouter),
)
// init ArticleCategoriesRouter
func NewArticleCategoriesRouter(fiber *fiber.App, controller *controller.Controller) *ArticleCategoriesRouter {
return &ArticleCategoriesRouter{
App: fiber,
Controller: controller,
}
}
// register routes of ArticleCategories module
func (_i *ArticleCategoriesRouter) RegisterArticleCategoriesRoutes() {
// define controllers
articleCategoriesController := _i.Controller.ArticleCategories
// define routes
_i.App.Route("/article-categories", func(router fiber.Router) {
router.Get("/", articleCategoriesController.All)
router.Get("/:id", articleCategoriesController.Show)
router.Post("/", articleCategoriesController.Save)
router.Put("/:id", articleCategoriesController.Update)
router.Delete("/:id", articleCategoriesController.Delete)
})
}

View File

@ -0,0 +1,181 @@
package controller
import (
"github.com/gofiber/fiber/v2"
"go-humas-be/app/module/article_categories/request"
"go-humas-be/app/module/article_categories/service"
"go-humas-be/utils/paginator"
"strconv"
utilRes "go-humas-be/utils/response"
utilVal "go-humas-be/utils/validator"
)
type articleCategoriesController struct {
articleCategoriesService service.ArticleCategoriesService
}
type ArticleCategoriesController 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 NewArticleCategoriesController(articleCategoriesService service.ArticleCategoriesService) ArticleCategoriesController {
return &articleCategoriesController{
articleCategoriesService: articleCategoriesService,
}
}
// All get all ArticleCategories
// @Summary Get all ArticleCategories
// @Description API for getting all ArticleCategories
// @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 /article-categories [get]
func (_i *articleCategoriesController) All(c *fiber.Ctx) error {
paginate, err := paginator.Paginate(c)
if err != nil {
return err
}
var req request.ArticleCategoriesQueryRequest
req.Pagination = paginate
articleCategoriesData, paging, err := _i.articleCategoriesService.All(req)
if err != nil {
return err
}
return utilRes.Resp(c, utilRes.Response{
Messages: utilRes.Messages{"ArticleCategories list successfully retrieved"},
Data: articleCategoriesData,
Meta: paging,
})
}
// Show get one ArticleCategories
// @Summary Get one ArticleCategories
// @Description API for getting one ArticleCategories
// @Tags Task
// @Security Bearer
// @Param id path int true "ArticleCategories 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 /article-categories/{id} [get]
func (_i *articleCategoriesController) Show(c *fiber.Ctx) error {
id, err := strconv.ParseUint(c.Params("id"), 10, 0)
if err != nil {
return err
}
articleCategoriesData, err := _i.articleCategoriesService.Show(uint(id))
if err != nil {
return err
}
return utilRes.Resp(c, utilRes.Response{
Messages: utilRes.Messages{"ArticleCategories successfully retrieved"},
Data: articleCategoriesData,
})
}
// Save create ArticleCategories
// @Summary Create ArticleCategories
// @Description API for create ArticleCategories
// @Tags Task
// @Security Bearer
// @Param payload body request.ArticleCategoriesCreateRequest true "Required payload"
// @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 /article-categories [post]
func (_i *articleCategoriesController) Save(c *fiber.Ctx) error {
req := new(request.ArticleCategoriesCreateRequest)
if err := utilVal.ParseAndValidate(c, req); err != nil {
return err
}
err := _i.articleCategoriesService.Save(*req)
if err != nil {
return err
}
return utilRes.Resp(c, utilRes.Response{
Messages: utilRes.Messages{"ArticleCategories successfully created"},
})
}
// Update update ArticleCategories
// @Summary update ArticleCategories
// @Description API for update ArticleCategories
// @Tags Task
// @Security Bearer
// @Param payload body request.ArticleCategoriesCreateRequest true "Required payload"
// @Param id path int true "ArticleCategories 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 /article-categories/{id} [put]
func (_i *articleCategoriesController) Update(c *fiber.Ctx) error {
id, err := strconv.ParseUint(c.Params("id"), 10, 0)
if err != nil {
return err
}
req := new(request.ArticleCategoriesUpdateRequest)
if err := utilVal.ParseAndValidate(c, req); err != nil {
return err
}
err = _i.articleCategoriesService.Update(uint(id), *req)
if err != nil {
return err
}
return utilRes.Resp(c, utilRes.Response{
Messages: utilRes.Messages{"ArticleCategories successfully updated"},
})
}
// Delete delete ArticleCategories
// @Summary delete ArticleCategories
// @Description API for delete ArticleCategories
// @Tags Task
// @Security Bearer
// @Param id path int true "ArticleCategories 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 /article-categories/{id} [delete]
func (_i *articleCategoriesController) Delete(c *fiber.Ctx) error {
id, err := strconv.ParseUint(c.Params("id"), 10, 0)
if err != nil {
return err
}
err = _i.articleCategoriesService.Delete(uint(id))
if err != nil {
return err
}
return utilRes.Resp(c, utilRes.Response{
Messages: utilRes.Messages{"ArticleCategories successfully deleted"},
})
}

View File

@ -0,0 +1,13 @@
package controller
import "go-humas-be/app/module/article_categories/service"
type Controller struct {
ArticleCategories ArticleCategoriesController
}
func NewController(ArticleCategoriesService service.ArticleCategoriesService) *Controller {
return &Controller{
ArticleCategories: NewArticleCategoriesController(ArticleCategoriesService),
}
}

View File

@ -0,0 +1,28 @@
package mapper
import (
"go-humas-be/app/database/entity"
res "go-humas-be/app/module/article_categories/response"
)
func ArticleCategoriesResponseMapper(articleCategoriesReq *entity.ArticleCategories) (articleCategoriesRes *res.ArticleCategoriesResponse) {
if articleCategoriesReq != nil {
articleCategoriesRes = &res.ArticleCategoriesResponse{
ID: articleCategoriesReq.ID,
Title: articleCategoriesReq.Title,
Description: articleCategoriesReq.Description,
ThumbnailPath: articleCategoriesReq.ThumbnailPath,
ThumbnailUrl: articleCategoriesReq.ThumbnailUrl,
ParentId: articleCategoriesReq.ParentId,
CreatedById: articleCategoriesReq.CreatedById,
StatusId: articleCategoriesReq.StatusId,
IsPublish: articleCategoriesReq.IsPublish,
PublishedAt: articleCategoriesReq.PublishedAt,
IsEnabled: articleCategoriesReq.IsEnabled,
IsActive: articleCategoriesReq.IsActive,
CreatedAt: articleCategoriesReq.CreatedAt,
UpdatedAt: articleCategoriesReq.UpdatedAt,
}
}
return articleCategoriesRes
}

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/article_categories/request"
"go-humas-be/utils/paginator"
)
type articleCategoriesRepository struct {
DB *database.Database
}
// ArticleCategoriesRepository define interface of IArticleCategoriesRepository
type ArticleCategoriesRepository interface {
GetAll(req request.ArticleCategoriesQueryRequest) (articleCategoriess []*entity.ArticleCategories, paging paginator.Pagination, err error)
FindOne(id uint) (articleCategories *entity.ArticleCategories, err error)
Create(articleCategories *entity.ArticleCategories) (err error)
Update(id uint, articleCategories *entity.ArticleCategories) (err error)
Delete(id uint) (err error)
}
func NewArticleCategoriesRepository(db *database.Database) ArticleCategoriesRepository {
return &articleCategoriesRepository{
DB: db,
}
}
// implement interface of IArticleCategoriesRepository
func (_i *articleCategoriesRepository) GetAll(req request.ArticleCategoriesQueryRequest) (articleCategoriess []*entity.ArticleCategories, paging paginator.Pagination, err error) {
var count int64
query := _i.DB.DB.Model(&entity.ArticleCategories{})
query.Count(&count)
req.Pagination.Count = count
req.Pagination = paginator.Paging(req.Pagination)
err = query.Offset(req.Pagination.Offset).Limit(req.Pagination.Limit).Find(&articleCategoriess).Error
if err != nil {
return
}
paging = *req.Pagination
return
}
func (_i *articleCategoriesRepository) FindOne(id uint) (articleCategories *entity.ArticleCategories, err error) {
if err := _i.DB.DB.First(&articleCategories, id).Error; err != nil {
return nil, err
}
return articleCategories, nil
}
func (_i *articleCategoriesRepository) Create(articleCategories *entity.ArticleCategories) (err error) {
return _i.DB.DB.Create(articleCategories).Error
}
func (_i *articleCategoriesRepository) Update(id uint, articleCategories *entity.ArticleCategories) (err error) {
return _i.DB.DB.Model(&entity.ArticleCategories{}).
Where(&entity.ArticleCategories{ID: id}).
Updates(articleCategories).Error
}
func (_i *articleCategoriesRepository) Delete(id uint) error {
return _i.DB.DB.Delete(&entity.ArticleCategories{}, id).Error
}

View File

@ -0,0 +1,92 @@
package request
import (
"go-humas-be/app/database/entity"
"go-humas-be/utils/paginator"
"time"
)
type ArticleCategoriesGeneric interface {
ToEntity()
}
type ArticleCategoriesQueryRequest struct {
Title string `json:"title" validate:"required"`
Description string `json:"description" validate:"required"`
ThumbnailPath string `json:"thumbnail_path" validate:"required"`
ThumbnailUrl string `json:"thumbnail_url" validate:"required"`
ParentId int `json:"parent_id" validate:"required"`
CreatedById int `json:"created_by_id" validate:"required"`
StatusId int `json:"status_id" validate:"required"`
IsPublish bool `json:"is_publish" validate:"required"`
PublishedAt time.Time `json:"published_at" validate:"required"`
IsEnabled bool `json:"is_enabled" validate:"required"`
IsActive bool `json:"is_active" validate:"required"`
Pagination *paginator.Pagination `json:"pagination"`
}
type ArticleCategoriesCreateRequest struct {
Title string `json:"title" validate:"required"`
Description string `json:"description" validate:"required"`
ThumbnailPath string `json:"thumbnail_path" validate:"required"`
ThumbnailUrl string `json:"thumbnail_url" validate:"required"`
ParentId int `json:"parent_id" validate:"required"`
CreatedById int `json:"created_by_id" validate:"required"`
StatusId int `json:"status_id" validate:"required"`
IsPublish bool `json:"is_publish" validate:"required"`
PublishedAt time.Time `json:"published_at" validate:"required"`
IsEnabled bool `json:"is_enabled" validate:"required"`
IsActive bool `json:"is_active" validate:"required"`
}
func (req ArticleCategoriesCreateRequest) ToEntity() *entity.ArticleCategories {
return &entity.ArticleCategories{
Title: req.Title,
Description: req.Description,
ThumbnailPath: req.ThumbnailPath,
ThumbnailUrl: req.ThumbnailUrl,
ParentId: req.ParentId,
CreatedById: req.CreatedById,
StatusId: req.StatusId,
IsPublish: req.IsPublish,
PublishedAt: req.PublishedAt,
IsEnabled: req.IsEnabled,
IsActive: req.IsActive,
}
}
type ArticleCategoriesUpdateRequest struct {
ID uint `json:"id" validate:"required"`
Title string `json:"title" validate:"required"`
Description string `json:"description" validate:"required"`
ThumbnailPath string `json:"thumbnail_path" validate:"required"`
ThumbnailUrl string `json:"thumbnail_url" validate:"required"`
ParentId int `json:"parent_id" validate:"required"`
CreatedById int `json:"created_by_id" validate:"required"`
StatusId int `json:"status_id" validate:"required"`
IsPublish bool `json:"is_publish" validate:"required"`
PublishedAt time.Time `json:"published_at" validate:"required"`
IsEnabled bool `json:"is_enabled" validate:"required"`
IsActive bool `json:"is_active" validate:"required"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
func (req ArticleCategoriesUpdateRequest) ToEntity() *entity.ArticleCategories {
return &entity.ArticleCategories{
ID: req.ID,
Title: req.Title,
Description: req.Description,
ThumbnailPath: req.ThumbnailPath,
ThumbnailUrl: req.ThumbnailUrl,
ParentId: req.ParentId,
CreatedById: req.CreatedById,
StatusId: req.StatusId,
IsPublish: req.IsPublish,
PublishedAt: req.PublishedAt,
IsEnabled: req.IsEnabled,
IsActive: req.IsActive,
CreatedAt: req.CreatedAt,
UpdatedAt: req.UpdatedAt,
}
}

View File

@ -0,0 +1,20 @@
package response
import "time"
type ArticleCategoriesResponse struct {
ID uint `json:"id"`
Title string `json:"title"`
Description string `json:"description"`
ThumbnailPath string `json:"thumbnail_path"`
ThumbnailUrl string `json:"thumbnail_url"`
ParentId int `json:"parent_id"`
CreatedById int `json:"created_by_id"`
StatusId int `json:"status_id"`
IsPublish bool `json:"is_publish"`
PublishedAt time.Time `json:"published_at"`
IsEnabled bool `json:"is_enabled"`
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/article_categories/mapper"
"go-humas-be/app/module/article_categories/repository"
"go-humas-be/app/module/article_categories/request"
"go-humas-be/app/module/article_categories/response"
"go-humas-be/utils/paginator"
)
// ArticleCategoriesService
type articleCategoriesService struct {
Repo repository.ArticleCategoriesRepository
Log zerolog.Logger
}
// ArticleCategoriesService define interface of IArticleCategoriesService
type ArticleCategoriesService interface {
All(req request.ArticleCategoriesQueryRequest) (articleCategories []*response.ArticleCategoriesResponse, paging paginator.Pagination, err error)
Show(id uint) (articleCategories *response.ArticleCategoriesResponse, err error)
Save(req request.ArticleCategoriesCreateRequest) (err error)
Update(id uint, req request.ArticleCategoriesUpdateRequest) (err error)
Delete(id uint) error
}
// NewArticleCategoriesService init ArticleCategoriesService
func NewArticleCategoriesService(repo repository.ArticleCategoriesRepository, log zerolog.Logger) ArticleCategoriesService {
return &articleCategoriesService{
Repo: repo,
Log: log,
}
}
// All implement interface of ArticleCategoriesService
func (_i *articleCategoriesService) All(req request.ArticleCategoriesQueryRequest) (articleCategoriess []*response.ArticleCategoriesResponse, paging paginator.Pagination, err error) {
results, paging, err := _i.Repo.GetAll(req)
if err != nil {
return
}
for _, result := range results {
articleCategoriess = append(articleCategoriess, mapper.ArticleCategoriesResponseMapper(result))
}
return
}
func (_i *articleCategoriesService) Show(id uint) (articleCategories *response.ArticleCategoriesResponse, err error) {
result, err := _i.Repo.FindOne(id)
if err != nil {
return nil, err
}
return mapper.ArticleCategoriesResponseMapper(result), nil
}
func (_i *articleCategoriesService) Save(req request.ArticleCategoriesCreateRequest) (err error) {
_i.Log.Info().Interface("data", req).Msg("")
return _i.Repo.Create(req.ToEntity())
}
func (_i *articleCategoriesService) Update(id uint, req request.ArticleCategoriesUpdateRequest) (err error) {
_i.Log.Info().Interface("data", req).Msg("")
return _i.Repo.Update(id, req.ToEntity())
}
func (_i *articleCategoriesService) Delete(id uint) error {
return _i.Repo.Delete(id)
}

View File

@ -0,0 +1,53 @@
package article_category_details
import (
"github.com/gofiber/fiber/v2"
"go-humas-be/app/module/article_category_details/controller"
"go-humas-be/app/module/article_category_details/repository"
"go-humas-be/app/module/article_category_details/service"
"go.uber.org/fx"
)
// struct of ArticleCategoryDetailsRouter
type ArticleCategoryDetailsRouter struct {
App fiber.Router
Controller *controller.Controller
}
// register bulky of ArticleCategoryDetails module
var NewArticleCategoryDetailsModule = fx.Options(
// register repository of ArticleCategoryDetails module
fx.Provide(repository.NewArticleCategoryDetailsRepository),
// register service of ArticleCategoryDetails module
fx.Provide(service.NewArticleCategoryDetailsService),
// register controller of ArticleCategoryDetails module
fx.Provide(controller.NewController),
// register router of ArticleCategoryDetails module
fx.Provide(NewArticleCategoryDetailsRouter),
)
// init ArticleCategoryDetailsRouter
func NewArticleCategoryDetailsRouter(fiber *fiber.App, controller *controller.Controller) *ArticleCategoryDetailsRouter {
return &ArticleCategoryDetailsRouter{
App: fiber,
Controller: controller,
}
}
// register routes of ArticleCategoryDetails module
func (_i *ArticleCategoryDetailsRouter) RegisterArticleCategoryDetailsRoutes() {
// define controllers
articleCategoryDetailsController := _i.Controller.ArticleCategoryDetails
// define routes
_i.App.Route("/article-category-details", func(router fiber.Router) {
router.Get("/", articleCategoryDetailsController.All)
router.Get("/:id", articleCategoryDetailsController.Show)
router.Post("/", articleCategoryDetailsController.Save)
router.Put("/:id", articleCategoryDetailsController.Update)
router.Delete("/:id", articleCategoryDetailsController.Delete)
})
}

View File

@ -0,0 +1,181 @@
package controller
import (
"github.com/gofiber/fiber/v2"
"go-humas-be/app/module/article_category_details/request"
"go-humas-be/app/module/article_category_details/service"
"go-humas-be/utils/paginator"
"strconv"
utilRes "go-humas-be/utils/response"
utilVal "go-humas-be/utils/validator"
)
type articleCategoryDetailsController struct {
articleCategoryDetailsService service.ArticleCategoryDetailsService
}
type ArticleCategoryDetailsController 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 NewArticleCategoryDetailsController(articleCategoryDetailsService service.ArticleCategoryDetailsService) ArticleCategoryDetailsController {
return &articleCategoryDetailsController{
articleCategoryDetailsService: articleCategoryDetailsService,
}
}
// All get all ArticleCategoryDetails
// @Summary Get all ArticleCategoryDetails
// @Description API for getting all ArticleCategoryDetails
// @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 /article-category-details [get]
func (_i *articleCategoryDetailsController) All(c *fiber.Ctx) error {
paginate, err := paginator.Paginate(c)
if err != nil {
return err
}
var req request.ArticleCategoryDetailsQueryRequest
req.Pagination = paginate
articleCategoryDetailsData, paging, err := _i.articleCategoryDetailsService.All(req)
if err != nil {
return err
}
return utilRes.Resp(c, utilRes.Response{
Messages: utilRes.Messages{"ArticleCategoryDetails list successfully retrieved"},
Data: articleCategoryDetailsData,
Meta: paging,
})
}
// Show get one ArticleCategoryDetails
// @Summary Get one ArticleCategoryDetails
// @Description API for getting one ArticleCategoryDetails
// @Tags Task
// @Security Bearer
// @Param id path int true "ArticleCategoryDetails 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 /article-category-details/{id} [get]
func (_i *articleCategoryDetailsController) Show(c *fiber.Ctx) error {
id, err := strconv.ParseUint(c.Params("id"), 10, 0)
if err != nil {
return err
}
articleCategoryDetailsData, err := _i.articleCategoryDetailsService.Show(uint(id))
if err != nil {
return err
}
return utilRes.Resp(c, utilRes.Response{
Messages: utilRes.Messages{"ArticleCategoryDetails successfully retrieved"},
Data: articleCategoryDetailsData,
})
}
// Save create ArticleCategoryDetails
// @Summary Create ArticleCategoryDetails
// @Description API for create ArticleCategoryDetails
// @Tags Task
// @Security Bearer
// @Body request.ArticleCategoryDetailsCreateRequest
// @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 /article-category-details [post]
func (_i *articleCategoryDetailsController) Save(c *fiber.Ctx) error {
req := new(request.ArticleCategoryDetailsCreateRequest)
if err := utilVal.ParseAndValidate(c, req); err != nil {
return err
}
err := _i.articleCategoryDetailsService.Save(*req)
if err != nil {
return err
}
return utilRes.Resp(c, utilRes.Response{
Messages: utilRes.Messages{"ArticleCategoryDetails successfully created"},
})
}
// Update update ArticleCategoryDetails
// @Summary update ArticleCategoryDetails
// @Description API for update ArticleCategoryDetails
// @Tags Task
// @Security Bearer
// @Body request.ArticleCategoryDetailsUpdateRequest
// @Param id path int true "ArticleCategoryDetails 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 /article-category-details/{id} [put]
func (_i *articleCategoryDetailsController) Update(c *fiber.Ctx) error {
id, err := strconv.ParseUint(c.Params("id"), 10, 0)
if err != nil {
return err
}
req := new(request.ArticleCategoryDetailsUpdateRequest)
if err := utilVal.ParseAndValidate(c, req); err != nil {
return err
}
err = _i.articleCategoryDetailsService.Update(uint(id), *req)
if err != nil {
return err
}
return utilRes.Resp(c, utilRes.Response{
Messages: utilRes.Messages{"ArticleCategoryDetails successfully updated"},
})
}
// Delete delete ArticleCategoryDetails
// @Summary delete ArticleCategoryDetails
// @Description API for delete ArticleCategoryDetails
// @Tags Task
// @Security Bearer
// @Param id path int true "ArticleCategoryDetails 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 /article-category-details/{id} [delete]
func (_i *articleCategoryDetailsController) Delete(c *fiber.Ctx) error {
id, err := strconv.ParseUint(c.Params("id"), 10, 0)
if err != nil {
return err
}
err = _i.articleCategoryDetailsService.Delete(uint(id))
if err != nil {
return err
}
return utilRes.Resp(c, utilRes.Response{
Messages: utilRes.Messages{"ArticleCategoryDetails successfully deleted"},
})
}

View File

@ -0,0 +1,13 @@
package controller
import "go-humas-be/app/module/article_category_details/service"
type Controller struct {
ArticleCategoryDetails ArticleCategoryDetailsController
}
func NewController(ArticleCategoryDetailsService service.ArticleCategoryDetailsService) *Controller {
return &Controller{
ArticleCategoryDetails: NewArticleCategoryDetailsController(ArticleCategoryDetailsService),
}
}

View File

@ -0,0 +1,20 @@
package mapper
import (
"go-humas-be/app/database/entity"
res "go-humas-be/app/module/article_category_details/response"
)
func ArticleCategoryDetailsResponseMapper(articleCategoryDetailsReq *entity.ArticleCategoryDetails) (articleCategoryDetailsRes *res.ArticleCategoryDetailsResponse) {
if articleCategoryDetailsReq != nil {
articleCategoryDetailsRes = &res.ArticleCategoryDetailsResponse{
ID: articleCategoryDetailsReq.ID,
ArticleId: articleCategoryDetailsReq.ArticleId,
CategoryId: articleCategoryDetailsReq.CategoryId,
IsActive: articleCategoryDetailsReq.IsActive,
CreatedAt: articleCategoryDetailsReq.CreatedAt,
UpdatedAt: articleCategoryDetailsReq.UpdatedAt,
}
}
return articleCategoryDetailsRes
}

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/article_category_details/request"
"go-humas-be/utils/paginator"
)
type articleCategoryDetailsRepository struct {
DB *database.Database
}
// ArticleCategoryDetailsRepository define interface of IArticleCategoryDetailsRepository
type ArticleCategoryDetailsRepository interface {
GetAll(req request.ArticleCategoryDetailsQueryRequest) (articleCategoryDetailss []*entity.ArticleCategoryDetails, paging paginator.Pagination, err error)
FindOne(id uint) (articleCategoryDetails *entity.ArticleCategoryDetails, err error)
Create(articleCategoryDetails *entity.ArticleCategoryDetails) (err error)
Update(id uint, articleCategoryDetails *entity.ArticleCategoryDetails) (err error)
Delete(id uint) (err error)
}
func NewArticleCategoryDetailsRepository(db *database.Database) ArticleCategoryDetailsRepository {
return &articleCategoryDetailsRepository{
DB: db,
}
}
// implement interface of IArticleCategoryDetailsRepository
func (_i *articleCategoryDetailsRepository) GetAll(req request.ArticleCategoryDetailsQueryRequest) (articleCategoryDetailss []*entity.ArticleCategoryDetails, paging paginator.Pagination, err error) {
var count int64
query := _i.DB.DB.Model(&entity.ArticleCategoryDetails{})
query.Count(&count)
req.Pagination.Count = count
req.Pagination = paginator.Paging(req.Pagination)
err = query.Offset(req.Pagination.Offset).Limit(req.Pagination.Limit).Find(&articleCategoryDetailss).Error
if err != nil {
return
}
paging = *req.Pagination
return
}
func (_i *articleCategoryDetailsRepository) FindOne(id uint) (articleCategoryDetails *entity.ArticleCategoryDetails, err error) {
if err := _i.DB.DB.First(&articleCategoryDetails, id).Error; err != nil {
return nil, err
}
return articleCategoryDetails, nil
}
func (_i *articleCategoryDetailsRepository) Create(articleCategoryDetails *entity.ArticleCategoryDetails) (err error) {
return _i.DB.DB.Create(articleCategoryDetails).Error
}
func (_i *articleCategoryDetailsRepository) Update(id uint, articleCategoryDetails *entity.ArticleCategoryDetails) (err error) {
return _i.DB.DB.Model(&entity.ArticleCategoryDetails{}).
Where(&entity.ArticleCategoryDetails{ID: id}).
Updates(articleCategoryDetails).Error
}
func (_i *articleCategoryDetailsRepository) Delete(id uint) error {
return _i.DB.DB.Delete(&entity.ArticleCategoryDetails{}, id).Error
}

View File

@ -0,0 +1,52 @@
package request
import (
"go-humas-be/app/database/entity"
"go-humas-be/utils/paginator"
"time"
)
type ArticleCategoryDetailsGeneric interface {
ToEntity()
}
type ArticleCategoryDetailsQueryRequest struct {
ArticleId int `json:"article_id" validate:"required"`
CategoryId int `json:"category_id" validate:"required"`
IsActive bool `json:"is_active" validate:"required"`
Pagination *paginator.Pagination `json:"pagination"`
}
type ArticleCategoryDetailsCreateRequest struct {
ArticleId int `json:"article_id" validate:"required"`
CategoryId int `json:"category_id" validate:"required"`
IsActive bool `json:"is_active" validate:"required"`
}
func (req ArticleCategoryDetailsCreateRequest) ToEntity() *entity.ArticleCategoryDetails {
return &entity.ArticleCategoryDetails{
ArticleId: req.ArticleId,
CategoryId: req.CategoryId,
IsActive: req.IsActive,
}
}
type ArticleCategoryDetailsUpdateRequest struct {
ID uint `json:"id" validate:"required"`
ArticleId int `json:"article_id" validate:"required"`
CategoryId int `json:"category_id" validate:"required"`
IsActive bool `json:"is_active" validate:"required"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
func (req ArticleCategoryDetailsUpdateRequest) ToEntity() *entity.ArticleCategoryDetails {
return &entity.ArticleCategoryDetails{
ID: req.ID,
ArticleId: req.ArticleId,
CategoryId: req.CategoryId,
IsActive: req.IsActive,
CreatedAt: req.CreatedAt,
UpdatedAt: req.UpdatedAt,
}
}

View File

@ -0,0 +1,12 @@
package response
import "time"
type ArticleCategoryDetailsResponse struct {
ID uint `json:"id"`
ArticleId int `json:"article_id"`
CategoryId int `json:"category_id"`
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/article_category_details/mapper"
"go-humas-be/app/module/article_category_details/repository"
"go-humas-be/app/module/article_category_details/request"
"go-humas-be/app/module/article_category_details/response"
"go-humas-be/utils/paginator"
)
// ArticleCategoryDetailsService
type articleCategoryDetailsService struct {
Repo repository.ArticleCategoryDetailsRepository
Log zerolog.Logger
}
// ArticleCategoryDetailsService define interface of IArticleCategoryDetailsService
type ArticleCategoryDetailsService interface {
All(req request.ArticleCategoryDetailsQueryRequest) (articleCategoryDetails []*response.ArticleCategoryDetailsResponse, paging paginator.Pagination, err error)
Show(id uint) (articleCategoryDetails *response.ArticleCategoryDetailsResponse, err error)
Save(req request.ArticleCategoryDetailsCreateRequest) (err error)
Update(id uint, req request.ArticleCategoryDetailsUpdateRequest) (err error)
Delete(id uint) error
}
// NewArticleCategoryDetailsService init ArticleCategoryDetailsService
func NewArticleCategoryDetailsService(repo repository.ArticleCategoryDetailsRepository, log zerolog.Logger) ArticleCategoryDetailsService {
return &articleCategoryDetailsService{
Repo: repo,
Log: log,
}
}
// All implement interface of ArticleCategoryDetailsService
func (_i *articleCategoryDetailsService) All(req request.ArticleCategoryDetailsQueryRequest) (articleCategoryDetailss []*response.ArticleCategoryDetailsResponse, paging paginator.Pagination, err error) {
results, paging, err := _i.Repo.GetAll(req)
if err != nil {
return
}
for _, result := range results {
articleCategoryDetailss = append(articleCategoryDetailss, mapper.ArticleCategoryDetailsResponseMapper(result))
}
return
}
func (_i *articleCategoryDetailsService) Show(id uint) (articleCategoryDetails *response.ArticleCategoryDetailsResponse, err error) {
result, err := _i.Repo.FindOne(id)
if err != nil {
return nil, err
}
return mapper.ArticleCategoryDetailsResponseMapper(result), nil
}
func (_i *articleCategoryDetailsService) Save(req request.ArticleCategoryDetailsCreateRequest) (err error) {
_i.Log.Info().Interface("data", req).Msg("")
return _i.Repo.Create(req.ToEntity())
}
func (_i *articleCategoryDetailsService) Update(id uint, req request.ArticleCategoryDetailsUpdateRequest) (err error) {
_i.Log.Info().Interface("data", req).Msg("")
return _i.Repo.Update(id, req.ToEntity())
}
func (_i *articleCategoryDetailsService) Delete(id uint) error {
return _i.Repo.Delete(id)
}

View File

@ -0,0 +1,55 @@
package article_files
import (
"github.com/gofiber/fiber/v2"
"go-humas-be/app/module/article_files/controller"
"go-humas-be/app/module/article_files/repository"
"go-humas-be/app/module/article_files/service"
"go.uber.org/fx"
)
// struct of ArticleFilesRouter
type ArticleFilesRouter struct {
App fiber.Router
Controller *controller.Controller
}
// register bulky of ArticleFiles module
var NewArticleFilesModule = fx.Options(
// register repository of ArticleFiles module
fx.Provide(repository.NewArticleFilesRepository),
// register service of ArticleFiles module
fx.Provide(service.NewArticleFilesService),
// register controller of ArticleFiles module
fx.Provide(controller.NewController),
// register router of ArticleFiles module
fx.Provide(NewArticleFilesRouter),
)
// init ArticleFilesRouter
func NewArticleFilesRouter(fiber *fiber.App, controller *controller.Controller) *ArticleFilesRouter {
return &ArticleFilesRouter{
App: fiber,
Controller: controller,
}
}
// register routes of ArticleFiles module
func (_i *ArticleFilesRouter) RegisterArticleFilesRoutes() {
// define controllers
articleFilesController := _i.Controller.ArticleFiles
// define routes
_i.App.Route("/article-files", func(router fiber.Router) {
router.Get("/", articleFilesController.All)
router.Get("/:id", articleFilesController.Show)
router.Post("/", articleFilesController.Save)
router.Put("/:id", articleFilesController.Update)
router.Delete("/:id", articleFilesController.Delete)
router.Post("/uploader", articleFilesController.Uploader)
router.Get("/viewer/:id", articleFilesController.Viewer)
})
}

View File

@ -0,0 +1,221 @@
package controller
import (
"github.com/gofiber/fiber/v2"
"go-humas-be/app/module/article_files/request"
"go-humas-be/app/module/article_files/service"
"go-humas-be/utils/paginator"
utilRes "go-humas-be/utils/response"
utilVal "go-humas-be/utils/validator"
"strconv"
)
type articleFilesController struct {
articleFilesService service.ArticleFilesService
}
type ArticleFilesController 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
Uploader(c *fiber.Ctx) error
Viewer(c *fiber.Ctx) error
}
func NewArticleFilesController(articleFilesService service.ArticleFilesService) ArticleFilesController {
return &articleFilesController{
articleFilesService: articleFilesService,
}
}
// All get all ArticleFiles
// @Summary Get all ArticleFiles
// @Description API for getting all ArticleFiles
// @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 /article-files [get]
func (_i *articleFilesController) All(c *fiber.Ctx) error {
paginate, err := paginator.Paginate(c)
if err != nil {
return err
}
var req request.ArticleFilesQueryRequest
req.Pagination = paginate
articleFilesData, paging, err := _i.articleFilesService.All(req)
if err != nil {
return err
}
return utilRes.Resp(c, utilRes.Response{
Messages: utilRes.Messages{"ArticleFiles list successfully retrieved"},
Data: articleFilesData,
Meta: paging,
})
}
// Show get one ArticleFiles
// @Summary Get one ArticleFiles
// @Description API for getting one ArticleFiles
// @Tags Task
// @Security Bearer
// @Param id path int true "ArticleFiles 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 /article-files/{id} [get]
func (_i *articleFilesController) Show(c *fiber.Ctx) error {
id, err := strconv.ParseUint(c.Params("id"), 10, 0)
if err != nil {
return err
}
articleFilesData, err := _i.articleFilesService.Show(uint(id))
if err != nil {
return err
}
return utilRes.Resp(c, utilRes.Response{
Messages: utilRes.Messages{"ArticleFiles successfully retrieved"},
Data: articleFilesData,
})
}
// Save create ArticleFiles
// @Summary Create ArticleFiles
// @Description API for create ArticleFiles
// @Tags Task
// @Security Bearer
// @Body request.ArticleFilesCreateRequest
// @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 /article-files [post]
func (_i *articleFilesController) Save(c *fiber.Ctx) error {
req := new(request.ArticleFilesCreateRequest)
if err := utilVal.ParseAndValidate(c, req); err != nil {
return err
}
err := _i.articleFilesService.Save(*req)
if err != nil {
return err
}
return utilRes.Resp(c, utilRes.Response{
Messages: utilRes.Messages{"ArticleFiles successfully created"},
})
}
// Update update ArticleFiles
// @Summary update ArticleFiles
// @Description API for update ArticleFiles
// @Tags Task
// @Security Bearer
// @Body request.ArticleFilesUpdateRequest
// @Param id path int true "ArticleFiles 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 /article-files/{id} [put]
func (_i *articleFilesController) Update(c *fiber.Ctx) error {
id, err := strconv.ParseUint(c.Params("id"), 10, 0)
if err != nil {
return err
}
req := new(request.ArticleFilesUpdateRequest)
if err := utilVal.ParseAndValidate(c, req); err != nil {
return err
}
err = _i.articleFilesService.Update(uint(id), *req)
if err != nil {
return err
}
return utilRes.Resp(c, utilRes.Response{
Messages: utilRes.Messages{"ArticleFiles successfully updated"},
})
}
// Delete delete ArticleFiles
// @Summary delete ArticleFiles
// @Description API for delete ArticleFiles
// @Tags Task
// @Security Bearer
// @Param id path int true "ArticleFiles 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 /article-files/{id} [delete]
func (_i *articleFilesController) Delete(c *fiber.Ctx) error {
id, err := strconv.ParseUint(c.Params("id"), 10, 0)
if err != nil {
return err
}
err = _i.articleFilesService.Delete(uint(id))
if err != nil {
return err
}
return utilRes.Resp(c, utilRes.Response{
Messages: utilRes.Messages{"ArticleFiles successfully deleted"},
})
}
// Upload create ArticleFiles
// @Summary Create ArticleFiles
// @Description API for create ArticleFiles
// @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 /article-files [post]
func (_i *articleFilesController) Uploader(c *fiber.Ctx) error {
err := _i.articleFilesService.Uploader(c, 1)
if err != nil {
return err
}
return utilRes.Resp(c, utilRes.Response{
Messages: utilRes.Messages{"ArticleFiles successfully upload"},
})
}
// Viewer viewer ArticleFiles
// @Summary Create ArticleFiles
// @Description API for create ArticleFiles
// @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 /article-files/viewer [get]
func (_i *articleFilesController) Viewer(c *fiber.Ctx) error {
return _i.articleFilesService.Viewer(c, c.Params("id"))
}

View File

@ -0,0 +1,13 @@
package controller
import "go-humas-be/app/module/article_files/service"
type Controller struct {
ArticleFiles ArticleFilesController
}
func NewController(ArticleFilesService service.ArticleFilesService) *Controller {
return &Controller{
ArticleFiles: NewArticleFilesController(ArticleFilesService),
}
}

View File

@ -0,0 +1,32 @@
package mapper
import (
"go-humas-be/app/database/entity"
res "go-humas-be/app/module/article_files/response"
)
func ArticleFilesResponseMapper(articleFilesReq *entity.ArticleFiles) (articleFilesRes *res.ArticleFilesResponse) {
if articleFilesReq != nil {
articleFilesRes = &res.ArticleFilesResponse{
ID: articleFilesReq.ID,
ArticleId: articleFilesReq.ArticleId,
FilePath: articleFilesReq.FilePath,
FileUrl: articleFilesReq.FileUrl,
FileName: articleFilesReq.FileName,
FileThumbnail: articleFilesReq.FileThumbnail,
FileAlt: articleFilesReq.FileAlt,
WidthPixel: articleFilesReq.WidthPixel,
HeightPixel: articleFilesReq.HeightPixel,
Size: articleFilesReq.Size,
DownloadCount: articleFilesReq.DownloadCount,
CreatedById: articleFilesReq.CreatedById,
StatusId: articleFilesReq.StatusId,
IsPublish: articleFilesReq.IsPublish,
PublishedAt: articleFilesReq.PublishedAt,
IsActive: articleFilesReq.IsActive,
CreatedAt: articleFilesReq.CreatedAt,
UpdatedAt: articleFilesReq.UpdatedAt,
}
}
return articleFilesRes
}

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/article_files/request"
"go-humas-be/utils/paginator"
)
type articleFilesRepository struct {
DB *database.Database
}
// ArticleFilesRepository define interface of IArticleFilesRepository
type ArticleFilesRepository interface {
GetAll(req request.ArticleFilesQueryRequest) (articleFiless []*entity.ArticleFiles, paging paginator.Pagination, err error)
FindOne(id uint) (articleFiles *entity.ArticleFiles, err error)
Create(articleFiles *entity.ArticleFiles) (err error)
Update(id uint, articleFiles *entity.ArticleFiles) (err error)
Delete(id uint) (err error)
}
func NewArticleFilesRepository(db *database.Database) ArticleFilesRepository {
return &articleFilesRepository{
DB: db,
}
}
// implement interface of IArticleFilesRepository
func (_i *articleFilesRepository) GetAll(req request.ArticleFilesQueryRequest) (articleFiless []*entity.ArticleFiles, paging paginator.Pagination, err error) {
var count int64
query := _i.DB.DB.Model(&entity.ArticleFiles{})
query.Count(&count)
req.Pagination.Count = count
req.Pagination = paginator.Paging(req.Pagination)
err = query.Offset(req.Pagination.Offset).Limit(req.Pagination.Limit).Find(&articleFiless).Error
if err != nil {
return
}
paging = *req.Pagination
return
}
func (_i *articleFilesRepository) FindOne(id uint) (articleFiles *entity.ArticleFiles, err error) {
if err := _i.DB.DB.First(&articleFiles, id).Error; err != nil {
return nil, err
}
return articleFiles, nil
}
func (_i *articleFilesRepository) Create(articleFiles *entity.ArticleFiles) (err error) {
return _i.DB.DB.Create(articleFiles).Error
}
func (_i *articleFilesRepository) Update(id uint, articleFiles *entity.ArticleFiles) (err error) {
return _i.DB.DB.Model(&entity.ArticleFiles{}).
Where(&entity.ArticleFiles{ID: id}).
Updates(articleFiles).Error
}
func (_i *articleFilesRepository) Delete(id uint) error {
return _i.DB.DB.Delete(&entity.ArticleFiles{}, id).Error
}

View File

@ -0,0 +1,112 @@
package request
import (
"go-humas-be/app/database/entity"
"go-humas-be/utils/paginator"
"time"
)
type ArticleFilesGeneric interface {
ToEntity()
}
type ArticleFilesQueryRequest struct {
ArticleId int `json:"article_id" validate:"required"`
FilePath string `json:"file_path" validate:"required"`
FileUrl string `json:"file_url" validate:"required"`
FileName string `json:"file_name" validate:"required"`
FileThumbnail string `json:"file_thumbnail" validate:"required"`
FileAlt string `json:"file_alt" validate:"required"`
WidthPixel string `json:"width_pixel" validate:"required"`
HeightPixel string `json:"height_pixel" validate:"required"`
Size string `json:"size" validate:"required"`
DownloadCount int `json:"download_count" validate:"required"`
CreatedById int `json:"created_by_id" validate:"required"`
StatusId int `json:"status_id" validate:"required"`
IsPublish bool `json:"is_publish" validate:"required"`
PublishedAt time.Time `json:"published_at" validate:"required"`
IsActive bool `json:"is_active" validate:"required"`
Pagination *paginator.Pagination `json:"pagination"`
}
type ArticleFilesCreateRequest struct {
ArticleId int `json:"article_id" validate:"required"`
FilePath string `json:"file_path" validate:"required"`
FileUrl string `json:"file_url" validate:"required"`
FileName string `json:"file_name" validate:"required"`
FileThumbnail string `json:"file_thumbnail" validate:"required"`
FileAlt string `json:"file_alt" validate:"required"`
WidthPixel string `json:"width_pixel" validate:"required"`
HeightPixel string `json:"height_pixel" validate:"required"`
Size string `json:"size" validate:"required"`
DownloadCount int `json:"download_count" validate:"required"`
CreatedById int `json:"created_by_id" validate:"required"`
StatusId int `json:"status_id" validate:"required"`
IsPublish bool `json:"is_publish" validate:"required"`
PublishedAt time.Time `json:"published_at" validate:"required"`
IsActive bool `json:"is_active" validate:"required"`
}
func (req ArticleFilesCreateRequest) ToEntity() *entity.ArticleFiles {
return &entity.ArticleFiles{
ArticleId: req.ArticleId,
FilePath: req.FilePath,
FileUrl: req.FileUrl,
FileName: req.FileName,
FileThumbnail: req.FileThumbnail,
FileAlt: req.FileAlt,
WidthPixel: req.WidthPixel,
HeightPixel: req.HeightPixel,
Size: req.Size,
DownloadCount: req.DownloadCount,
CreatedById: req.CreatedById,
StatusId: req.StatusId,
IsPublish: req.IsPublish,
PublishedAt: req.PublishedAt,
IsActive: req.IsActive,
}
}
type ArticleFilesUpdateRequest struct {
ID uint `json:"id" validate:"required"`
ArticleId int `json:"article_id" validate:"required"`
FilePath string `json:"file_path" validate:"required"`
FileUrl string `json:"file_url" validate:"required"`
FileName string `json:"file_name" validate:"required"`
FileThumbnail string `json:"file_thumbnail" validate:"required"`
FileAlt string `json:"file_alt" validate:"required"`
WidthPixel string `json:"width_pixel" validate:"required"`
HeightPixel string `json:"height_pixel" validate:"required"`
Size string `json:"size" validate:"required"`
DownloadCount int `json:"download_count" validate:"required"`
CreatedById int `json:"created_by_id" validate:"required"`
StatusId int `json:"status_id" validate:"required"`
IsPublish bool `json:"is_publish" validate:"required"`
PublishedAt time.Time `json:"published_at" validate:"required"`
IsActive bool `json:"is_active" validate:"required"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
func (req ArticleFilesUpdateRequest) ToEntity() *entity.ArticleFiles {
return &entity.ArticleFiles{
ID: req.ID,
ArticleId: req.ArticleId,
FilePath: req.FilePath,
FileUrl: req.FileUrl,
FileName: req.FileName,
FileThumbnail: req.FileThumbnail,
FileAlt: req.FileAlt,
WidthPixel: req.WidthPixel,
HeightPixel: req.HeightPixel,
Size: req.Size,
DownloadCount: req.DownloadCount,
CreatedById: req.CreatedById,
StatusId: req.StatusId,
IsPublish: req.IsPublish,
PublishedAt: req.PublishedAt,
IsActive: req.IsActive,
CreatedAt: req.CreatedAt,
UpdatedAt: req.UpdatedAt,
}
}

View File

@ -0,0 +1,24 @@
package response
import "time"
type ArticleFilesResponse struct {
ID uint `json:"id"`
ArticleId int `json:"article_id"`
FilePath string `json:"file_path"`
FileUrl string `json:"file_url"`
FileName string `json:"file_name"`
FileThumbnail string `json:"file_thumbnail"`
FileAlt string `json:"file_alt"`
WidthPixel string `json:"width_pixel"`
HeightPixel string `json:"height_pixel"`
Size string `json:"size"`
DownloadCount int `json:"download_count"`
CreatedById int `json:"created_by_id"`
StatusId int `json:"status_id"`
IsPublish bool `json:"is_publish"`
PublishedAt time.Time `json:"published_at"`
IsActive bool `json:"is_active"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}

View File

@ -0,0 +1,182 @@
package service
import (
"context"
"github.com/gofiber/fiber/v2"
"github.com/minio/minio-go/v7"
"github.com/rs/zerolog"
"go-humas-be/app/module/article_files/mapper"
"go-humas-be/app/module/article_files/repository"
"go-humas-be/app/module/article_files/request"
"go-humas-be/app/module/article_files/response"
minioUpload "go-humas-be/utils/minio"
"go-humas-be/utils/paginator"
"io"
"log"
"mime"
"strings"
"time"
)
// ArticleFilesService
type articleFilesService struct {
Repo repository.ArticleFilesRepository
Log zerolog.Logger
}
// ArticleFilesService define interface of IArticleFilesService
type ArticleFilesService interface {
All(req request.ArticleFilesQueryRequest) (articleFiles []*response.ArticleFilesResponse, paging paginator.Pagination, err error)
Show(id uint) (articleFiles *response.ArticleFilesResponse, err error)
Save(req request.ArticleFilesCreateRequest) (err error)
Update(id uint, req request.ArticleFilesUpdateRequest) (err error)
Delete(id uint) error
Uploader(c *fiber.Ctx, id uint) error
Viewer(c *fiber.Ctx, id string) error
}
// NewArticleFilesService init ArticleFilesService
func NewArticleFilesService(repo repository.ArticleFilesRepository, log zerolog.Logger) ArticleFilesService {
return &articleFilesService{
Repo: repo,
Log: log,
}
}
// All implement interface of ArticleFilesService
func (_i *articleFilesService) All(req request.ArticleFilesQueryRequest) (articleFiless []*response.ArticleFilesResponse, paging paginator.Pagination, err error) {
results, paging, err := _i.Repo.GetAll(req)
if err != nil {
return
}
for _, result := range results {
articleFiless = append(articleFiless, mapper.ArticleFilesResponseMapper(result))
}
return
}
func (_i *articleFilesService) Show(id uint) (articleFiles *response.ArticleFilesResponse, err error) {
result, err := _i.Repo.FindOne(id)
if err != nil {
return nil, err
}
return mapper.ArticleFilesResponseMapper(result), nil
}
func (_i *articleFilesService) Save(req request.ArticleFilesCreateRequest) (err error) {
_i.Log.Info().Interface("data", req).Msg("")
return _i.Repo.Create(req.ToEntity())
}
func (_i *articleFilesService) Update(id uint, req request.ArticleFilesUpdateRequest) (err error) {
_i.Log.Info().Interface("data", req).Msg("")
return _i.Repo.Update(id, req.ToEntity())
}
func (_i *articleFilesService) Delete(id uint) error {
return _i.Repo.Delete(id)
}
func (_i *articleFilesService) Uploader(c *fiber.Ctx, id uint) (err error) {
bucketName := "humas"
form, err := c.MultipartForm()
if err != nil {
return err
}
files := form.File["files"]
// Create minio connection.
minioClient, err := minioUpload.MinioConnection()
if err != nil {
// Return status 500 and minio connection error.
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"error": true,
"msg": err.Error(),
})
}
// Iterasi semua file yang diunggah
for _, file := range files {
_i.Log.Info().Str("timestamp", time.Now().
Format(time.RFC3339)).Str("Service:Resource", "Uploader:: loop1").
Interface("data", file).Msg("")
src, err := file.Open()
if err != nil {
return err
}
defer src.Close()
// Upload file ke MinIO
_, err = minioClient.PutObject(context.Background(), bucketName, file.Filename, src, file.Size, minio.PutObjectOptions{})
if err != nil {
return err
}
}
_i.Log.Info().Str("timestamp", time.Now().
Format(time.RFC3339)).Str("Service:Resource", "User:All").
Interface("data", "Successfully uploaded").Msg("")
return
}
func (_i *articleFilesService) Viewer(c *fiber.Ctx, id string) (err error) {
ctx := context.Background()
objectName := id
bucketName := "humas"
_i.Log.Info().Str("timestamp", time.Now().
Format(time.RFC3339)).Str("Service:Resource", "Article:Uploads").
Interface("data", objectName).Msg("")
// Create minio connection.
minioClient, err := minioUpload.MinioConnection()
if err != nil {
// Return status 500 and minio connection error.
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"error": true,
"msg": err.Error(),
})
}
fileContent, err := minioClient.GetObject(ctx, bucketName, objectName, minio.GetObjectOptions{})
if err != nil {
log.Fatalln(err)
}
defer fileContent.Close()
// Tentukan Content-Type berdasarkan ekstensi file
contentType := mime.TypeByExtension("." + getFileExtension(objectName))
if contentType == "" {
contentType = "application/octet-stream" // fallback jika tidak ada tipe MIME yang cocok
}
c.Set("Content-Type", contentType)
if _, err := io.Copy(c.Response().BodyWriter(), fileContent); err != nil {
return err
}
return
}
func getFileExtension(filename string) string {
// split file name
parts := strings.Split(filename, ".")
// jika tidak ada ekstensi, kembalikan string kosong
if len(parts) == 1 || (len(parts) == 2 && parts[0] == "") {
return ""
}
// ambil ekstensi terakhir
return parts[len(parts)-1]
}

View File

@ -0,0 +1,53 @@
package articles
import (
"github.com/gofiber/fiber/v2"
"go-humas-be/app/module/articles/controller"
"go-humas-be/app/module/articles/repository"
"go-humas-be/app/module/articles/service"
"go.uber.org/fx"
)
// ArticlesRouter struct of ArticlesRouter
type ArticlesRouter struct {
App fiber.Router
Controller *controller.Controller
}
// NewArticlesModule register bulky of Articles module
var NewArticlesModule = fx.Options(
// register repository of Articles module
fx.Provide(repository.NewArticlesRepository),
// register service of Articles module
fx.Provide(service.NewArticlesService),
// register controller of Articles module
fx.Provide(controller.NewController),
// register router of Articles module
fx.Provide(NewArticlesRouter),
)
// NewArticlesRouter init ArticlesRouter
func NewArticlesRouter(fiber *fiber.App, controller *controller.Controller) *ArticlesRouter {
return &ArticlesRouter{
App: fiber,
Controller: controller,
}
}
// RegisterArticlesRoutes register routes of Articles module
func (_i *ArticlesRouter) RegisterArticlesRoutes() {
// define controllers
articlesController := _i.Controller.Articles
// define routes
_i.App.Route("/articles", func(router fiber.Router) {
router.Get("/", articlesController.All)
router.Get("/:id", articlesController.Show)
router.Post("/", articlesController.Save)
router.Put("/:id", articlesController.Update)
router.Delete("/:id", articlesController.Delete)
})
}

View File

@ -0,0 +1,181 @@
package controller
import (
"github.com/gofiber/fiber/v2"
"go-humas-be/app/module/articles/request"
"go-humas-be/app/module/articles/service"
"go-humas-be/utils/paginator"
"strconv"
utilRes "go-humas-be/utils/response"
utilVal "go-humas-be/utils/validator"
)
type articlesController struct {
articlesService service.ArticlesService
}
type ArticlesController 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 NewArticlesController(articlesService service.ArticlesService) ArticlesController {
return &articlesController{
articlesService: articlesService,
}
}
// All get all Articles
// @Summary Get all Articles
// @Description API for getting all Articles
// @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 /articles [get]
func (_i *articlesController) All(c *fiber.Ctx) error {
paginate, err := paginator.Paginate(c)
if err != nil {
return err
}
var req request.ArticlesQueryRequest
req.Pagination = paginate
articlesData, paging, err := _i.articlesService.All(req)
if err != nil {
return err
}
return utilRes.Resp(c, utilRes.Response{
Messages: utilRes.Messages{"Articles list successfully retrieved"},
Data: articlesData,
Meta: paging,
})
}
// Show get one Articles
// @Summary Get one Articles
// @Description API for getting one Articles
// @Tags Task
// @Security Bearer
// @Param id path int true "Articles 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 /articles/{id} [get]
func (_i *articlesController) Show(c *fiber.Ctx) error {
id, err := strconv.ParseUint(c.Params("id"), 10, 0)
if err != nil {
return err
}
articlesData, err := _i.articlesService.Show(uint(id))
if err != nil {
return err
}
return utilRes.Resp(c, utilRes.Response{
Messages: utilRes.Messages{"Articles successfully retrieved"},
Data: articlesData,
})
}
// Save create Articles
// @Summary Create Articles
// @Description API for create Articles
// @Tags Task
// @Security Bearer
// @Body request.ArticlesCreateRequest
// @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 /articles [post]
func (_i *articlesController) Save(c *fiber.Ctx) error {
req := new(request.ArticlesCreateRequest)
if err := utilVal.ParseAndValidate(c, req); err != nil {
return err
}
err := _i.articlesService.Save(*req)
if err != nil {
return err
}
return utilRes.Resp(c, utilRes.Response{
Messages: utilRes.Messages{"Articles successfully created"},
})
}
// Update update Articles
// @Summary update Articles
// @Description API for update Articles
// @Tags Task
// @Security Bearer
// @Body request.ArticlesUpdateRequest
// @Param id path int true "Articles 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 /articles/{id} [put]
func (_i *articlesController) Update(c *fiber.Ctx) error {
id, err := strconv.ParseUint(c.Params("id"), 10, 0)
if err != nil {
return err
}
req := new(request.ArticlesUpdateRequest)
if err := utilVal.ParseAndValidate(c, req); err != nil {
return err
}
err = _i.articlesService.Update(uint(id), *req)
if err != nil {
return err
}
return utilRes.Resp(c, utilRes.Response{
Messages: utilRes.Messages{"Articles successfully updated"},
})
}
// Delete delete Articles
// @Summary delete Articles
// @Description API for delete Articles
// @Tags Task
// @Security Bearer
// @Param id path int true "Articles 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 /articles/{id} [delete]
func (_i *articlesController) Delete(c *fiber.Ctx) error {
id, err := strconv.ParseUint(c.Params("id"), 10, 0)
if err != nil {
return err
}
err = _i.articlesService.Delete(uint(id))
if err != nil {
return err
}
return utilRes.Resp(c, utilRes.Response{
Messages: utilRes.Messages{"Articles successfully deleted"},
})
}

View File

@ -0,0 +1,13 @@
package controller
import "go-humas-be/app/module/articles/service"
type Controller struct {
Articles ArticlesController
}
func NewController(ArticlesService service.ArticlesService) *Controller {
return &Controller{
Articles: NewArticlesController(ArticlesService),
}
}

View File

@ -0,0 +1,34 @@
package mapper
import (
"go-humas-be/app/database/entity"
res "go-humas-be/app/module/articles/response"
)
func ArticlesResponseMapper(articlesReq *entity.Articles) (articlesRes *res.ArticlesResponse) {
if articlesReq != nil {
articlesRes = &res.ArticlesResponse{
ID: articlesReq.ID,
Title: articlesReq.Title,
Slug: articlesReq.Slug,
Description: articlesReq.Description,
HtmlDescription: articlesReq.HtmlDescription,
TypeId: articlesReq.TypeId,
Tags: articlesReq.Tags,
ThumbnailPath: articlesReq.ThumbnailPath,
ThumbnailUrl: articlesReq.ThumbnailUrl,
PageUrl: articlesReq.PageUrl,
CreatedById: articlesReq.CreatedById,
ShareCount: articlesReq.ShareCount,
ViewCount: articlesReq.ViewCount,
DownloadCount: articlesReq.DownloadCount,
StatusId: articlesReq.StatusId,
IsPublish: articlesReq.IsPublish,
PublishedAt: articlesReq.PublishedAt,
IsActive: articlesReq.IsActive,
CreatedAt: articlesReq.CreatedAt,
UpdatedAt: articlesReq.UpdatedAt,
}
}
return articlesRes
}

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/articles/request"
"go-humas-be/utils/paginator"
)
type articlesRepository struct {
DB *database.Database
}
// ArticlesRepository define interface of IArticlesRepository
type ArticlesRepository interface {
GetAll(req request.ArticlesQueryRequest) (articless []*entity.Articles, paging paginator.Pagination, err error)
FindOne(id uint) (articles *entity.Articles, err error)
Create(articles *entity.Articles) (err error)
Update(id uint, articles *entity.Articles) (err error)
Delete(id uint) (err error)
}
func NewArticlesRepository(db *database.Database) ArticlesRepository {
return &articlesRepository{
DB: db,
}
}
// implement interface of IArticlesRepository
func (_i *articlesRepository) GetAll(req request.ArticlesQueryRequest) (articless []*entity.Articles, paging paginator.Pagination, err error) {
var count int64
query := _i.DB.DB.Model(&entity.Articles{})
query.Count(&count)
req.Pagination.Count = count
req.Pagination = paginator.Paging(req.Pagination)
err = query.Offset(req.Pagination.Offset).Limit(req.Pagination.Limit).Find(&articless).Error
if err != nil {
return
}
paging = *req.Pagination
return
}
func (_i *articlesRepository) FindOne(id uint) (articles *entity.Articles, err error) {
if err := _i.DB.DB.First(&articles, id).Error; err != nil {
return nil, err
}
return articles, nil
}
func (_i *articlesRepository) Create(articles *entity.Articles) (err error) {
return _i.DB.DB.Create(articles).Error
}
func (_i *articlesRepository) Update(id uint, articles *entity.Articles) (err error) {
return _i.DB.DB.Model(&entity.Articles{}).
Where(&entity.Articles{ID: id}).
Updates(articles).Error
}
func (_i *articlesRepository) Delete(id uint) error {
return _i.DB.DB.Delete(&entity.Articles{}, id).Error
}

View File

@ -0,0 +1,122 @@
package request
import (
"go-humas-be/app/database/entity"
"go-humas-be/utils/paginator"
"time"
)
type ArticlesGeneric interface {
ToEntity()
}
type ArticlesQueryRequest struct {
Title string `json:"title" validate:"required"`
Slug string `json:"slug" validate:"required"`
Description string `json:"description" validate:"required"`
HtmlDescription string `json:"html_description" validate:"required"`
TypeId int `json:"type_id" validate:"required"`
Tags string `json:"tags" validate:"required"`
ThumbnailPath string `json:"thumbnail_path" validate:"required"`
ThumbnailUrl string `json:"thumbnail_url" validate:"required"`
PageUrl string `json:"page_url" validate:"required"`
CreatedById int `json:"created_by_id" validate:"required"`
ShareCount int `json:"share_count" validate:"required"`
ViewCount int `json:"view_count" validate:"required"`
DownloadCount int `json:"download_count" validate:"required"`
StatusId int `json:"status_id" validate:"required"`
IsPublish bool `json:"is_publish" validate:"required"`
PublishedAt time.Time `json:"published_at" validate:"required"`
IsActive bool `json:"is_active" validate:"required"`
Pagination *paginator.Pagination `json:"pagination"`
}
type ArticlesCreateRequest struct {
Title string `json:"title" validate:"required"`
Slug string `json:"slug" validate:"required"`
Description string `json:"description" validate:"required"`
HtmlDescription string `json:"html_description" validate:"required"`
TypeId int `json:"type_id" validate:"required"`
Tags string `json:"tags" validate:"required"`
ThumbnailPath string `json:"thumbnail_path" validate:"required"`
ThumbnailUrl string `json:"thumbnail_url" validate:"required"`
PageUrl string `json:"page_url" validate:"required"`
CreatedById int `json:"created_by_id" validate:"required"`
ShareCount int `json:"share_count" validate:"required"`
ViewCount int `json:"view_count" validate:"required"`
DownloadCount int `json:"download_count" validate:"required"`
StatusId int `json:"status_id" validate:"required"`
IsPublish bool `json:"is_publish" validate:"required"`
PublishedAt time.Time `json:"published_at" validate:"required"`
IsActive bool `json:"is_active" validate:"required"`
}
func (req ArticlesCreateRequest) ToEntity() *entity.Articles {
return &entity.Articles{
Title: req.Title,
Slug: req.Slug,
Description: req.Description,
HtmlDescription: req.HtmlDescription,
TypeId: req.TypeId,
Tags: req.Tags,
ThumbnailPath: req.ThumbnailPath,
ThumbnailUrl: req.ThumbnailUrl,
PageUrl: req.PageUrl,
CreatedById: req.CreatedById,
ShareCount: req.ShareCount,
ViewCount: req.ViewCount,
DownloadCount: req.DownloadCount,
StatusId: req.StatusId,
IsPublish: req.IsPublish,
PublishedAt: req.PublishedAt,
IsActive: req.IsActive,
}
}
type ArticlesUpdateRequest struct {
ID uint `json:"id" validate:"required"`
Title string `json:"title" validate:"required"`
Slug string `json:"slug" validate:"required"`
Description string `json:"description" validate:"required"`
HtmlDescription string `json:"html_description" validate:"required"`
TypeId int `json:"type_id" validate:"required"`
Tags string `json:"tags" validate:"required"`
ThumbnailPath string `json:"thumbnail_path" validate:"required"`
ThumbnailUrl string `json:"thumbnail_url" validate:"required"`
PageUrl string `json:"page_url" validate:"required"`
CreatedById int `json:"created_by_id" validate:"required"`
ShareCount int `json:"share_count" validate:"required"`
ViewCount int `json:"view_count" validate:"required"`
DownloadCount int `json:"download_count" validate:"required"`
StatusId int `json:"status_id" validate:"required"`
IsPublish bool `json:"is_publish" validate:"required"`
PublishedAt time.Time `json:"published_at" validate:"required"`
IsActive bool `json:"is_active" validate:"required"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
func (req ArticlesUpdateRequest) ToEntity() *entity.Articles {
return &entity.Articles{
ID: req.ID,
Title: req.Title,
Slug: req.Slug,
Description: req.Description,
HtmlDescription: req.HtmlDescription,
TypeId: req.TypeId,
Tags: req.Tags,
ThumbnailPath: req.ThumbnailPath,
ThumbnailUrl: req.ThumbnailUrl,
PageUrl: req.PageUrl,
CreatedById: req.CreatedById,
ShareCount: req.ShareCount,
ViewCount: req.ViewCount,
DownloadCount: req.DownloadCount,
StatusId: req.StatusId,
IsPublish: req.IsPublish,
PublishedAt: req.PublishedAt,
IsActive: req.IsActive,
CreatedAt: req.CreatedAt,
UpdatedAt: req.UpdatedAt,
}
}

View File

@ -0,0 +1,26 @@
package response
import "time"
type ArticlesResponse struct {
ID uint `json:"id"`
Title string `json:"title"`
Slug string `json:"slug"`
Description string `json:"description"`
HtmlDescription string `json:"html_description"`
TypeId int `json:"type_id"`
Tags string `json:"tags"`
ThumbnailPath string `json:"thumbnail_path"`
ThumbnailUrl string `json:"thumbnail_url"`
PageUrl string `json:"page_url"`
CreatedById int `json:"created_by_id"`
ShareCount int `json:"share_count"`
ViewCount int `json:"view_count"`
DownloadCount int `json:"download_count"`
StatusId int `json:"status_id"`
IsPublish bool `json:"is_publish"`
PublishedAt time.Time `json:"published_at"`
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/articles/mapper"
"go-humas-be/app/module/articles/repository"
"go-humas-be/app/module/articles/request"
"go-humas-be/app/module/articles/response"
"go-humas-be/utils/paginator"
)
// ArticlesService
type articlesService struct {
Repo repository.ArticlesRepository
Log zerolog.Logger
}
// ArticlesService define interface of IArticlesService
type ArticlesService interface {
All(req request.ArticlesQueryRequest) (articles []*response.ArticlesResponse, paging paginator.Pagination, err error)
Show(id uint) (articles *response.ArticlesResponse, err error)
Save(req request.ArticlesCreateRequest) (err error)
Update(id uint, req request.ArticlesUpdateRequest) (err error)
Delete(id uint) error
}
// NewArticlesService init ArticlesService
func NewArticlesService(repo repository.ArticlesRepository, log zerolog.Logger) ArticlesService {
return &articlesService{
Repo: repo,
Log: log,
}
}
// All implement interface of ArticlesService
func (_i *articlesService) All(req request.ArticlesQueryRequest) (articless []*response.ArticlesResponse, paging paginator.Pagination, err error) {
results, paging, err := _i.Repo.GetAll(req)
if err != nil {
return
}
for _, result := range results {
articless = append(articless, mapper.ArticlesResponseMapper(result))
}
return
}
func (_i *articlesService) Show(id uint) (articles *response.ArticlesResponse, err error) {
result, err := _i.Repo.FindOne(id)
if err != nil {
return nil, err
}
return mapper.ArticlesResponseMapper(result), nil
}
func (_i *articlesService) Save(req request.ArticlesCreateRequest) (err error) {
_i.Log.Info().Interface("data", req).Msg("")
return _i.Repo.Create(req.ToEntity())
}
func (_i *articlesService) Update(id uint, req request.ArticlesUpdateRequest) (err error) {
_i.Log.Info().Interface("data", req).Msg("")
return _i.Repo.Update(id, req.ToEntity())
}
func (_i *articlesService) Delete(id uint) error {
return _i.Repo.Delete(id)
}

View File

@ -0,0 +1,53 @@
package cities
import (
"github.com/gofiber/fiber/v2"
"go-humas-be/app/module/cities/controller"
"go-humas-be/app/module/cities/repository"
"go-humas-be/app/module/cities/service"
"go.uber.org/fx"
)
// struct of CitiesRouter
type CitiesRouter struct {
App fiber.Router
Controller *controller.Controller
}
// register bulky of Cities module
var NewCitiesModule = fx.Options(
// register repository of Cities module
fx.Provide(repository.NewCitiesRepository),
// register service of Cities module
fx.Provide(service.NewCitiesService),
// register controller of Cities module
fx.Provide(controller.NewController),
// register router of Cities module
fx.Provide(NewCitiesRouter),
)
// init CitiesRouter
func NewCitiesRouter(fiber *fiber.App, controller *controller.Controller) *CitiesRouter {
return &CitiesRouter{
App: fiber,
Controller: controller,
}
}
// register routes of Cities module
func (_i *CitiesRouter) RegisterCitiesRoutes() {
// define controllers
citiesController := _i.Controller.Cities
// define routes
_i.App.Route("/cities", func(router fiber.Router) {
router.Get("/", citiesController.All)
router.Get("/:id", citiesController.Show)
router.Post("/", citiesController.Save)
router.Put("/:id", citiesController.Update)
router.Delete("/:id", citiesController.Delete)
})
}

View File

@ -0,0 +1,184 @@
package controller
import (
"github.com/gofiber/fiber/v2"
"go-humas-be/app/module/cities/request"
"go-humas-be/app/module/cities/service"
"go-humas-be/utils/paginator"
"strconv"
utilRes "go-humas-be/utils/response"
utilVal "go-humas-be/utils/validator"
)
type citiesController struct {
citiesService service.CitiesService
}
type CitiesController 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 NewCitiesController(citiesService service.CitiesService) CitiesController {
return &citiesController{
citiesService: citiesService,
}
}
// All get all Cities
// @Summary Get all Cities
// @Description API for getting all Cities
// @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 /cities [get]
func (_i *citiesController) All(c *fiber.Ctx) error {
paginate, err := paginator.Paginate(c)
if err != nil {
return err
}
var req request.CitiesQueryRequest
req.Pagination = paginate
citiesData, paging, err := _i.citiesService.All(req)
if err != nil {
return err
}
return utilRes.Resp(c, utilRes.Response{
Messages: utilRes.Messages{"Cities list successfully retrieved"},
Data: citiesData,
Meta: paging,
})
}
// Show get one Cities
// @Summary Get one Cities
// @Description API for getting one Cities
// @Tags Task
// @Security Bearer
// @Param id path int true "Cities 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 /cities/{id} [get]
func (_i *citiesController) Show(c *fiber.Ctx) error {
id, err := strconv.ParseUint(c.Params("id"), 10, 0)
if err != nil {
return err
}
citiesData, err := _i.citiesService.Show(uint(id))
if err != nil {
return err
}
return utilRes.Resp(c, utilRes.Response{
Messages: utilRes.Messages{"Cities successfully retrieved"},
Data: citiesData,
})
}
// Save create Cities
// @Summary Create Cities
// @Description API for create Cities
// @Tags Task
// @Security Bearer
// @Param payload body request.CitiesCreateRequest true "Required payload"
// @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 /cities [post]
func (_i *citiesController) Save(c *fiber.Ctx) error {
req := new(request.CitiesCreateRequest)
if err := utilVal.ParseAndValidate(c, req); err != nil {
return err
}
err := _i.citiesService.Save(*req)
if err != nil {
return err
}
return utilRes.Resp(c, utilRes.Response{
Messages: utilRes.Messages{"Cities successfully created"},
})
}
// Update Cities
// @Summary update Cities
// @Description API for update Cities
// @Tags Task
// @Security Bearer
// @Body request.CitiesUpdateRequest
// @Param id path int true "Cities ID"
// @Param payload body request.CitiesUpdateRequest true "Required payload"
// @Accept json
// @Produce json
// @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 /cities/{id} [put]
func (_i *citiesController) Update(c *fiber.Ctx) error {
id, err := strconv.ParseUint(c.Params("id"), 10, 0)
if err != nil {
return err
}
req := new(request.CitiesUpdateRequest)
if err := utilVal.ParseAndValidate(c, req); err != nil {
return err
}
err = _i.citiesService.Update(uint(id), *req)
if err != nil {
return err
}
return utilRes.Resp(c, utilRes.Response{
Messages: utilRes.Messages{"Cities successfully updated"},
})
}
// Delete delete Cities
// @Summary delete Cities
// @Description API for delete Cities
// @Tags Task
// @Security Bearer
// @Param id path int true "Cities 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 /cities/{id} [delete]
func (_i *citiesController) Delete(c *fiber.Ctx) error {
id, err := strconv.ParseUint(c.Params("id"), 10, 0)
if err != nil {
return err
}
err = _i.citiesService.Delete(uint(id))
if err != nil {
return err
}
return utilRes.Resp(c, utilRes.Response{
Messages: utilRes.Messages{"Cities successfully deleted"},
})
}

View File

@ -0,0 +1,13 @@
package controller
import "go-humas-be/app/module/cities/service"
type Controller struct {
Cities CitiesController
}
func NewController(CitiesService service.CitiesService) *Controller {
return &Controller{
Cities: NewCitiesController(CitiesService),
}
}

View File

@ -0,0 +1,17 @@
package mapper
import (
"go-humas-be/app/database/entity"
res "go-humas-be/app/module/cities/response"
)
func CitiesResponseMapper(citiesReq *entity.Cities) (citiesRes *res.CitiesResponse) {
if citiesReq != nil {
citiesRes = &res.CitiesResponse{
ID: citiesReq.ID,
CityName: citiesReq.CityName,
ProvId: citiesReq.ProvId,
}
}
return citiesRes
}

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/cities/request"
"go-humas-be/utils/paginator"
)
type citiesRepository struct {
DB *database.Database
}
// CitiesRepository define interface of ICitiesRepository
type CitiesRepository interface {
GetAll(req request.CitiesQueryRequest) (citiess []*entity.Cities, paging paginator.Pagination, err error)
FindOne(id uint) (cities *entity.Cities, err error)
Create(cities *entity.Cities) (err error)
Update(id uint, cities *entity.Cities) (err error)
Delete(id uint) (err error)
}
func NewCitiesRepository(db *database.Database) CitiesRepository {
return &citiesRepository{
DB: db,
}
}
// implement interface of ICitiesRepository
func (_i *citiesRepository) GetAll(req request.CitiesQueryRequest) (citiess []*entity.Cities, paging paginator.Pagination, err error) {
var count int64
query := _i.DB.DB.Model(&entity.Cities{})
query.Count(&count)
req.Pagination.Count = count
req.Pagination = paginator.Paging(req.Pagination)
err = query.Offset(req.Pagination.Offset).Limit(req.Pagination.Limit).Find(&citiess).Error
if err != nil {
return
}
paging = *req.Pagination
return
}
func (_i *citiesRepository) FindOne(id uint) (cities *entity.Cities, err error) {
if err := _i.DB.DB.First(&cities, id).Error; err != nil {
return nil, err
}
return cities, nil
}
func (_i *citiesRepository) Create(cities *entity.Cities) (err error) {
return _i.DB.DB.Create(cities).Error
}
func (_i *citiesRepository) Update(id uint, cities *entity.Cities) (err error) {
return _i.DB.DB.Model(&entity.Cities{}).
Where(&entity.Cities{ID: id}).
Updates(cities).Error
}
func (_i *citiesRepository) Delete(id uint) error {
return _i.DB.DB.Delete(&entity.Cities{}, id).Error
}

View File

@ -0,0 +1,43 @@
package request
import (
"go-humas-be/app/database/entity"
"go-humas-be/utils/paginator"
)
type CitiesGeneric interface {
ToEntity()
}
type CitiesQueryRequest struct {
CityName string `json:"city_name" validate:"required"`
ProvId int `json:"prov_id" validate:"required"`
Pagination *paginator.Pagination `json:"pagination"`
}
type CitiesCreateRequest struct {
CityName string `json:"city_name" validate:"required"`
ProvId int `json:"prov_id" validate:"required"`
}
func (req CitiesCreateRequest) ToEntity() *entity.Cities {
return &entity.Cities{
CityName: req.CityName,
ProvId: req.ProvId,
}
}
type CitiesUpdateRequest struct {
ID uint `json:"id" validate:"required"`
CityName string `json:"city_name" validate:"required"`
ProvId int `json:"prov_id" validate:"required"`
}
func (req CitiesUpdateRequest) ToEntity() *entity.Cities {
return &entity.Cities{
ID: req.ID,
CityName: req.CityName,
ProvId: req.ProvId,
}
}

View File

@ -0,0 +1,7 @@
package response
type CitiesResponse struct {
ID uint `json:"id"`
CityName string `json:"city_name"`
ProvId int `json:"prov_id"`
}

View File

@ -0,0 +1,72 @@
package service
import (
"github.com/rs/zerolog"
"go-humas-be/app/module/cities/mapper"
"go-humas-be/app/module/cities/repository"
"go-humas-be/app/module/cities/request"
"go-humas-be/app/module/cities/response"
"go-humas-be/utils/paginator"
)
// CitiesService
type citiesService struct {
Repo repository.CitiesRepository
Log zerolog.Logger
}
// CitiesService define interface of ICitiesService
type CitiesService interface {
All(req request.CitiesQueryRequest) (cities []*response.CitiesResponse, paging paginator.Pagination, err error)
Show(id uint) (cities *response.CitiesResponse, err error)
Save(req request.CitiesCreateRequest) (err error)
Update(id uint, req request.CitiesUpdateRequest) (err error)
Delete(id uint) error
}
// NewCitiesService init CitiesService
func NewCitiesService(repo repository.CitiesRepository, log zerolog.Logger) CitiesService {
return &citiesService{
Repo: repo,
Log: log,
}
}
// All implement interface of CitiesService
func (_i *citiesService) All(req request.CitiesQueryRequest) (citiess []*response.CitiesResponse, paging paginator.Pagination, err error) {
results, paging, err := _i.Repo.GetAll(req)
if err != nil {
return
}
for _, result := range results {
citiess = append(citiess, mapper.CitiesResponseMapper(result))
}
return
}
func (_i *citiesService) Show(id uint) (cities *response.CitiesResponse, err error) {
result, err := _i.Repo.FindOne(id)
if err != nil {
return nil, err
}
return mapper.CitiesResponseMapper(result), nil
}
func (_i *citiesService) Save(req request.CitiesCreateRequest) (err error) {
_i.Log.Info().Interface("data", req).Msg("")
return _i.Repo.Create(req.ToEntity())
}
func (_i *citiesService) Update(id uint, req request.CitiesUpdateRequest) (err error) {
_i.Log.Info().Interface("data", req).Msg("")
return _i.Repo.Update(id, req.ToEntity())
}
func (_i *citiesService) Delete(id uint) error {
return _i.Repo.Delete(id)
}

View File

@ -0,0 +1,13 @@
package controller
import "go-humas-be/app/module/districts/service"
type Controller struct {
Districts DistrictsController
}
func NewController(DistrictsService service.DistrictsService) *Controller {
return &Controller{
Districts: NewDistrictsController(DistrictsService),
}
}

View File

@ -0,0 +1,181 @@
package controller
import (
"github.com/gofiber/fiber/v2"
"go-humas-be/app/module/districts/request"
"go-humas-be/app/module/districts/service"
"go-humas-be/utils/paginator"
"strconv"
utilRes "go-humas-be/utils/response"
utilVal "go-humas-be/utils/validator"
)
type districtsController struct {
districtsService service.DistrictsService
}
type DistrictsController 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 NewDistrictsController(districtsService service.DistrictsService) DistrictsController {
return &districtsController{
districtsService: districtsService,
}
}
// All get all Districts
// @Summary Get all Districts
// @Description API for getting all Districts
// @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 /districts [get]
func (_i *districtsController) All(c *fiber.Ctx) error {
paginate, err := paginator.Paginate(c)
if err != nil {
return err
}
var req request.DistrictsQueryRequest
req.Pagination = paginate
districtsData, paging, err := _i.districtsService.All(req)
if err != nil {
return err
}
return utilRes.Resp(c, utilRes.Response{
Messages: utilRes.Messages{"Districts list successfully retrieved"},
Data: districtsData,
Meta: paging,
})
}
// Show get one Districts
// @Summary Get one Districts
// @Description API for getting one Districts
// @Tags Task
// @Security Bearer
// @Param id path int true "Districts 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 /districts/{id} [get]
func (_i *districtsController) Show(c *fiber.Ctx) error {
id, err := strconv.ParseUint(c.Params("id"), 10, 0)
if err != nil {
return err
}
districtsData, err := _i.districtsService.Show(uint(id))
if err != nil {
return err
}
return utilRes.Resp(c, utilRes.Response{
Messages: utilRes.Messages{"Districts successfully retrieved"},
Data: districtsData,
})
}
// Save create Districts
// @Summary Create Districts
// @Description API for create Districts
// @Tags Task
// @Security Bearer
// @Body request.DistrictsCreateRequest
// @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 /districts [post]
func (_i *districtsController) Save(c *fiber.Ctx) error {
req := new(request.DistrictsCreateRequest)
if err := utilVal.ParseAndValidate(c, req); err != nil {
return err
}
err := _i.districtsService.Save(*req)
if err != nil {
return err
}
return utilRes.Resp(c, utilRes.Response{
Messages: utilRes.Messages{"Districts successfully created"},
})
}
// Update update Districts
// @Summary update Districts
// @Description API for update Districts
// @Tags Task
// @Security Bearer
// @Body request.DistrictsUpdateRequest
// @Param id path int true "Districts 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 /districts/{id} [put]
func (_i *districtsController) Update(c *fiber.Ctx) error {
id, err := strconv.ParseUint(c.Params("id"), 10, 0)
if err != nil {
return err
}
req := new(request.DistrictsUpdateRequest)
if err := utilVal.ParseAndValidate(c, req); err != nil {
return err
}
err = _i.districtsService.Update(uint(id), *req)
if err != nil {
return err
}
return utilRes.Resp(c, utilRes.Response{
Messages: utilRes.Messages{"Districts successfully updated"},
})
}
// Delete delete Districts
// @Summary delete Districts
// @Description API for delete Districts
// @Tags Task
// @Security Bearer
// @Param id path int true "Districts 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 /districts/{id} [delete]
func (_i *districtsController) Delete(c *fiber.Ctx) error {
id, err := strconv.ParseUint(c.Params("id"), 10, 0)
if err != nil {
return err
}
err = _i.districtsService.Delete(uint(id))
if err != nil {
return err
}
return utilRes.Resp(c, utilRes.Response{
Messages: utilRes.Messages{"Districts successfully deleted"},
})
}

View File

@ -0,0 +1,53 @@
package districts
import (
"github.com/gofiber/fiber/v2"
"go-humas-be/app/module/districts/controller"
"go-humas-be/app/module/districts/repository"
"go-humas-be/app/module/districts/service"
"go.uber.org/fx"
)
// DistrictsRouter struct of DistrictsRouter
type DistrictsRouter struct {
App fiber.Router
Controller *controller.Controller
}
// NewDistrictsModule register bulky of Districts module
var NewDistrictsModule = fx.Options(
// register repository of Districts module
fx.Provide(repository.NewDistrictsRepository),
// register service of Districts module
fx.Provide(service.NewDistrictsService),
// register controller of Districts module
fx.Provide(controller.NewController),
// register router of Districts module
fx.Provide(NewDistrictsRouter),
)
// NewDistrictsRouter init DistrictsRouter
func NewDistrictsRouter(fiber *fiber.App, controller *controller.Controller) *DistrictsRouter {
return &DistrictsRouter{
App: fiber,
Controller: controller,
}
}
// RegisterDistrictsRoutes register routes of Districts module
func (_i *DistrictsRouter) RegisterDistrictsRoutes() {
// define controllers
districtsController := _i.Controller.Districts
// define routes
_i.App.Route("/districts", func(router fiber.Router) {
router.Get("/", districtsController.All)
router.Get("/:id", districtsController.Show)
router.Post("/", districtsController.Save)
router.Put("/:id", districtsController.Update)
router.Delete("/:id", districtsController.Delete)
})
}

View File

@ -0,0 +1,17 @@
package mapper
import (
"go-humas-be/app/database/entity"
res "go-humas-be/app/module/districts/response"
)
func DistrictsResponseMapper(districtsReq *entity.Districts) (districtsRes *res.DistrictsResponse) {
if districtsReq != nil {
districtsRes = &res.DistrictsResponse{
ID: districtsReq.ID,
DisNam: districtsReq.DisNam,
CityId: districtsReq.CityId,
}
}
return districtsRes
}

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/districts/request"
"go-humas-be/utils/paginator"
)
type districtsRepository struct {
DB *database.Database
}
// DistrictsRepository define interface of IDistrictsRepository
type DistrictsRepository interface {
GetAll(req request.DistrictsQueryRequest) (districtss []*entity.Districts, paging paginator.Pagination, err error)
FindOne(id uint) (districts *entity.Districts, err error)
Create(districts *entity.Districts) (err error)
Update(id uint, districts *entity.Districts) (err error)
Delete(id uint) (err error)
}
func NewDistrictsRepository(db *database.Database) DistrictsRepository {
return &districtsRepository{
DB: db,
}
}
// implement interface of IDistrictsRepository
func (_i *districtsRepository) GetAll(req request.DistrictsQueryRequest) (districtss []*entity.Districts, paging paginator.Pagination, err error) {
var count int64
query := _i.DB.DB.Model(&entity.Districts{})
query.Count(&count)
req.Pagination.Count = count
req.Pagination = paginator.Paging(req.Pagination)
err = query.Offset(req.Pagination.Offset).Limit(req.Pagination.Limit).Find(&districtss).Error
if err != nil {
return
}
paging = *req.Pagination
return
}
func (_i *districtsRepository) FindOne(id uint) (districts *entity.Districts, err error) {
if err := _i.DB.DB.First(&districts, id).Error; err != nil {
return nil, err
}
return districts, nil
}
func (_i *districtsRepository) Create(districts *entity.Districts) (err error) {
return _i.DB.DB.Create(districts).Error
}
func (_i *districtsRepository) Update(id uint, districts *entity.Districts) (err error) {
return _i.DB.DB.Model(&entity.Districts{}).
Where(&entity.Districts{ID: id}).
Updates(districts).Error
}
func (_i *districtsRepository) Delete(id uint) error {
return _i.DB.DB.Delete(&entity.Districts{}, id).Error
}

View File

@ -0,0 +1,43 @@
package request
import (
"go-humas-be/app/database/entity"
"go-humas-be/utils/paginator"
)
type DistrictsGeneric interface {
ToEntity()
}
type DistrictsQueryRequest struct {
DisNam string `json:"dis_nam" validate:"required"`
CityId int `json:"city_id" validate:"required"`
Pagination *paginator.Pagination `json:"pagination"`
}
type DistrictsCreateRequest struct {
DisNam string `json:"dis_nam" validate:"required"`
CityId int `json:"city_id" validate:"required"`
}
func (req DistrictsCreateRequest) ToEntity() *entity.Districts {
return &entity.Districts{
DisNam: req.DisNam,
CityId: req.CityId,
}
}
type DistrictsUpdateRequest struct {
ID uint `json:"id" validate:"required"`
DisNam string `json:"dis_nam" validate:"required"`
CityId int `json:"city_id" validate:"required"`
}
func (req DistrictsUpdateRequest) ToEntity() *entity.Districts {
return &entity.Districts{
ID: req.ID,
DisNam: req.DisNam,
CityId: req.CityId,
}
}

View File

@ -0,0 +1,7 @@
package response
type DistrictsResponse struct {
ID uint `json:"id"`
DisNam string `json:"dis_nam"`
CityId int `json:"city_id"`
}

View File

@ -0,0 +1,72 @@
package service
import (
"github.com/rs/zerolog"
"go-humas-be/app/module/districts/mapper"
"go-humas-be/app/module/districts/repository"
"go-humas-be/app/module/districts/request"
"go-humas-be/app/module/districts/response"
"go-humas-be/utils/paginator"
)
// DistrictsService
type districtsService struct {
Repo repository.DistrictsRepository
Log zerolog.Logger
}
// DistrictsService define interface of IDistrictsService
type DistrictsService interface {
All(req request.DistrictsQueryRequest) (districts []*response.DistrictsResponse, paging paginator.Pagination, err error)
Show(id uint) (districts *response.DistrictsResponse, err error)
Save(req request.DistrictsCreateRequest) (err error)
Update(id uint, req request.DistrictsUpdateRequest) (err error)
Delete(id uint) error
}
// NewDistrictsService init DistrictsService
func NewDistrictsService(repo repository.DistrictsRepository, log zerolog.Logger) DistrictsService {
return &districtsService{
Repo: repo,
Log: log,
}
}
// All implement interface of DistrictsService
func (_i *districtsService) All(req request.DistrictsQueryRequest) (districtss []*response.DistrictsResponse, paging paginator.Pagination, err error) {
results, paging, err := _i.Repo.GetAll(req)
if err != nil {
return
}
for _, result := range results {
districtss = append(districtss, mapper.DistrictsResponseMapper(result))
}
return
}
func (_i *districtsService) Show(id uint) (districts *response.DistrictsResponse, err error) {
result, err := _i.Repo.FindOne(id)
if err != nil {
return nil, err
}
return mapper.DistrictsResponseMapper(result), nil
}
func (_i *districtsService) Save(req request.DistrictsCreateRequest) (err error) {
_i.Log.Info().Interface("data", req).Msg("")
return _i.Repo.Create(req.ToEntity())
}
func (_i *districtsService) Update(id uint, req request.DistrictsUpdateRequest) (err error) {
_i.Log.Info().Interface("data", req).Msg("")
return _i.Repo.Update(id, req.ToEntity())
}
func (_i *districtsService) Delete(id uint) error {
return _i.Repo.Delete(id)
}

View File

@ -0,0 +1,13 @@
package controller
import "go-humas-be/app/module/magazine_files/service"
type Controller struct {
MagazineFiles MagazineFilesController
}
func NewController(MagazineFilesService service.MagazineFilesService) *Controller {
return &Controller{
MagazineFiles: NewMagazineFilesController(MagazineFilesService),
}
}

View File

@ -0,0 +1,181 @@
package controller
import (
"github.com/gofiber/fiber/v2"
"go-humas-be/app/module/magazine_files/request"
"go-humas-be/app/module/magazine_files/service"
"go-humas-be/utils/paginator"
"strconv"
utilRes "go-humas-be/utils/response"
utilVal "go-humas-be/utils/validator"
)
type magazineFilesController struct {
magazineFilesService service.MagazineFilesService
}
type MagazineFilesController 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 NewMagazineFilesController(magazineFilesService service.MagazineFilesService) MagazineFilesController {
return &magazineFilesController{
magazineFilesService: magazineFilesService,
}
}
// All get all MagazineFiles
// @Summary Get all MagazineFiles
// @Description API for getting all MagazineFiles
// @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 /magazine-files [get]
func (_i *magazineFilesController) All(c *fiber.Ctx) error {
paginate, err := paginator.Paginate(c)
if err != nil {
return err
}
var req request.MagazineFilesQueryRequest
req.Pagination = paginate
magazineFilesData, paging, err := _i.magazineFilesService.All(req)
if err != nil {
return err
}
return utilRes.Resp(c, utilRes.Response{
Messages: utilRes.Messages{"MagazineFiles list successfully retrieved"},
Data: magazineFilesData,
Meta: paging,
})
}
// Show get one MagazineFiles
// @Summary Get one MagazineFiles
// @Description API for getting one MagazineFiles
// @Tags Task
// @Security Bearer
// @Param id path int true "MagazineFiles 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 /magazine-files/{id} [get]
func (_i *magazineFilesController) Show(c *fiber.Ctx) error {
id, err := strconv.ParseUint(c.Params("id"), 10, 0)
if err != nil {
return err
}
magazineFilesData, err := _i.magazineFilesService.Show(uint(id))
if err != nil {
return err
}
return utilRes.Resp(c, utilRes.Response{
Messages: utilRes.Messages{"MagazineFiles successfully retrieved"},
Data: magazineFilesData,
})
}
// Save create MagazineFiles
// @Summary Create MagazineFiles
// @Description API for create MagazineFiles
// @Tags Task
// @Security Bearer
// @Body request.MagazineFilesCreateRequest
// @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 /magazine-files [post]
func (_i *magazineFilesController) Save(c *fiber.Ctx) error {
req := new(request.MagazineFilesCreateRequest)
if err := utilVal.ParseAndValidate(c, req); err != nil {
return err
}
err := _i.magazineFilesService.Save(*req)
if err != nil {
return err
}
return utilRes.Resp(c, utilRes.Response{
Messages: utilRes.Messages{"MagazineFiles successfully created"},
})
}
// Update update MagazineFiles
// @Summary update MagazineFiles
// @Description API for update MagazineFiles
// @Tags Task
// @Security Bearer
// @Body request.MagazineFilesUpdateRequest
// @Param id path int true "MagazineFiles 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 /magazine-files/{id} [put]
func (_i *magazineFilesController) Update(c *fiber.Ctx) error {
id, err := strconv.ParseUint(c.Params("id"), 10, 0)
if err != nil {
return err
}
req := new(request.MagazineFilesUpdateRequest)
if err := utilVal.ParseAndValidate(c, req); err != nil {
return err
}
err = _i.magazineFilesService.Update(uint(id), *req)
if err != nil {
return err
}
return utilRes.Resp(c, utilRes.Response{
Messages: utilRes.Messages{"MagazineFiles successfully updated"},
})
}
// Delete delete MagazineFiles
// @Summary delete MagazineFiles
// @Description API for delete MagazineFiles
// @Tags Task
// @Security Bearer
// @Param id path int true "MagazineFiles 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 /magazine-files/{id} [delete]
func (_i *magazineFilesController) Delete(c *fiber.Ctx) error {
id, err := strconv.ParseUint(c.Params("id"), 10, 0)
if err != nil {
return err
}
err = _i.magazineFilesService.Delete(uint(id))
if err != nil {
return err
}
return utilRes.Resp(c, utilRes.Response{
Messages: utilRes.Messages{"MagazineFiles successfully deleted"},
})
}

View File

@ -0,0 +1,53 @@
package magazine_files
import (
"github.com/gofiber/fiber/v2"
"go-humas-be/app/module/magazine_files/controller"
"go-humas-be/app/module/magazine_files/repository"
"go-humas-be/app/module/magazine_files/service"
"go.uber.org/fx"
)
// struct of MagazineFilesRouter
type MagazineFilesRouter struct {
App fiber.Router
Controller *controller.Controller
}
// register bulky of MagazineFiles module
var NewMagazineFilesModule = fx.Options(
// register repository of MagazineFiles module
fx.Provide(repository.NewMagazineFilesRepository),
// register service of MagazineFiles module
fx.Provide(service.NewMagazineFilesService),
// register controller of MagazineFiles module
fx.Provide(controller.NewController),
// register router of MagazineFiles module
fx.Provide(NewMagazineFilesRouter),
)
// init MagazineFilesRouter
func NewMagazineFilesRouter(fiber *fiber.App, controller *controller.Controller) *MagazineFilesRouter {
return &MagazineFilesRouter{
App: fiber,
Controller: controller,
}
}
// register routes of MagazineFiles module
func (_i *MagazineFilesRouter) RegisterMagazineFilesRoutes() {
// define controllers
magazineFilesController := _i.Controller.MagazineFiles
// define routes
_i.App.Route("/magazine-files", func(router fiber.Router) {
router.Get("/", magazineFilesController.All)
router.Get("/:id", magazineFilesController.Show)
router.Post("/", magazineFilesController.Save)
router.Put("/:id", magazineFilesController.Update)
router.Delete("/:id", magazineFilesController.Delete)
})
}

View File

@ -0,0 +1,25 @@
package mapper
import (
"go-humas-be/app/database/entity"
res "go-humas-be/app/module/magazine_files/response"
)
func MagazineFilesResponseMapper(magazineFilesReq *entity.MagazineFiles) (magazineFilesRes *res.MagazineFilesResponse) {
if magazineFilesReq != nil {
magazineFilesRes = &res.MagazineFilesResponse{
ID: magazineFilesReq.ID,
Title: magazineFilesReq.Title,
Description: magazineFilesReq.Description,
MagazineId: magazineFilesReq.MagazineId,
DownloadCount: magazineFilesReq.DownloadCount,
StatusId: magazineFilesReq.StatusId,
IsPublish: magazineFilesReq.IsPublish,
PublishedAt: magazineFilesReq.PublishedAt,
IsActive: magazineFilesReq.IsActive,
CreatedAt: magazineFilesReq.CreatedAt,
UpdatedAt: magazineFilesReq.UpdatedAt,
}
}
return magazineFilesRes
}

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/magazine_files/request"
"go-humas-be/utils/paginator"
)
type magazineFilesRepository struct {
DB *database.Database
}
// MagazineFilesRepository define interface of IMagazineFilesRepository
type MagazineFilesRepository interface {
GetAll(req request.MagazineFilesQueryRequest) (magazineFiless []*entity.MagazineFiles, paging paginator.Pagination, err error)
FindOne(id uint) (magazineFiles *entity.MagazineFiles, err error)
Create(magazineFiles *entity.MagazineFiles) (err error)
Update(id uint, magazineFiles *entity.MagazineFiles) (err error)
Delete(id uint) (err error)
}
func NewMagazineFilesRepository(db *database.Database) MagazineFilesRepository {
return &magazineFilesRepository{
DB: db,
}
}
// implement interface of IMagazineFilesRepository
func (_i *magazineFilesRepository) GetAll(req request.MagazineFilesQueryRequest) (magazineFiless []*entity.MagazineFiles, paging paginator.Pagination, err error) {
var count int64
query := _i.DB.DB.Model(&entity.MagazineFiles{})
query.Count(&count)
req.Pagination.Count = count
req.Pagination = paginator.Paging(req.Pagination)
err = query.Offset(req.Pagination.Offset).Limit(req.Pagination.Limit).Find(&magazineFiless).Error
if err != nil {
return
}
paging = *req.Pagination
return
}
func (_i *magazineFilesRepository) FindOne(id uint) (magazineFiles *entity.MagazineFiles, err error) {
if err := _i.DB.DB.First(&magazineFiles, id).Error; err != nil {
return nil, err
}
return magazineFiles, nil
}
func (_i *magazineFilesRepository) Create(magazineFiles *entity.MagazineFiles) (err error) {
return _i.DB.DB.Create(magazineFiles).Error
}
func (_i *magazineFilesRepository) Update(id uint, magazineFiles *entity.MagazineFiles) (err error) {
return _i.DB.DB.Model(&entity.MagazineFiles{}).
Where(&entity.MagazineFiles{ID: id}).
Updates(magazineFiles).Error
}
func (_i *magazineFilesRepository) Delete(id uint) error {
return _i.DB.DB.Delete(&entity.MagazineFiles{}, id).Error
}

View File

@ -0,0 +1,77 @@
package request
import (
"go-humas-be/app/database/entity"
"go-humas-be/utils/paginator"
"time"
)
type MagazineFilesGeneric interface {
ToEntity()
}
type MagazineFilesQueryRequest struct {
Title string `json:"title" validate:"required"`
Description string `json:"description" validate:"required"`
MagazineId int `json:"magazine_id" validate:"required"`
DownloadCount int `json:"download_count" validate:"required"`
StatusId int `json:"status_id" validate:"required"`
IsPublish bool `json:"is_publish" validate:"required"`
PublishedAt time.Time `json:"published_at" validate:"required"`
IsActive bool `json:"is_active" validate:"required"`
Pagination *paginator.Pagination `json:"pagination"`
}
type MagazineFilesCreateRequest struct {
Title string `json:"title" validate:"required"`
Description string `json:"description" validate:"required"`
MagazineId int `json:"magazine_id" validate:"required"`
DownloadCount int `json:"download_count" validate:"required"`
StatusId int `json:"status_id" validate:"required"`
IsPublish bool `json:"is_publish" validate:"required"`
PublishedAt time.Time `json:"published_at" validate:"required"`
IsActive bool `json:"is_active" validate:"required"`
}
func (req MagazineFilesCreateRequest) ToEntity() *entity.MagazineFiles {
return &entity.MagazineFiles{
Title: req.Title,
Description: req.Description,
MagazineId: req.MagazineId,
DownloadCount: req.DownloadCount,
StatusId: req.StatusId,
IsPublish: req.IsPublish,
PublishedAt: req.PublishedAt,
IsActive: req.IsActive,
}
}
type MagazineFilesUpdateRequest struct {
ID uint `json:"id" validate:"required"`
Title string `json:"title" validate:"required"`
Description string `json:"description" validate:"required"`
MagazineId int `json:"magazine_id" validate:"required"`
DownloadCount int `json:"download_count" validate:"required"`
StatusId int `json:"status_id" validate:"required"`
IsPublish bool `json:"is_publish" validate:"required"`
PublishedAt time.Time `json:"published_at" validate:"required"`
IsActive bool `json:"is_active" validate:"required"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
func (req MagazineFilesUpdateRequest) ToEntity() *entity.MagazineFiles {
return &entity.MagazineFiles{
ID: req.ID,
Title: req.Title,
Description: req.Description,
MagazineId: req.MagazineId,
DownloadCount: req.DownloadCount,
StatusId: req.StatusId,
IsPublish: req.IsPublish,
PublishedAt: req.PublishedAt,
IsActive: req.IsActive,
CreatedAt: req.CreatedAt,
UpdatedAt: req.UpdatedAt,
}
}

View File

@ -0,0 +1,17 @@
package response
import "time"
type MagazineFilesResponse struct {
ID uint `json:"id"`
Title string `json:"title"`
Description string `json:"description"`
MagazineId int `json:"magazine_id"`
DownloadCount int `json:"download_count"`
StatusId int `json:"status_id"`
IsPublish bool `json:"is_publish"`
PublishedAt time.Time `json:"published_at"`
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/magazine_files/mapper"
"go-humas-be/app/module/magazine_files/repository"
"go-humas-be/app/module/magazine_files/request"
"go-humas-be/app/module/magazine_files/response"
"go-humas-be/utils/paginator"
)
// MagazineFilesService
type magazineFilesService struct {
Repo repository.MagazineFilesRepository
Log zerolog.Logger
}
// MagazineFilesService define interface of IMagazineFilesService
type MagazineFilesService interface {
All(req request.MagazineFilesQueryRequest) (magazineFiles []*response.MagazineFilesResponse, paging paginator.Pagination, err error)
Show(id uint) (magazineFiles *response.MagazineFilesResponse, err error)
Save(req request.MagazineFilesCreateRequest) (err error)
Update(id uint, req request.MagazineFilesUpdateRequest) (err error)
Delete(id uint) error
}
// NewMagazineFilesService init MagazineFilesService
func NewMagazineFilesService(repo repository.MagazineFilesRepository, log zerolog.Logger) MagazineFilesService {
return &magazineFilesService{
Repo: repo,
Log: log,
}
}
// All implement interface of MagazineFilesService
func (_i *magazineFilesService) All(req request.MagazineFilesQueryRequest) (magazineFiless []*response.MagazineFilesResponse, paging paginator.Pagination, err error) {
results, paging, err := _i.Repo.GetAll(req)
if err != nil {
return
}
for _, result := range results {
magazineFiless = append(magazineFiless, mapper.MagazineFilesResponseMapper(result))
}
return
}
func (_i *magazineFilesService) Show(id uint) (magazineFiles *response.MagazineFilesResponse, err error) {
result, err := _i.Repo.FindOne(id)
if err != nil {
return nil, err
}
return mapper.MagazineFilesResponseMapper(result), nil
}
func (_i *magazineFilesService) Save(req request.MagazineFilesCreateRequest) (err error) {
_i.Log.Info().Interface("data", req).Msg("")
return _i.Repo.Create(req.ToEntity())
}
func (_i *magazineFilesService) Update(id uint, req request.MagazineFilesUpdateRequest) (err error) {
_i.Log.Info().Interface("data", req).Msg("")
return _i.Repo.Update(id, req.ToEntity())
}
func (_i *magazineFilesService) Delete(id uint) error {
return _i.Repo.Delete(id)
}

View File

@ -0,0 +1,13 @@
package controller
import "go-humas-be/app/module/magazines/service"
type Controller struct {
Magazines MagazinesController
}
func NewController(MagazinesService service.MagazinesService) *Controller {
return &Controller{
Magazines: NewMagazinesController(MagazinesService),
}
}

View File

@ -0,0 +1,181 @@
package controller
import (
"github.com/gofiber/fiber/v2"
"go-humas-be/app/module/magazines/request"
"go-humas-be/app/module/magazines/service"
"go-humas-be/utils/paginator"
"strconv"
utilRes "go-humas-be/utils/response"
utilVal "go-humas-be/utils/validator"
)
type magazinesController struct {
magazinesService service.MagazinesService
}
type MagazinesController 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 NewMagazinesController(magazinesService service.MagazinesService) MagazinesController {
return &magazinesController{
magazinesService: magazinesService,
}
}
// All get all Magazines
// @Summary Get all Magazines
// @Description API for getting all Magazines
// @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 /magazines [get]
func (_i *magazinesController) All(c *fiber.Ctx) error {
paginate, err := paginator.Paginate(c)
if err != nil {
return err
}
var req request.MagazinesQueryRequest
req.Pagination = paginate
magazinesData, paging, err := _i.magazinesService.All(req)
if err != nil {
return err
}
return utilRes.Resp(c, utilRes.Response{
Messages: utilRes.Messages{"Magazines list successfully retrieved"},
Data: magazinesData,
Meta: paging,
})
}
// Show get one Magazines
// @Summary Get one Magazines
// @Description API for getting one Magazines
// @Tags Task
// @Security Bearer
// @Param id path int true "Magazines 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 /magazines/{id} [get]
func (_i *magazinesController) Show(c *fiber.Ctx) error {
id, err := strconv.ParseUint(c.Params("id"), 10, 0)
if err != nil {
return err
}
magazinesData, err := _i.magazinesService.Show(uint(id))
if err != nil {
return err
}
return utilRes.Resp(c, utilRes.Response{
Messages: utilRes.Messages{"Magazines successfully retrieved"},
Data: magazinesData,
})
}
// Save create Magazines
// @Summary Create Magazines
// @Description API for create Magazines
// @Tags Task
// @Security Bearer
// @Body request.MagazinesCreateRequest
// @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 /magazines [post]
func (_i *magazinesController) Save(c *fiber.Ctx) error {
req := new(request.MagazinesCreateRequest)
if err := utilVal.ParseAndValidate(c, req); err != nil {
return err
}
err := _i.magazinesService.Save(*req)
if err != nil {
return err
}
return utilRes.Resp(c, utilRes.Response{
Messages: utilRes.Messages{"Magazines successfully created"},
})
}
// Update update Magazines
// @Summary update Magazines
// @Description API for update Magazines
// @Tags Task
// @Security Bearer
// @Body request.MagazinesUpdateRequest
// @Param id path int true "Magazines 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 /magazines/{id} [put]
func (_i *magazinesController) Update(c *fiber.Ctx) error {
id, err := strconv.ParseUint(c.Params("id"), 10, 0)
if err != nil {
return err
}
req := new(request.MagazinesUpdateRequest)
if err := utilVal.ParseAndValidate(c, req); err != nil {
return err
}
err = _i.magazinesService.Update(uint(id), *req)
if err != nil {
return err
}
return utilRes.Resp(c, utilRes.Response{
Messages: utilRes.Messages{"Magazines successfully updated"},
})
}
// Delete delete Magazines
// @Summary delete Magazines
// @Description API for delete Magazines
// @Tags Task
// @Security Bearer
// @Param id path int true "Magazines 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 /magazines/{id} [delete]
func (_i *magazinesController) Delete(c *fiber.Ctx) error {
id, err := strconv.ParseUint(c.Params("id"), 10, 0)
if err != nil {
return err
}
err = _i.magazinesService.Delete(uint(id))
if err != nil {
return err
}
return utilRes.Resp(c, utilRes.Response{
Messages: utilRes.Messages{"Magazines successfully deleted"},
})
}

View File

@ -0,0 +1,53 @@
package magazines
import (
"github.com/gofiber/fiber/v2"
"go-humas-be/app/module/magazines/controller"
"go-humas-be/app/module/magazines/repository"
"go-humas-be/app/module/magazines/service"
"go.uber.org/fx"
)
// struct of MagazinesRouter
type MagazinesRouter struct {
App fiber.Router
Controller *controller.Controller
}
// register bulky of Magazines module
var NewMagazinesModule = fx.Options(
// register repository of Magazines module
fx.Provide(repository.NewMagazinesRepository),
// register service of Magazines module
fx.Provide(service.NewMagazinesService),
// register controller of Magazines module
fx.Provide(controller.NewController),
// register router of Magazines module
fx.Provide(NewMagazinesRouter),
)
// init MagazinesRouter
func NewMagazinesRouter(fiber *fiber.App, controller *controller.Controller) *MagazinesRouter {
return &MagazinesRouter{
App: fiber,
Controller: controller,
}
}
// register routes of Magazines module
func (_i *MagazinesRouter) RegisterMagazinesRoutes() {
// define controllers
magazinesController := _i.Controller.Magazines
// define routes
_i.App.Route("/magazines", func(router fiber.Router) {
router.Get("/", magazinesController.All)
router.Get("/:id", magazinesController.Show)
router.Post("/", magazinesController.Save)
router.Put("/:id", magazinesController.Update)
router.Delete("/:id", magazinesController.Delete)
})
}

View File

@ -0,0 +1,27 @@
package mapper
import (
"go-humas-be/app/database/entity"
res "go-humas-be/app/module/magazines/response"
)
func MagazinesResponseMapper(magazinesReq *entity.Magazines) (magazinesRes *res.MagazinesResponse) {
if magazinesReq != nil {
magazinesRes = &res.MagazinesResponse{
ID: magazinesReq.ID,
Title: magazinesReq.Title,
Description: magazinesReq.Description,
ThumbnailPath: magazinesReq.ThumbnailPath,
ThumbnailUrl: magazinesReq.ThumbnailUrl,
PageUrl: magazinesReq.PageUrl,
CreatedById: magazinesReq.CreatedById,
StatusId: magazinesReq.StatusId,
IsPublish: magazinesReq.IsPublish,
PublishedAt: magazinesReq.PublishedAt,
IsActive: magazinesReq.IsActive,
CreatedAt: magazinesReq.CreatedAt,
UpdatedAt: magazinesReq.UpdatedAt,
}
}
return magazinesRes
}

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/magazines/request"
"go-humas-be/utils/paginator"
)
type magazinesRepository struct {
DB *database.Database
}
// MagazinesRepository define interface of IMagazinesRepository
type MagazinesRepository interface {
GetAll(req request.MagazinesQueryRequest) (magaziness []*entity.Magazines, paging paginator.Pagination, err error)
FindOne(id uint) (magazines *entity.Magazines, err error)
Create(magazines *entity.Magazines) (err error)
Update(id uint, magazines *entity.Magazines) (err error)
Delete(id uint) (err error)
}
func NewMagazinesRepository(db *database.Database) MagazinesRepository {
return &magazinesRepository{
DB: db,
}
}
// implement interface of IMagazinesRepository
func (_i *magazinesRepository) GetAll(req request.MagazinesQueryRequest) (magaziness []*entity.Magazines, paging paginator.Pagination, err error) {
var count int64
query := _i.DB.DB.Model(&entity.Magazines{})
query.Count(&count)
req.Pagination.Count = count
req.Pagination = paginator.Paging(req.Pagination)
err = query.Offset(req.Pagination.Offset).Limit(req.Pagination.Limit).Find(&magaziness).Error
if err != nil {
return
}
paging = *req.Pagination
return
}
func (_i *magazinesRepository) FindOne(id uint) (magazines *entity.Magazines, err error) {
if err := _i.DB.DB.First(&magazines, id).Error; err != nil {
return nil, err
}
return magazines, nil
}
func (_i *magazinesRepository) Create(magazines *entity.Magazines) (err error) {
return _i.DB.DB.Create(magazines).Error
}
func (_i *magazinesRepository) Update(id uint, magazines *entity.Magazines) (err error) {
return _i.DB.DB.Model(&entity.Magazines{}).
Where(&entity.Magazines{ID: id}).
Updates(magazines).Error
}
func (_i *magazinesRepository) Delete(id uint) error {
return _i.DB.DB.Delete(&entity.Magazines{}, id).Error
}

View File

@ -0,0 +1,87 @@
package request
import (
"go-humas-be/app/database/entity"
"go-humas-be/utils/paginator"
"time"
)
type MagazinesGeneric interface {
ToEntity()
}
type MagazinesQueryRequest struct {
Title string `json:"title" validate:"required"`
Description string `json:"description" validate:"required"`
ThumbnailPath string `json:"thumbnail_path" validate:"required"`
ThumbnailUrl string `json:"thumbnail_url" validate:"required"`
PageUrl string `json:"page_url" validate:"required"`
CreatedById int `json:"created_by_id" validate:"required"`
StatusId int `json:"status_id" validate:"required"`
IsPublish bool `json:"is_publish" validate:"required"`
PublishedAt time.Time `json:"published_at" validate:"required"`
IsActive bool `json:"is_active" validate:"required"`
Pagination *paginator.Pagination `json:"pagination"`
}
type MagazinesCreateRequest struct {
Title string `json:"title" validate:"required"`
Description string `json:"description" validate:"required"`
ThumbnailPath string `json:"thumbnail_path" validate:"required"`
ThumbnailUrl string `json:"thumbnail_url" validate:"required"`
PageUrl string `json:"page_url" validate:"required"`
CreatedById int `json:"created_by_id" validate:"required"`
StatusId int `json:"status_id" validate:"required"`
IsPublish bool `json:"is_publish" validate:"required"`
PublishedAt time.Time `json:"published_at" validate:"required"`
IsActive bool `json:"is_active" validate:"required"`
}
func (req MagazinesCreateRequest) ToEntity() *entity.Magazines {
return &entity.Magazines{
Title: req.Title,
Description: req.Description,
ThumbnailPath: req.ThumbnailPath,
ThumbnailUrl: req.ThumbnailUrl,
PageUrl: req.PageUrl,
CreatedById: req.CreatedById,
StatusId: req.StatusId,
IsPublish: req.IsPublish,
PublishedAt: req.PublishedAt,
IsActive: req.IsActive,
}
}
type MagazinesUpdateRequest struct {
ID uint `json:"id" validate:"required"`
Title string `json:"title" validate:"required"`
Description string `json:"description" validate:"required"`
ThumbnailPath string `json:"thumbnail_path" validate:"required"`
ThumbnailUrl string `json:"thumbnail_url" validate:"required"`
PageUrl string `json:"page_url" validate:"required"`
CreatedById int `json:"created_by_id" validate:"required"`
StatusId int `json:"status_id" validate:"required"`
IsPublish bool `json:"is_publish" validate:"required"`
PublishedAt time.Time `json:"published_at" validate:"required"`
IsActive bool `json:"is_active" validate:"required"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
func (req MagazinesUpdateRequest) ToEntity() *entity.Magazines {
return &entity.Magazines{
ID: req.ID,
Title: req.Title,
Description: req.Description,
ThumbnailPath: req.ThumbnailPath,
ThumbnailUrl: req.ThumbnailUrl,
PageUrl: req.PageUrl,
CreatedById: req.CreatedById,
StatusId: req.StatusId,
IsPublish: req.IsPublish,
PublishedAt: req.PublishedAt,
IsActive: req.IsActive,
CreatedAt: req.CreatedAt,
UpdatedAt: req.UpdatedAt,
}
}

View File

@ -0,0 +1,19 @@
package response
import "time"
type MagazinesResponse struct {
ID uint `json:"id"`
Title string `json:"title"`
Description string `json:"description"`
ThumbnailPath string `json:"thumbnail_path"`
ThumbnailUrl string `json:"thumbnail_url"`
PageUrl string `json:"page_url"`
CreatedById int `json:"created_by_id"`
StatusId int `json:"status_id"`
IsPublish bool `json:"is_publish"`
PublishedAt time.Time `json:"published_at"`
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/magazines/mapper"
"go-humas-be/app/module/magazines/repository"
"go-humas-be/app/module/magazines/request"
"go-humas-be/app/module/magazines/response"
"go-humas-be/utils/paginator"
)
// MagazinesService
type magazinesService struct {
Repo repository.MagazinesRepository
Log zerolog.Logger
}
// MagazinesService define interface of IMagazinesService
type MagazinesService interface {
All(req request.MagazinesQueryRequest) (magazines []*response.MagazinesResponse, paging paginator.Pagination, err error)
Show(id uint) (magazines *response.MagazinesResponse, err error)
Save(req request.MagazinesCreateRequest) (err error)
Update(id uint, req request.MagazinesUpdateRequest) (err error)
Delete(id uint) error
}
// NewMagazinesService init MagazinesService
func NewMagazinesService(repo repository.MagazinesRepository, log zerolog.Logger) MagazinesService {
return &magazinesService{
Repo: repo,
Log: log,
}
}
// All implement interface of MagazinesService
func (_i *magazinesService) All(req request.MagazinesQueryRequest) (magaziness []*response.MagazinesResponse, paging paginator.Pagination, err error) {
results, paging, err := _i.Repo.GetAll(req)
if err != nil {
return
}
for _, result := range results {
magaziness = append(magaziness, mapper.MagazinesResponseMapper(result))
}
return
}
func (_i *magazinesService) Show(id uint) (magazines *response.MagazinesResponse, err error) {
result, err := _i.Repo.FindOne(id)
if err != nil {
return nil, err
}
return mapper.MagazinesResponseMapper(result), nil
}
func (_i *magazinesService) Save(req request.MagazinesCreateRequest) (err error) {
_i.Log.Info().Interface("data", req).Msg("")
return _i.Repo.Create(req.ToEntity())
}
func (_i *magazinesService) Update(id uint, req request.MagazinesUpdateRequest) (err error) {
_i.Log.Info().Interface("data", req).Msg("")
return _i.Repo.Update(id, req.ToEntity())
}
func (_i *magazinesService) Delete(id uint) error {
return _i.Repo.Delete(id)
}

View File

@ -0,0 +1,13 @@
package controller
import "go-humas-be/app/module/master_menus/service"
type Controller struct {
MasterMenus MasterMenusController
}
func NewController(MasterMenusService service.MasterMenusService) *Controller {
return &Controller{
MasterMenus: NewMasterMenusController(MasterMenusService),
}
}

View File

@ -0,0 +1,181 @@
package controller
import (
"github.com/gofiber/fiber/v2"
"go-humas-be/app/module/master_menus/request"
"go-humas-be/app/module/master_menus/service"
"go-humas-be/utils/paginator"
"strconv"
utilRes "go-humas-be/utils/response"
utilVal "go-humas-be/utils/validator"
)
type masterMenusController struct {
masterMenusService service.MasterMenusService
}
type MasterMenusController 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 NewMasterMenusController(masterMenusService service.MasterMenusService) MasterMenusController {
return &masterMenusController{
masterMenusService: masterMenusService,
}
}
// All get all MasterMenus
// @Summary Get all MasterMenus
// @Description API for getting all MasterMenus
// @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 /master-menus [get]
func (_i *masterMenusController) All(c *fiber.Ctx) error {
paginate, err := paginator.Paginate(c)
if err != nil {
return err
}
var req request.MasterMenusQueryRequest
req.Pagination = paginate
masterMenusData, paging, err := _i.masterMenusService.All(req)
if err != nil {
return err
}
return utilRes.Resp(c, utilRes.Response{
Messages: utilRes.Messages{"MasterMenus list successfully retrieved"},
Data: masterMenusData,
Meta: paging,
})
}
// Show get one MasterMenus
// @Summary Get one MasterMenus
// @Description API for getting one MasterMenus
// @Tags Task
// @Security Bearer
// @Param id path int true "MasterMenus 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 /master-menus/{id} [get]
func (_i *masterMenusController) Show(c *fiber.Ctx) error {
id, err := strconv.ParseUint(c.Params("id"), 10, 0)
if err != nil {
return err
}
masterMenusData, err := _i.masterMenusService.Show(uint(id))
if err != nil {
return err
}
return utilRes.Resp(c, utilRes.Response{
Messages: utilRes.Messages{"MasterMenus successfully retrieved"},
Data: masterMenusData,
})
}
// Save create MasterMenus
// @Summary Create MasterMenus
// @Description API for create MasterMenus
// @Tags Task
// @Security Bearer
// @Body request.MasterMenusCreateRequest
// @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 /master-menus [post]
func (_i *masterMenusController) Save(c *fiber.Ctx) error {
req := new(request.MasterMenusCreateRequest)
if err := utilVal.ParseAndValidate(c, req); err != nil {
return err
}
err := _i.masterMenusService.Save(*req)
if err != nil {
return err
}
return utilRes.Resp(c, utilRes.Response{
Messages: utilRes.Messages{"MasterMenus successfully created"},
})
}
// Update update MasterMenus
// @Summary update MasterMenus
// @Description API for update MasterMenus
// @Tags Task
// @Security Bearer
// @Body request.MasterMenusUpdateRequest
// @Param id path int true "MasterMenus 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 /master-menus/{id} [put]
func (_i *masterMenusController) Update(c *fiber.Ctx) error {
id, err := strconv.ParseUint(c.Params("id"), 10, 0)
if err != nil {
return err
}
req := new(request.MasterMenusUpdateRequest)
if err := utilVal.ParseAndValidate(c, req); err != nil {
return err
}
err = _i.masterMenusService.Update(uint(id), *req)
if err != nil {
return err
}
return utilRes.Resp(c, utilRes.Response{
Messages: utilRes.Messages{"MasterMenus successfully updated"},
})
}
// Delete delete MasterMenus
// @Summary delete MasterMenus
// @Description API for delete MasterMenus
// @Tags Task
// @Security Bearer
// @Param id path int true "MasterMenus 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 /master-menus/{id} [delete]
func (_i *masterMenusController) Delete(c *fiber.Ctx) error {
id, err := strconv.ParseUint(c.Params("id"), 10, 0)
if err != nil {
return err
}
err = _i.masterMenusService.Delete(uint(id))
if err != nil {
return err
}
return utilRes.Resp(c, utilRes.Response{
Messages: utilRes.Messages{"MasterMenus successfully deleted"},
})
}

View File

@ -0,0 +1,25 @@
package mapper
import (
"go-humas-be/app/database/entity"
res "go-humas-be/app/module/master_menus/response"
)
func MasterMenusResponseMapper(masterMenusReq *entity.MasterMenus) (masterMenusRes *res.MasterMenusResponse) {
if masterMenusReq != nil {
masterMenusRes = &res.MasterMenusResponse{
ID: masterMenusReq.ID,
Name: masterMenusReq.Name,
Description: masterMenusReq.Description,
ModuleId: masterMenusReq.ModuleId,
ParentMenuId: masterMenusReq.ParentMenuId,
Icon: masterMenusReq.Icon,
Position: masterMenusReq.Position,
StatusId: masterMenusReq.StatusId,
IsActive: masterMenusReq.IsActive,
CreatedAt: masterMenusReq.CreatedAt,
UpdatedAt: masterMenusReq.UpdatedAt,
}
}
return masterMenusRes
}

View File

@ -0,0 +1,53 @@
package master_menus
import (
"github.com/gofiber/fiber/v2"
"go-humas-be/app/module/master_menus/controller"
"go-humas-be/app/module/master_menus/repository"
"go-humas-be/app/module/master_menus/service"
"go.uber.org/fx"
)
// struct of MasterMenusRouter
type MasterMenusRouter struct {
App fiber.Router
Controller *controller.Controller
}
// register bulky of MasterMenus module
var NewMasterMenusModule = fx.Options(
// register repository of MasterMenus module
fx.Provide(repository.NewMasterMenusRepository),
// register service of MasterMenus module
fx.Provide(service.NewMasterMenusService),
// register controller of MasterMenus module
fx.Provide(controller.NewController),
// register router of MasterMenus module
fx.Provide(NewMasterMenusRouter),
)
// init MasterMenusRouter
func NewMasterMenusRouter(fiber *fiber.App, controller *controller.Controller) *MasterMenusRouter {
return &MasterMenusRouter{
App: fiber,
Controller: controller,
}
}
// register routes of MasterMenus module
func (_i *MasterMenusRouter) RegisterMasterMenusRoutes() {
// define controllers
masterMenusController := _i.Controller.MasterMenus
// define routes
_i.App.Route("/master-menus", func(router fiber.Router) {
router.Get("/", masterMenusController.All)
router.Get("/:id", masterMenusController.Show)
router.Post("/", masterMenusController.Save)
router.Put("/:id", masterMenusController.Update)
router.Delete("/:id", masterMenusController.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/master_menus/request"
"go-humas-be/utils/paginator"
)
type masterMenusRepository struct {
DB *database.Database
}
// MasterMenusRepository define interface of IMasterMenusRepository
type MasterMenusRepository interface {
GetAll(req request.MasterMenusQueryRequest) (masterMenuss []*entity.MasterMenus, paging paginator.Pagination, err error)
FindOne(id uint) (masterMenus *entity.MasterMenus, err error)
Create(masterMenus *entity.MasterMenus) (err error)
Update(id uint, masterMenus *entity.MasterMenus) (err error)
Delete(id uint) (err error)
}
func NewMasterMenusRepository(db *database.Database) MasterMenusRepository {
return &masterMenusRepository{
DB: db,
}
}
// implement interface of IMasterMenusRepository
func (_i *masterMenusRepository) GetAll(req request.MasterMenusQueryRequest) (masterMenuss []*entity.MasterMenus, paging paginator.Pagination, err error) {
var count int64
query := _i.DB.DB.Model(&entity.MasterMenus{})
query.Count(&count)
req.Pagination.Count = count
req.Pagination = paginator.Paging(req.Pagination)
err = query.Offset(req.Pagination.Offset).Limit(req.Pagination.Limit).Find(&masterMenuss).Error
if err != nil {
return
}
paging = *req.Pagination
return
}
func (_i *masterMenusRepository) FindOne(id uint) (masterMenus *entity.MasterMenus, err error) {
if err := _i.DB.DB.First(&masterMenus, id).Error; err != nil {
return nil, err
}
return masterMenus, nil
}
func (_i *masterMenusRepository) Create(masterMenus *entity.MasterMenus) (err error) {
return _i.DB.DB.Create(masterMenus).Error
}
func (_i *masterMenusRepository) Update(id uint, masterMenus *entity.MasterMenus) (err error) {
return _i.DB.DB.Model(&entity.MasterMenus{}).
Where(&entity.MasterMenus{ID: id}).
Updates(masterMenus).Error
}
func (_i *masterMenusRepository) Delete(id uint) error {
return _i.DB.DB.Delete(&entity.MasterMenus{}, id).Error
}

View File

@ -0,0 +1,78 @@
package request
import (
"go-humas-be/app/database/entity"
"go-humas-be/utils/paginator"
"time"
)
type MasterMenusGeneric interface {
ToEntity()
}
type MasterMenusQueryRequest struct {
Name string `json:"name" validate:"required"`
Description string `json:"description" validate:"required"`
ModuleId int `json:"module_id" validate:"required"`
ParentMenuId int `json:"parent_menu_id" validate:"required"`
Icon string `json:"icon" validate:"required"`
Position int `json:"position" validate:"required"`
StatusId int `json:"status_id" validate:"required"`
IsActive bool `json:"is_active" validate:"required"`
Pagination *paginator.Pagination `json:"pagination"`
}
type MasterMenusCreateRequest struct {
Name string `json:"name" validate:"required"`
Description string `json:"description" validate:"required"`
ModuleId int `json:"module_id" validate:"required"`
ParentMenuId int `json:"parent_menu_id" validate:"required"`
Icon string `json:"icon" validate:"required"`
Position int `json:"position" validate:"required"`
StatusId int `json:"status_id" validate:"required"`
IsActive bool `json:"is_active" validate:"required"`
}
func (req MasterMenusCreateRequest) ToEntity() *entity.MasterMenus {
return &entity.MasterMenus{
Name: req.Name,
Description: req.Description,
ModuleId: req.ModuleId,
ParentMenuId: req.ParentMenuId,
Icon: req.Icon,
Position: req.Position,
StatusId: req.StatusId,
IsActive: req.IsActive,
}
}
type MasterMenusUpdateRequest struct {
ID uint `json:"id" validate:"required"`
Name string `json:"name" validate:"required"`
Description string `json:"description" validate:"required"`
ModuleId int `json:"module_id" validate:"required"`
ParentMenuId int `json:"parent_menu_id" validate:"required"`
Icon string `json:"icon" validate:"required"`
Position int `json:"position" validate:"required"`
StatusId int `json:"status_id" validate:"required"`
IsActive bool `json:"is_active" validate:"required"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
func (req MasterMenusUpdateRequest) ToEntity() *entity.MasterMenus {
return &entity.MasterMenus{
ID: req.ID,
Name: req.Name,
Description: req.Description,
ModuleId: req.ModuleId,
ParentMenuId: req.ParentMenuId,
Icon: req.Icon,
Position: req.Position,
StatusId: req.StatusId,
IsActive: req.IsActive,
CreatedAt: req.CreatedAt,
UpdatedAt: req.UpdatedAt,
}
}

View File

@ -0,0 +1,17 @@
package response
import "time"
type MasterMenusResponse struct {
ID uint `json:"id"`
Name string `json:"name"`
Description string `json:"description"`
ModuleId int `json:"module_id"`
ParentMenuId int `json:"parent_menu_id"`
Icon string `json:"icon"`
Position int `json:"position"`
StatusId int `json:"status_id"`
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/master_menus/mapper"
"go-humas-be/app/module/master_menus/repository"
"go-humas-be/app/module/master_menus/request"
"go-humas-be/app/module/master_menus/response"
"go-humas-be/utils/paginator"
)
// MasterMenusService
type masterMenusService struct {
Repo repository.MasterMenusRepository
Log zerolog.Logger
}
// MasterMenusService define interface of IMasterMenusService
type MasterMenusService interface {
All(req request.MasterMenusQueryRequest) (masterMenus []*response.MasterMenusResponse, paging paginator.Pagination, err error)
Show(id uint) (masterMenus *response.MasterMenusResponse, err error)
Save(req request.MasterMenusCreateRequest) (err error)
Update(id uint, req request.MasterMenusUpdateRequest) (err error)
Delete(id uint) error
}
// NewMasterMenusService init MasterMenusService
func NewMasterMenusService(repo repository.MasterMenusRepository, log zerolog.Logger) MasterMenusService {
return &masterMenusService{
Repo: repo,
Log: log,
}
}
// All implement interface of MasterMenusService
func (_i *masterMenusService) All(req request.MasterMenusQueryRequest) (masterMenuss []*response.MasterMenusResponse, paging paginator.Pagination, err error) {
results, paging, err := _i.Repo.GetAll(req)
if err != nil {
return
}
for _, result := range results {
masterMenuss = append(masterMenuss, mapper.MasterMenusResponseMapper(result))
}
return
}
func (_i *masterMenusService) Show(id uint) (masterMenus *response.MasterMenusResponse, err error) {
result, err := _i.Repo.FindOne(id)
if err != nil {
return nil, err
}
return mapper.MasterMenusResponseMapper(result), nil
}
func (_i *masterMenusService) Save(req request.MasterMenusCreateRequest) (err error) {
_i.Log.Info().Interface("data", req).Msg("")
return _i.Repo.Create(req.ToEntity())
}
func (_i *masterMenusService) Update(id uint, req request.MasterMenusUpdateRequest) (err error) {
_i.Log.Info().Interface("data", req).Msg("")
return _i.Repo.Update(id, req.ToEntity())
}
func (_i *masterMenusService) Delete(id uint) error {
return _i.Repo.Delete(id)
}

Some files were not shown because too many files have changed in this diff Show More