feat: category routes

This commit is contained in:
ericprd 2025-03-01 21:20:51 +08:00
parent acd80480dd
commit bdf6dd131e
19 changed files with 368 additions and 52 deletions

View File

@ -0,0 +1,21 @@
package categoryrepository
import (
categorydomain "legalgo-BE-go/internal/domain/category"
"github.com/google/uuid"
)
func (a *accessor) Create(spec categorydomain.CategoryReq) error {
data := categorydomain.Category{
ID: uuid.NewString(),
Name: spec.Name,
Code: spec.Code,
}
if err := a.DB.Create(&data).Error; err != nil {
return err
}
return nil
}

View File

@ -0,0 +1,13 @@
package categoryrepository
import categorydomain "legalgo-BE-go/internal/domain/category"
func (a *accessor) GetAll() ([]categorydomain.Category, error) {
var categories []categorydomain.Category
if err := a.DB.Find(&categories).Error; err != nil {
return nil, err
}
return categories, nil
}

View File

@ -0,0 +1,21 @@
package categoryrepository
import (
"legalgo-BE-go/database"
categorydomain "legalgo-BE-go/internal/domain/category"
)
type accessor struct {
DB *database.DB
}
type Category interface {
Create(categorydomain.CategoryReq) error
GetAll() ([]categorydomain.Category, error)
}
func New(
db *database.DB,
) Category {
return &accessor{db}
}

View File

@ -1,6 +1,7 @@
package repository package repository
import ( import (
categoryrepository "legalgo-BE-go/internal/accessor/category"
redisaccessor "legalgo-BE-go/internal/accessor/redis" redisaccessor "legalgo-BE-go/internal/accessor/redis"
staffrepository "legalgo-BE-go/internal/accessor/staff" staffrepository "legalgo-BE-go/internal/accessor/staff"
subscriberepository "legalgo-BE-go/internal/accessor/subscribe" subscriberepository "legalgo-BE-go/internal/accessor/subscribe"
@ -18,4 +19,5 @@ var Module = fx.Module("repository", fx.Provide(
subscribeplanrepository.New, subscribeplanrepository.New,
subscriberepository.New, subscriberepository.New,
tagrepository.New, tagrepository.New,
categoryrepository.New,
)) ))

View File

@ -0,0 +1,67 @@
package categoryhttp
import (
categorydomain "legalgo-BE-go/internal/domain/category"
categorysvc "legalgo-BE-go/internal/services/category"
"legalgo-BE-go/internal/utilities/response"
"legalgo-BE-go/internal/utilities/utils"
"net/http"
"github.com/go-chi/chi/v5"
"github.com/go-playground/validator/v10"
)
func Create(
router chi.Router,
validate *validator.Validate,
categorySvc categorysvc.Category,
) {
router.Post("/category/create", func(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
var spec categorydomain.CategoryReq
if err := utils.UnmarshalBody(r, &spec); err != nil {
response.ResponseWithErrorCode(
ctx,
w,
err,
response.ErrBadRequest.Code,
response.ErrBadRequest.HttpCode,
err.Error(),
)
return
}
if err := validate.Struct(spec); err != nil {
response.ResponseWithErrorCode(
ctx,
w,
err,
response.ErrBadRequest.Code,
response.ErrBadRequest.HttpCode,
err.(validator.ValidationErrors).Error(),
)
return
}
if err := categorySvc.Create(spec); err != nil {
response.ResponseWithErrorCode(
ctx,
w,
err,
response.ErrCreateEntity.Code,
response.ErrCreateEntity.HttpCode,
err.Error(),
)
return
}
response.RespondJsonSuccess(ctx, w, struct {
Message string
}{
Message: "category created successfully",
})
})
}

View File

