feat: add article approval

This commit is contained in:
hanif salafi 2025-02-17 21:02:17 +07:00
parent 6b8ab00e3b
commit f24cf7dcc4
9 changed files with 1063 additions and 26 deletions

View File

@ -3,29 +3,31 @@ package entity
import "time" import "time"
type Articles struct { type Articles struct {
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
Title string `json:"title" gorm:"type:varchar"` Title string `json:"title" gorm:"type:varchar"`
Slug string `json:"slug" gorm:"type:varchar"` Slug string `json:"slug" gorm:"type:varchar"`
Description string `json:"description" gorm:"type:varchar"` Description string `json:"description" gorm:"type:varchar"`
CategoryId int `json:"category_id" gorm:"type:int4"` CategoryId int `json:"category_id" gorm:"type:int4"`
HtmlDescription string `json:"html_description" gorm:"type:varchar"` HtmlDescription string `json:"html_description" gorm:"type:varchar"`
TypeId int `json:"type_id" gorm:"type:int4"` TypeId int `json:"type_id" gorm:"type:int4"`
Tags string `json:"tags" gorm:"type:varchar"` Tags string `json:"tags" gorm:"type:varchar"`
ThumbnailName *string `json:"thumbnail_name" gorm:"type:varchar"` ThumbnailName *string `json:"thumbnail_name" gorm:"type:varchar"`
ThumbnailPath *string `json:"thumbnail_path" gorm:"type:varchar"` ThumbnailPath *string `json:"thumbnail_path" gorm:"type:varchar"`
PageUrl *string `json:"page_url" gorm:"type:varchar"` PageUrl *string `json:"page_url" gorm:"type:varchar"`
CreatedById *uint `json:"created_by_id" gorm:"type:int4"` CreatedById *uint `json:"created_by_id" gorm:"type:int4"`
AiArticleId *int `json:"ai_article_id" gorm:"type:int4"` AiArticleId *int `json:"ai_article_id" gorm:"type:int4"`
CommentCount *int `json:"comment_count" gorm:"type:int4;default:0"` CommentCount *int `json:"comment_count" gorm:"type:int4;default:0"`
ShareCount *int `json:"share_count" gorm:"type:int4;default:0"` ShareCount *int `json:"share_count" gorm:"type:int4;default:0"`
ViewCount *int `json:"view_count" gorm:"type:int4;default:0"` ViewCount *int `json:"view_count" gorm:"type:int4;default:0"`
StatusId *int `json:"status_id" gorm:"type:int4"` StatusId *int `json:"status_id" gorm:"type:int4"`
OldId *uint `json:"old_id" gorm:"type:int4"` OldId *uint `json:"old_id" gorm:"type:int4"`
IsPublish *bool `json:"is_publish" gorm:"type:bool;default:false"` NeedApprovalFrom *int `json:"need_approval_from" gorm:"type:int4"`
PublishedAt *time.Time `json:"published_at" gorm:"type:timestamp"` HasApprovedBy *string `json:"has_approved_by" gorm:"type:varchar"`
IsDraft *bool `json:"is_draft" gorm:"type:bool;default:false"` IsPublish *bool `json:"is_publish" gorm:"type:bool;default:false"`
DraftedAt *time.Time `json:"drafted_at" gorm:"type:timestamp"` PublishedAt *time.Time `json:"published_at" gorm:"type:timestamp"`
IsActive *bool `json:"is_active" gorm:"type:bool;default:true"` IsDraft *bool `json:"is_draft" gorm:"type:bool;default:false"`
CreatedAt time.Time `json:"created_at" gorm:"default:now()"` DraftedAt *time.Time `json:"drafted_at" gorm:"type:timestamp"`
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` IsActive *bool `json:"is_active" gorm:"type:bool;default:true"`
CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`
} }

View File

