feat: initial commit
This commit is contained in:
commit
07064f13ce
|
|
@ -0,0 +1 @@
|
||||||
|
/vendor
|
||||||
|
|
@ -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
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
go-humas-be
|
||||||
|
|
@ -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>
|
||||||
|
|
@ -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>
|
||||||
|
|
@ -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>
|
||||||
|
|
@ -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()"`
|
||||||
|
}
|
||||||
|
|
@ -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()"`
|
||||||
|
}
|
||||||
|
|
@ -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()"`
|
||||||
|
}
|
||||||
|
|
@ -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()"`
|
||||||
|
}
|
||||||
|
|
@ -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"`
|
||||||
|
}
|
||||||
|
|
@ -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"`
|
||||||
|
}
|
||||||
|
|
@ -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()"`
|
||||||
|
}
|
||||||
|
|
@ -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()"`
|
||||||
|
}
|
||||||
|
|
@ -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()"`
|
||||||
|
}
|
||||||
|
|
@ -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()"`
|
||||||
|
}
|
||||||
|
|
@ -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"`
|
||||||
|
}
|
||||||
|
|
@ -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()"`
|
||||||
|
}
|
||||||
|
|
@ -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()"`
|
||||||
|
}
|
||||||
|
|
@ -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()"`
|
||||||
|
}
|
||||||
|
|
@ -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"`
|
||||||
|
}
|
||||||
|
|
@ -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()"`
|
||||||
|
}
|
||||||
|
|
@ -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()"`
|
||||||
|
}
|
||||||
|
|
@ -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()"`
|
||||||
|
}
|
||||||
|
|
@ -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()"`
|
||||||
|
}
|
||||||
|
|
@ -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!")
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
@ -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),
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
|
@ -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)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
@ -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"},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
@ -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),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
@ -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,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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"`
|
||||||
|
}
|
||||||
|
|
@ -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)
|
||||||
|
}
|
||||||
|
|
@ -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)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
@ -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"},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
@ -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),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
@ -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,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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"`
|
||||||
|
}
|
||||||
|
|
@ -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)
|
||||||
|
}
|
||||||
|
|
@ -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)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
@ -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"))
|
||||||
|
}
|
||||||
|
|
@ -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),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
@ -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,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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"`
|
||||||
|
}
|
||||||
|
|
@ -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]
|
||||||
|
}
|
||||||
|
|
@ -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)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
@ -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"},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
@ -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),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
@ -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,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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"`
|
||||||
|
}
|
||||||
|
|
@ -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)
|
||||||
|
}
|
||||||
|
|
@ -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)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
@ -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"},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
@ -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),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
@ -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,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
package response
|
||||||
|
|
||||||
|
type CitiesResponse struct {
|
||||||
|
ID uint `json:"id"`
|
||||||
|
CityName string `json:"city_name"`
|
||||||
|
ProvId int `json:"prov_id"`
|
||||||
|
}
|
||||||
|
|
@ -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)
|
||||||
|
}
|
||||||
|
|
@ -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),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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"},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
@ -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)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
@ -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,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
package response
|
||||||
|
|
||||||
|
type DistrictsResponse struct {
|
||||||
|
ID uint `json:"id"`
|
||||||
|
DisNam string `json:"dis_nam"`
|
||||||
|
CityId int `json:"city_id"`
|
||||||
|
}
|
||||||
|
|
@ -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)
|
||||||
|
}
|
||||||
|
|
@ -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),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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"},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
@ -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)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
@ -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,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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"`
|
||||||
|
}
|
||||||
|
|
@ -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)
|
||||||
|
}
|
||||||
|
|
@ -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),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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"},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
@ -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)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
@ -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,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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"`
|
||||||
|
}
|
||||||
|
|
@ -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)
|
||||||
|
}
|
||||||
|
|
@ -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),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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"},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
@ -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)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
@ -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,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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"`
|
||||||
|
}
|
||||||
|
|
@ -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
Loading…
Reference in New Issue