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