@ -0,0 +1,32 @@
package categoryhttp
import (
categorysvc "legalgo-BE-go/internal/services/category"
"legalgo-BE-go/internal/utilities/response"
"net/http"
"github.com/go-chi/chi/v5"
)
func GetAll(
router chi.Router,
categorySvc categorysvc.Category,
) {
router.Get("/category", func(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
subsPlan, err := categorySvc.GetAll()
if err != nil {
response.ResponseWithErrorCode(
ctx,
w,
err,
response.ErrBadRequest.Code,
response.ErrBadRequest.HttpCode,
err.Error(),
)
return
}
response.RespondJsonSuccess(ctx, w, subsPlan)
})
}

View File

@ -0,0 +1,8 @@
package categoryhttp
import "go.uber.org/fx"
var Module = fx.Module("categories", fx.Invoke(
Create,
GetAll,
))

View File

@ -2,6 +2,7 @@ package internalhttp
import ( import (
authhttp "legalgo-BE-go/internal/api/http/auth" authhttp "legalgo-BE-go/internal/api/http/auth"
categoryhttp "legalgo-BE-go/internal/api/http/category"
subscribeplanhttp "legalgo-BE-go/internal/api/http/subscribe_plan" subscribeplanhttp "legalgo-BE-go/internal/api/http/subscribe_plan"
taghttp "legalgo-BE-go/internal/api/http/tag" taghttp "legalgo-BE-go/internal/api/http/tag"
@ -21,6 +22,7 @@ var Module = fx.Module("router",
authhttp.Module, authhttp.Module,
subscribeplanhttp.Module, subscribeplanhttp.Module,
taghttp.Module, taghttp.Module,
categoryhttp.Module,
) )
func initRouter() chi.Router { func initRouter() chi.Router {

View File

@ -8,7 +8,7 @@ import (
"github.com/go-chi/chi/v5" "github.com/go-chi/chi/v5"
) )
func Get( func GetAll(
router chi.Router, router chi.Router,
tagSvc tagsvc.TagIntf, tagSvc tagsvc.TagIntf,
) { ) {

View File

@ -4,5 +4,5 @@ import "go.uber.org/fx"
var Module = fx.Module("tag", fx.Invoke( var Module = fx.Module("tag", fx.Invoke(
Create, Create,
Get, GetAll,
)) ))

View File

@ -0,0 +1,12 @@
package categorydomain
type Category struct {
ID string `json:"id"`
Name string `json:"name"`
Code string `json:"code"`
}
type CategoryReq struct {
Name string `json:"name" validate:"required"`
Code string `json:"code" validate:"required"`
}

View File

@ -0,0 +1,7 @@
package categorysvc
import categorydomain "legalgo-BE-go/internal/domain/category"
func (i *impl) Create(spec categorydomain.CategoryReq) error {
return i.categoryRepo.Create(spec)
}

View File

@ -0,0 +1,7 @@
package categorysvc
import categorydomain "legalgo-BE-go/internal/domain/category"
func (i *impl) GetAll() ([]categorydomain.Category, error) {
return i.categoryRepo.GetAll()
}

View File

@ -0,0 +1,23 @@
package categorysvc
import (
categoryrepository "legalgo-BE-go/internal/accessor/category"
categorydomain "legalgo-BE-go/internal/domain/category"
)
type impl struct {
categoryRepo categoryrepository.Category
}
type Category interface {
Create(categorydomain.CategoryReq) error
GetAll() ([]categorydomain.Category, error)
}
func New(
categoryRepo categoryrepository.Category,
) Category {
return &impl{
categoryRepo: categoryRepo,
}
}

View File

@ -2,6 +2,7 @@ package services
import ( import (
serviceauth "legalgo-BE-go/internal/services/auth" serviceauth "legalgo-BE-go/internal/services/auth"
categorysvc "legalgo-BE-go/internal/services/category"
subscribesvc "legalgo-BE-go/internal/services/subscribe" subscribesvc "legalgo-BE-go/internal/services/subscribe"
subscribeplansvc "legalgo-BE-go/internal/services/subscribe_plan" subscribeplansvc "legalgo-BE-go/internal/services/subscribe_plan"
tagsvc "legalgo-BE-go/internal/services/tag" tagsvc "legalgo-BE-go/internal/services/tag"
@ -15,5 +16,6 @@ var Module = fx.Module("services",
subscribeplansvc.New, subscribeplansvc.New,
subscribesvc.New, subscribesvc.New,
tagsvc.New, tagsvc.New,
categorysvc.New,
), ),
) )

View File

@ -3,5 +3,5 @@ package tagsvc
import tagdomain "legalgo-BE-go/internal/domain/tag" import tagdomain "legalgo-BE-go/internal/domain/tag"
func (i *impl) Create(spec tagdomain.TagReq) error { func (i *impl) Create(spec tagdomain.TagReq) error {
return i.TagRepo.Create(spec) return i.tagRepo.Create(spec)
} }

View File

@ -3,5 +3,5 @@ package tagsvc
import tagdomain "legalgo-BE-go/internal/domain/tag" import tagdomain "legalgo-BE-go/internal/domain/tag"
func (i *impl) GetAll() ([]tagdomain.Tag, error) { func (i *impl) GetAll() ([]tagdomain.Tag, error) {
return i.TagRepo.GetAll() return i.tagRepo.GetAll()
} }

View File

@ -6,7 +6,7 @@ import (
) )
type impl struct { type impl struct {
TagRepo tagrepository.TagAccessor tagRepo tagrepository.TagAccessor
} }
type TagIntf interface { type TagIntf interface {
@ -17,7 +17,5 @@ type TagIntf interface {
func New( func New(
tagRepo tagrepository.TagAccessor, tagRepo tagrepository.TagAccessor,
) TagIntf { ) TagIntf {
return &impl{ return &impl{tagRepo}
TagRepo: tagRepo,
}
} }

View File

@ -5,6 +5,50 @@ info:
description: API for handling staff and user login, registration, and subscription plan creation. description: API for handling staff and user login, registration, and subscription plan creation.
paths: paths:
/staff/profile:
get:
summary: "get staff profile"
tags:
- Staff
parameters:
- name: "id"
in: query
description: "staff id"
required: true
schema:
type: string
responses:
"200":
description: Success get profile
content:
application/json:
schema:
type: object
properties:
data:
type: object
properties:
id:
type: string
email:
type: string
username:
type: string
"400":
description: Bad request
content:
application/json:
schema:
type: object
properties:
error:
type: object
properties:
code:
type: string
message:
type: string
/staff/login: /staff/login:
post: post:
summary: Login for staff summary: Login for staff
@ -120,50 +164,6 @@ paths:
message: message:
type: string type: string
/staff/profile:
get:
summary: "get staff profile"
tags:
- Staff
parameters:
- name: "id"
in: query
description: "staff id"
required: true
schema:
type: string
responses:
"200":
description: Success get profile
content:
application/json:
schema:
type: object
properties:
data:
type: object
properties:
id:
type: string
email:
type: string
username:
type: string
"400":
description: Bad request
content:
application/json:
schema:
type: object
properties:
error:
type: object
properties:
code:
type: string
message:
type: string
/user/profile: /user/profile:
get: get:
summary: "get staff profile" summary: "get staff profile"
@ -530,3 +530,104 @@ paths:
type: string type: string
message: message:
type: string type: string
/category:
get:
summary: Get all categories
tags:
- Category
responses:
"200":
description: Successfully retrieved all categories
content:
application/json:
schema:
type: object
properties:
data:
type: array
items:
type: object
properties:
id:
type: string
code:
type: string
name:
type: string
"400":
description: Bad request
content:
application/json:
schema:
type: object
properties:
error:
type: object
properties:
code:
type: string
message:
type: string
/category/create:
post:
summary: Create a new category
tags:
- Tags
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name:
type: string
code:
type: string
required:
- code
- name
responses:
"201":
description: Category created
content:
application/json:
schema:
type: object
properties:
data:
type: object
properties:
message:
type: string
example: "category created successfully."
"400":
description: Bad request
content:
application/json:
schema:
type: object
properties:
error:
type: object
properties:
code:
type: string
message:
type: string
"409":
description: Conflict (category code already exists)
content:
application/json:
schema:
type: object
properties:
error:
type: object
properties:
code:
type: string
message:
type: string