@ -87,6 +87,7 @@ func Models() []interface{} {
entity.ActivityLogTypes{}, entity.ActivityLogTypes{},
entity.Articles{}, entity.Articles{},
entity.ArticleCategories{}, entity.ArticleCategories{},
entity.ArticleApprovals{},
article_category_details.ArticleCategoryDetails{}, article_category_details.ArticleCategoryDetails{},
entity.ArticleFiles{}, entity.ArticleFiles{},
entity.ArticleComments{}, entity.ArticleComments{},

View File

@ -127,7 +127,7 @@ func (_i *articlesRepository) Create(articles *entity.Articles) (articleReturn *
func (_i *articlesRepository) Update(id uint, articles *entity.Articles) (err error) { func (_i *articlesRepository) Update(id uint, articles *entity.Articles) (err error) {
return _i.DB.DB.Model(&entity.Articles{}). return _i.DB.DB.Model(&entity.Articles{}).
Where(&entity.Articles{ID: id}). Where(&entity.Articles{ID: id}).
Updates(articles).Error Save(articles).Error
} }
func (_i *articlesRepository) Delete(id uint) error { func (_i *articlesRepository) Delete(id uint) error {

View File

@ -8,6 +8,7 @@ import (
"github.com/minio/minio-go/v7" "github.com/minio/minio-go/v7"
"github.com/rs/zerolog" "github.com/rs/zerolog"
"go-humas-be/app/database/entity" "go-humas-be/app/database/entity"
articleApprovalsRepository "go-humas-be/app/module/article_approvals/repository"
articleCategoriesRepository "go-humas-be/app/module/article_categories/repository" articleCategoriesRepository "go-humas-be/app/module/article_categories/repository"
articleCategoryDetailsRepository "go-humas-be/app/module/article_category_details/repository" articleCategoryDetailsRepository "go-humas-be/app/module/article_category_details/repository"
articleCategoryDetailsReq "go-humas-be/app/module/article_category_details/request" articleCategoryDetailsReq "go-humas-be/app/module/article_category_details/request"
@ -36,6 +37,7 @@ type articlesService struct {
Repo repository.ArticlesRepository Repo repository.ArticlesRepository
ArticleCategoriesRepo articleCategoriesRepository.ArticleCategoriesRepository ArticleCategoriesRepo articleCategoriesRepository.ArticleCategoriesRepository
ArticleFilesRepo articleFilesRepository.ArticleFilesRepository ArticleFilesRepo articleFilesRepository.ArticleFilesRepository
ArticleApprovalsRepo articleApprovalsRepository.ArticleApprovalsRepository
ArticleCategoryDetailsRepo articleCategoryDetailsRepository.ArticleCategoryDetailsRepository ArticleCategoryDetailsRepo articleCategoryDetailsRepository.ArticleCategoryDetailsRepository
Log zerolog.Logger Log zerolog.Logger
Cfg *config.Config Cfg *config.Config
@ -52,6 +54,7 @@ type ArticlesService interface {
Update(id uint, req request.ArticlesUpdateRequest) (err error) Update(id uint, req request.ArticlesUpdateRequest) (err error)
Delete(id uint) error Delete(id uint) error
UpdateActivityCount(id uint, activityTypeId int) (err error) UpdateActivityCount(id uint, activityTypeId int) (err error)
UpdateApproval(id uint, statusId int, userLevelId int, userLevelNumber int, userParentLevelId int) (err error)
Viewer(c *fiber.Ctx) error Viewer(c *fiber.Ctx) error
SummaryStats(authToken string) (summaryStats *response.ArticleSummaryStats, err error) SummaryStats(authToken string) (summaryStats *response.ArticleSummaryStats, err error)
ArticlePerUserLevelStats(authToken string, startDate *string, endDate *string) (articlePerUserLevelStats []*response.ArticlePerUserLevelStats, err error) ArticlePerUserLevelStats(authToken string, startDate *string, endDate *string) (articlePerUserLevelStats []*response.ArticlePerUserLevelStats, err error)
@ -64,6 +67,7 @@ func NewArticlesService(
articleCategoriesRepo articleCategoriesRepository.ArticleCategoriesRepository, articleCategoriesRepo articleCategoriesRepository.ArticleCategoriesRepository,
articleCategoryDetailsRepo articleCategoryDetailsRepository.ArticleCategoryDetailsRepository, articleCategoryDetailsRepo articleCategoryDetailsRepository.ArticleCategoryDetailsRepository,
articleFilesRepo articleFilesRepository.ArticleFilesRepository, articleFilesRepo articleFilesRepository.ArticleFilesRepository,
articleApprovalsRepo articleApprovalsRepository.ArticleApprovalsRepository,
log zerolog.Logger, log zerolog.Logger,
cfg *config.Config, cfg *config.Config,
usersRepo usersRepository.UsersRepository, usersRepo usersRepository.UsersRepository,
@ -75,6 +79,7 @@ func NewArticlesService(
ArticleCategoriesRepo: articleCategoriesRepo, ArticleCategoriesRepo: articleCategoriesRepo,
ArticleCategoryDetailsRepo: articleCategoryDetailsRepo, ArticleCategoryDetailsRepo: articleCategoryDetailsRepo,
ArticleFilesRepo: articleFilesRepo, ArticleFilesRepo: articleFilesRepo,
ArticleApprovalsRepo: articleApprovalsRepo,
Log: log, Log: log,
UsersRepo: usersRepo, UsersRepo: usersRepo,
MinioStorage: minioStorage, MinioStorage: minioStorage,
@ -126,15 +131,21 @@ func (_i *articlesService) Save(req request.ArticlesCreateRequest, authToken str
_i.Log.Info().Interface("data", req).Msg("") _i.Log.Info().Interface("data", req).Msg("")
newReq := req.ToEntity() newReq := req.ToEntity()
var userLevelNumber int
var userParentLevelId int
if req.CreatedById != nil { if req.CreatedById != nil {
createdBy, err := _i.UsersRepo.FindOne(*req.CreatedById) createdBy, err := _i.UsersRepo.FindOne(*req.CreatedById)
if err != nil { if err != nil {
return nil, fmt.Errorf("User not found") return nil, fmt.Errorf("User not found")
} }
newReq.CreatedById = &createdBy.ID newReq.CreatedById = &createdBy.ID
userLevelNumber = createdBy.UserLevel.LevelNumber
userParentLevelId = *createdBy.UserLevel.ParentLevelId
} else { } else {
createdBy := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken) createdBy := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
newReq.CreatedById = &createdBy.ID newReq.CreatedById = &createdBy.ID
userLevelNumber = createdBy.UserLevel.LevelNumber
userParentLevelId = *createdBy.UserLevel.ParentLevelId
} }
isDraft := true isDraft := true
@ -166,11 +177,30 @@ func (_i *articlesService) Save(req request.ArticlesCreateRequest, authToken str
newReq.CreatedAt = parsedTime newReq.CreatedAt = parsedTime
} }
// Approval
statusIdOne := 1
newReq.NeedApprovalFrom = &userParentLevelId
newReq.StatusId = &statusIdOne
saveArticleRes, err := _i.Repo.Create(newReq) saveArticleRes, err := _i.Repo.Create(newReq)
if err != nil { if err != nil {
return nil, err return nil, err
} }
// Approval
articleApproval := &entity.ArticleApprovals{
ArticleId: saveArticleRes.ID,
ApprovalBy: *newReq.CreatedById,
StatusId: statusIdOne,
Message: "Need Approval",
ApprovalAtLevel: userLevelNumber,
}
_, err = _i.ArticleApprovalsRepo.Create(articleApproval)
if err != nil {
return nil, err
}
var categoryIds []string var categoryIds []string
if req.CategoryIds != "" { if req.CategoryIds != "" {
categoryIds = strings.Split(req.CategoryIds, ",") categoryIds = strings.Split(req.CategoryIds, ",")
@ -452,6 +482,59 @@ func (_i *articlesService) ArticleMonthlyStats(authToken string, year *int) (art
return result, nil return result, nil
} }
func (_i *articlesService) UpdateApproval(id uint, statusId int, userLevelId int, userLevelNumber int, userParentLevelId int) (err error) {
result, err := _i.Repo.FindOne(id)
if err != nil {
return err
}
_i.Log.Info().Interface("statusId", statusId).Msg("")
statusIdOne := 1
statusIdTwo := 2
statusIdThree := 3
isPublish := true
isDraftFalse := false
if statusId == 2 {
if userLevelNumber == 2 || userLevelNumber == 3 {
result.NeedApprovalFrom = &userParentLevelId
result.StatusId = &statusIdOne
} else {
result.NeedApprovalFrom = nil
result.StatusId = &statusIdTwo
result.IsPublish = &isPublish
publishedAt := time.Now()
result.PublishedAt = &publishedAt
result.IsDraft = &isDraftFalse
result.DraftedAt = nil
}
userLevelIdStr := strconv.Itoa(userLevelId)
if result.HasApprovedBy == nil {
result.HasApprovedBy = &userLevelIdStr
} else {
hasApprovedBySlice := strings.Split(*result.HasApprovedBy, ",")
hasApprovedBySlice = append(hasApprovedBySlice, userLevelIdStr)
hasApprovedByJoin := strings.Join(hasApprovedBySlice, ",")
result.HasApprovedBy = &hasApprovedByJoin
}
} else if statusId == 3 {
result.StatusId = &statusIdThree
result.NeedApprovalFrom = nil
result.HasApprovedBy = nil
}
err = _i.Repo.Update(id, result)
if err != nil {
return err
}
return
}
func getFileExtension(filename string) string { func getFileExtension(filename string) string {
// split file name // split file name
parts := strings.Split(filename, ".") parts := strings.Split(filename, ".")

View File

@ -4,6 +4,7 @@ import (
swagger "github.com/arsmn/fiber-swagger/v2" swagger "github.com/arsmn/fiber-swagger/v2"
"github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2"
"go-humas-be/app/module/activity_logs" "go-humas-be/app/module/activity_logs"
"go-humas-be/app/module/article_approvals"
"go-humas-be/app/module/article_categories" "go-humas-be/app/module/article_categories"
"go-humas-be/app/module/article_category_details" "go-humas-be/app/module/article_category_details"
"go-humas-be/app/module/article_comments" "go-humas-be/app/module/article_comments"
@ -35,6 +36,7 @@ type Router struct {
ArticleCategoryDetailsRouter *article_category_details.ArticleCategoryDetailsRouter ArticleCategoryDetailsRouter *article_category_details.ArticleCategoryDetailsRouter
ArticleFilesRouter *article_files.ArticleFilesRouter ArticleFilesRouter *article_files.ArticleFilesRouter
ArticleCommentsRouter *article_comments.ArticleCommentsRouter ArticleCommentsRouter *article_comments.ArticleCommentsRouter
ArticleApprovalsRouter *article_approvals.ArticleApprovalsRouter
ArticlesRouter *articles.ArticlesRouter ArticlesRouter *articles.ArticlesRouter
ArticleNulisAIRouter *article_nulis_ai.ArticleNulisAIRouter ArticleNulisAIRouter *article_nulis_ai.ArticleNulisAIRouter
CitiesRouter *cities.CitiesRouter CitiesRouter *cities.CitiesRouter
@ -60,6 +62,7 @@ func NewRouter(
articleCategoryDetailsRouter *article_category_details.ArticleCategoryDetailsRouter, articleCategoryDetailsRouter *article_category_details.ArticleCategoryDetailsRouter,
articleFilesRouter *article_files.ArticleFilesRouter, articleFilesRouter *article_files.ArticleFilesRouter,
articleCommentsRouter *article_comments.ArticleCommentsRouter, articleCommentsRouter *article_comments.ArticleCommentsRouter,
articleApprovalsRouter *article_approvals.ArticleApprovalsRouter,
articlesRouter *articles.ArticlesRouter, articlesRouter *articles.ArticlesRouter,
articleNulisRouter *article_nulis_ai.ArticleNulisAIRouter, articleNulisRouter *article_nulis_ai.ArticleNulisAIRouter,
citiesRouter *cities.CitiesRouter, citiesRouter *cities.CitiesRouter,
@ -83,6 +86,7 @@ func NewRouter(
ArticleCategoryDetailsRouter: articleCategoryDetailsRouter, ArticleCategoryDetailsRouter: articleCategoryDetailsRouter,
ArticleFilesRouter: articleFilesRouter, ArticleFilesRouter: articleFilesRouter,
ArticleCommentsRouter: articleCommentsRouter, ArticleCommentsRouter: articleCommentsRouter,
ArticleApprovalsRouter: articleApprovalsRouter,
ArticlesRouter: articlesRouter, ArticlesRouter: articlesRouter,
ArticleNulisAIRouter: articleNulisRouter, ArticleNulisAIRouter: articleNulisRouter,
CitiesRouter: citiesRouter, CitiesRouter: citiesRouter,
@ -115,6 +119,7 @@ func (r *Router) Register() {
r.ArticleCategoriesRouter.RegisterArticleCategoriesRoutes() r.ArticleCategoriesRouter.RegisterArticleCategoriesRoutes()
r.ArticleCategoryDetailsRouter.RegisterArticleCategoryDetailsRoutes() r.ArticleCategoryDetailsRouter.RegisterArticleCategoryDetailsRoutes()
r.ArticleFilesRouter.RegisterArticleFilesRoutes() r.ArticleFilesRouter.RegisterArticleFilesRoutes()
r.ArticleApprovalsRouter.RegisterArticleApprovalsRoutes()
r.ArticlesRouter.RegisterArticlesRoutes() r.ArticlesRouter.RegisterArticlesRoutes()
r.ArticleCommentsRouter.RegisterArticleCommentsRoutes() r.ArticleCommentsRouter.RegisterArticleCommentsRoutes()
r.ArticleNulisAIRouter.RegisterArticleNulisAIRoutes() r.ArticleNulisAIRouter.RegisterArticleNulisAIRoutes()

View File

@ -325,6 +325,322 @@ const docTemplate = `{
} }
} }
}, },
"/article-approvals": {
"get": {
"security": [
{
"Bearer": []
}
],
"description": "API for getting all ArticleApprovals",
"tags": [
"ArticleApprovals"
],
"summary": "Get all ArticleApprovals",
"parameters": [
{
"type": "integer",
"name": "approvalAtLevel",
"in": "query"
},
{
"type": "integer",
"name": "approvalBy",
"in": "query"
},
{
"type": "integer",
"name": "articleId",
"in": "query"
},
{
"type": "string",
"name": "message",
"in": "query"
},
{
"type": "integer",
"name": "statusId",
"in": "query"
},
{
"type": "integer",
"name": "count",
"in": "query"
},
{
"type": "integer",
"name": "limit",
"in": "query"
},
{
"type": "integer",
"name": "nextPage",
"in": "query"
},
{
"type": "integer",
"name": "page",
"in": "query"
},
{
"type": "integer",
"name": "previousPage",
"in": "query"
},
{
"type": "string",
"name": "sort",
"in": "query"
},
{
"type": "string",
"name": "sortBy",
"in": "query"
},
{
"type": "integer",
"name": "totalPage",
"in": "query"
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/response.Response"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/response.BadRequestError"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/response.UnauthorizedError"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/response.InternalServerError"
}
}
}
},
"post": {
"security": [
{
"Bearer": []
}
],
"description": "API for create ArticleApprovals",
"tags": [
"ArticleApprovals"
],
"summary": "Create ArticleApprovals",
"parameters": [
{
"type": "string",
"default": "Bearer \u003cAdd access token here\u003e",
"description": "Insert your access token",
"name": "Authorization",
"in": "header",
"required": true
},
{
"description": "Required payload",
"name": "payload",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/request.ArticleApprovalsCreateRequest"
}
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/response.Response"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/response.BadRequestError"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/response.UnauthorizedError"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/response.InternalServerError"
}
}
}
}
},
"/article-approvals/{id}": {
"get": {
"security": [
{
"Bearer": []
}
],
"description": "API for getting one ArticleApprovals",
"tags": [
"ArticleApprovals"
],
"summary": "Get one ArticleApprovals",
"parameters": [
{
"type": "integer",
"description": "ArticleApprovals ID",
"name": "id",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/response.Response"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/response.BadRequestError"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/response.UnauthorizedError"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/response.InternalServerError"
}
}
}
},
"put": {
"security": [
{
"Bearer": []
}
],
"description": "API for update ArticleApprovals",
"tags": [
"ArticleApprovals"
],
"summary": "update ArticleApprovals",
"parameters": [
{
"description": "Required payload",
"name": "payload",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/request.ArticleApprovalsUpdateRequest"
}
},
{
"type": "integer",
"description": "ArticleApprovals ID",
"name": "id",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/response.Response"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/response.BadRequestError"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/response.UnauthorizedError"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/response.InternalServerError"
}
}
}
},
"delete": {
"security": [
{
"Bearer": []
}
],
"description": "API for delete ArticleApprovals",
"tags": [
"ArticleApprovals"
],
"summary": "delete ArticleApprovals",
"parameters": [
{
"type": "integer",
"description": "ArticleApprovals ID",
"name": "id",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/response.Response"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/response.BadRequestError"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/response.UnauthorizedError"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/response.InternalServerError"
}
}
}
}
},
"/article-categories": { "/article-categories": {
"get": { "get": {
"security": [ "security": [
@ -7572,6 +7888,48 @@ const docTemplate = `{
} }
} }
}, },
"request.ArticleApprovalsCreateRequest": {
"type": "object",
"required": [
"articleId",
"message",
"statusId"
],
"properties": {
"articleId": {
"type": "integer"
},
"message": {
"type": "string"
},
"statusId": {
"type": "integer"
}
}
},
"request.ArticleApprovalsUpdateRequest": {
"type": "object",
"required": [
"articleId",
"id",
"message",
"statusId"
],
"properties": {
"articleId": {
"type": "integer"
},
"id": {
"type": "integer"
},
"message": {
"type": "string"
},
"statusId": {
"type": "integer"
}
}
},
"request.ArticleCategoriesCreateRequest": { "request.ArticleCategoriesCreateRequest": {
"type": "object", "type": "object",
"required": [ "required": [

View File

@ -314,6 +314,322 @@
} }
} }
}, },
"/article-approvals": {
"get": {
"security": [
{
"Bearer": []
}
],
"description": "API for getting all ArticleApprovals",
"tags": [
"ArticleApprovals"
],
"summary": "Get all ArticleApprovals",
"parameters": [
{
"type": "integer",
"name": "approvalAtLevel",
"in": "query"
},
{
"type": "integer",
"name": "approvalBy",
"in": "query"
},
{
"type": "integer",
"name": "articleId",
"in": "query"
},
{
"type": "string",
"name": "message",
"in": "query"
},
{
"type": "integer",
"name": "statusId",
"in": "query"
},
{
"type": "integer",
"name": "count",
"in": "query"
},
{
"type": "integer",
"name": "limit",
"in": "query"
},
{
"type": "integer",
"name": "nextPage",
"in": "query"
},
{
"type": "integer",
"name": "page",
"in": "query"
},
{
"type": "integer",
"name": "previousPage",
"in": "query"
},
{
"type": "string",
"name": "sort",
"in": "query"
},
{
"type": "string",
"name": "sortBy",
"in": "query"
},
{
"type": "integer",
"name": "totalPage",
"in": "query"
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/response.Response"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/response.BadRequestError"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/response.UnauthorizedError"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/response.InternalServerError"
}
}
}
},
"post": {
"security": [
{
"Bearer": []
}
],
"description": "API for create ArticleApprovals",
"tags": [
"ArticleApprovals"
],
"summary": "Create ArticleApprovals",
"parameters": [
{
"type": "string",
"default": "Bearer \u003cAdd access token here\u003e",
"description": "Insert your access token",
"name": "Authorization",
"in": "header",
"required": true
},
{
"description": "Required payload",
"name": "payload",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/request.ArticleApprovalsCreateRequest"
}
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/response.Response"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/response.BadRequestError"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/response.UnauthorizedError"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/response.InternalServerError"
}
}
}
}
},
"/article-approvals/{id}": {
"get": {
"security": [
{
"Bearer": []
}
],
"description": "API for getting one ArticleApprovals",
"tags": [
"ArticleApprovals"
],
"summary": "Get one ArticleApprovals",
"parameters": [
{
"type": "integer",
"description": "ArticleApprovals ID",
"name": "id",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/response.Response"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/response.BadRequestError"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/response.UnauthorizedError"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/response.InternalServerError"
}
}
}
},
"put": {
"security": [
{
"Bearer": []
}
],
"description": "API for update ArticleApprovals",
"tags": [
"ArticleApprovals"
],
"summary": "update ArticleApprovals",
"parameters": [
{
"description": "Required payload",
"name": "payload",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/request.ArticleApprovalsUpdateRequest"
}
},
{
"type": "integer",
"description": "ArticleApprovals ID",
"name": "id",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/response.Response"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/response.BadRequestError"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/response.UnauthorizedError"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/response.InternalServerError"
}
}
}
},
"delete": {
"security": [
{
"Bearer": []
}
],
"description": "API for delete ArticleApprovals",
"tags": [
"ArticleApprovals"
],
"summary": "delete ArticleApprovals",
"parameters": [
{
"type": "integer",
"description": "ArticleApprovals ID",
"name": "id",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/response.Response"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/response.BadRequestError"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/response.UnauthorizedError"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/response.InternalServerError"
}
}
}
}
},
"/article-categories": { "/article-categories": {
"get": { "get": {
"security": [ "security": [
@ -7561,6 +7877,48 @@
} }
} }
}, },
"request.ArticleApprovalsCreateRequest": {
"type": "object",
"required": [
"articleId",
"message",
"statusId"
],
"properties": {
"articleId": {
"type": "integer"
},
"message": {
"type": "string"
},
"statusId": {
"type": "integer"
}
}
},
"request.ArticleApprovalsUpdateRequest": {
"type": "object",
"required": [
"articleId",
"id",
"message",
"statusId"
],
"properties": {
"articleId": {
"type": "integer"
},
"id": {
"type": "integer"
},
"message": {
"type": "string"
},
"statusId": {
"type": "integer"
}
}
},
"request.ArticleCategoriesCreateRequest": { "request.ArticleCategoriesCreateRequest": {
"type": "object", "type": "object",
"required": [ "required": [

View File

@ -49,6 +49,35 @@ definitions:
- id - id
- url - url
type: object type: object
request.ArticleApprovalsCreateRequest:
properties:
articleId:
type: integer
message:
type: string
statusId:
type: integer
required:
- articleId
- message
- statusId
type: object
request.ArticleApprovalsUpdateRequest:
properties:
articleId:
type: integer
id:
type: integer
message:
type: string
statusId:
type: integer
required:
- articleId
- id
- message
- statusId
type: object
request.ArticleCategoriesCreateRequest: request.ArticleCategoriesCreateRequest:
properties: properties:
description: description:
@ -989,6 +1018,205 @@ paths:
summary: update ActivityLogs summary: update ActivityLogs
tags: tags:
- ActivityLogs - ActivityLogs
/article-approvals:
get:
description: API for getting all ArticleApprovals
parameters:
- in: query
name: approvalAtLevel
type: integer
- in: query
name: approvalBy
type: integer
- in: query
name: articleId
type: integer
- in: query
name: message
type: string
- in: query
name: statusId
type: integer
- in: query
name: count
type: integer
- in: query
name: limit
type: integer
- in: query
name: nextPage
type: integer
- in: query
name: page
type: integer
- in: query
name: previousPage
type: integer
- in: query
name: sort
type: string
- in: query
name: sortBy
type: string
- in: query
name: totalPage
type: integer
responses:
"200":
description: OK
schema:
$ref: '#/definitions/response.Response'
"400":
description: Bad Request
schema:
$ref: '#/definitions/response.BadRequestError'
"401":
description: Unauthorized
schema:
$ref: '#/definitions/response.UnauthorizedError'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/response.InternalServerError'
security:
- Bearer: []
summary: Get all ArticleApprovals
tags:
- ArticleApprovals
post:
description: API for create ArticleApprovals
parameters:
- default: Bearer <Add access token here>
description: Insert your access token
in: header
name: Authorization
required: true
type: string
- description: Required payload
in: body
name: payload
required: true
schema:
$ref: '#/definitions/request.ArticleApprovalsCreateRequest'
responses:
"200":
description: OK
schema:
$ref: '#/definitions/response.Response'
"400":
description: Bad Request
schema:
$ref: '#/definitions/response.BadRequestError'
"401":
description: Unauthorized
schema:
$ref: '#/definitions/response.UnauthorizedError'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/response.InternalServerError'
security:
- Bearer: []
summary: Create ArticleApprovals
tags:
- ArticleApprovals
/article-approvals/{id}:
delete:
description: API for delete ArticleApprovals
parameters:
- description: ArticleApprovals ID
in: path
name: id
required: true
type: integer
responses:
"200":
description: OK
schema:
$ref: '#/definitions/response.Response'
"400":
description: Bad Request
schema:
$ref: '#/definitions/response.BadRequestError'
"401":
description: Unauthorized
schema:
$ref: '#/definitions/response.UnauthorizedError'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/response.InternalServerError'
security:
- Bearer: []
summary: delete ArticleApprovals
tags:
- ArticleApprovals
get:
description: API for getting one ArticleApprovals
parameters:
- description: ArticleApprovals ID
in: path
name: id
required: true
type: integer
responses:
"200":
description: OK
schema:
$ref: '#/definitions/response.Response'
"400":
description: Bad Request
schema:
$ref: '#/definitions/response.BadRequestError'
"401":
description: Unauthorized
schema:
$ref: '#/definitions/response.UnauthorizedError'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/response.InternalServerError'
security:
- Bearer: []
summary: Get one ArticleApprovals
tags:
- ArticleApprovals
put:
description: API for update ArticleApprovals
parameters:
- description: Required payload
in: body
name: payload
required: true
schema:
$ref: '#/definitions/request.ArticleApprovalsUpdateRequest'
- description: ArticleApprovals ID
in: path
name: id
required: true
type: integer
responses:
"200":
description: OK
schema:
$ref: '#/definitions/response.Response'
"400":
description: Bad Request
schema:
$ref: '#/definitions/response.BadRequestError'
"401":
description: Unauthorized
schema:
$ref: '#/definitions/response.UnauthorizedError'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/response.InternalServerError'
security:
- Bearer: []
summary: update ArticleApprovals
tags:
- ArticleApprovals
/article-categories: /article-categories:
get: get:
description: API for getting all ArticleCategories description: API for getting all ArticleCategories

View File

@ -5,6 +5,7 @@ import (
"go-humas-be/app/database" "go-humas-be/app/database"
"go-humas-be/app/middleware" "go-humas-be/app/middleware"
"go-humas-be/app/module/activity_logs" "go-humas-be/app/module/activity_logs"
"go-humas-be/app/module/article_approvals"
"go-humas-be/app/module/article_categories" "go-humas-be/app/module/article_categories"
"go-humas-be/app/module/article_category_details" "go-humas-be/app/module/article_category_details"
"go-humas-be/app/module/article_comments" "go-humas-be/app/module/article_comments"
@ -59,6 +60,7 @@ func main() {
article_categories.NewArticleCategoriesModule, article_categories.NewArticleCategoriesModule,
article_category_details.NewArticleCategoryDetailsModule, article_category_details.NewArticleCategoryDetailsModule,
article_files.NewArticleFilesModule, article_files.NewArticleFilesModule,
article_approvals.NewArticleApprovalsModule,
articles.NewArticlesModule, articles.NewArticlesModule,
article_comments.NewArticleCommentsModule, article_comments.NewArticleCommentsModule,
article_nulis_ai.NewArticleNulisAIModule, article_nulis_ai.NewArticleNulisAIModule,