fix: update user plan and rearrange structur project

This commit is contained in:
ericprd 2025-03-08 22:46:05 +08:00
parent a47b7b7d3d
commit 13c976dcbf
54 changed files with 508 additions and 263 deletions

View File

@ -7,7 +7,7 @@ import (
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"
subscribeplanrepository "legalgo-BE-go/internal/accessor/subscribeplan" subscribeplanrepository "legalgo-BE-go/internal/accessor/subscribe_plan"
tagrepository "legalgo-BE-go/internal/accessor/tag" tagrepository "legalgo-BE-go/internal/accessor/tag"
userrepository "legalgo-BE-go/internal/accessor/user" userrepository "legalgo-BE-go/internal/accessor/user"

View File

@ -6,13 +6,13 @@ import (
"github.com/google/uuid" "github.com/google/uuid"
) )
func (s *SubsAccs) Create(subsPlanId string) (string, error) { func (s *accessor) Create(subsPlanId string) (string, error) {
spec := &subscribedomain.Subscribe{ spec := &subscribedomain.Subscribe{
ID: uuid.NewString(), ID: uuid.NewString(),
SubscribePlanID: subsPlanId, SubscribePlanID: subsPlanId,
} }
if err := s.DB.Create(&spec).Error; err != nil { if err := s.db.Create(&spec).Error; err != nil {
return "", err return "", err
} }

View File

@ -3,15 +3,15 @@ package subscriberepository
import ( import (
"errors" "errors"
"fmt" "fmt"
"legalgo-BE-go/database" subscribedomain "legalgo-BE-go/internal/domain/subscribe"
"gorm.io/gorm" "gorm.io/gorm"
) )
func (s *SubsAccs) GetByID(id string) (database.Subscribe, error) { func (s *accessor) GetByID(id string) (subscribedomain.Subscribe, error) {
var subscribe database.Subscribe var subscribe subscribedomain.Subscribe
if err := s.DB.First(&subscribe, "id = ?", id).Error; err != nil { if err := s.db.First(&subscribe, "id = ?", id).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) { if errors.Is(err, gorm.ErrRecordNotFound) {
return subscribe, fmt.Errorf("subscribe data not found: %v", err) return subscribe, fmt.Errorf("subscribe data not found: %v", err)
} }

View File

@ -1,17 +1,20 @@
package subscriberepository package subscriberepository
import "legalgo-BE-go/database" import (
"legalgo-BE-go/database"
subscribedomain "legalgo-BE-go/internal/domain/subscribe"
)
type SubsAccs struct { type accessor struct {
DB *database.DB db *database.DB
} }
type SubsIntf interface { type Subscribe interface {
Create(string) (string, error) Create(string) (string, error)
GetByID(string) (database.Subscribe, error) GetByID(string) (subscribedomain.Subscribe, error)
UpdateSubscribeStatus(database.Subscribe) error Update(subscribedomain.Subscribe) error
} }
func New(db *database.DB) SubsIntf { func New(db *database.DB) Subscribe {
return &SubsAccs{db} return &accessor{db}
} }

View File

@ -0,0 +1,19 @@
package subscriberepository
import (
"fmt"
subscribedomain "legalgo-BE-go/internal/domain/subscribe"
"gorm.io/gorm/clause"
)
func (a *accessor) Update(spec subscribedomain.Subscribe) error {
if err := a.db.Clauses(clause.OnConflict{
Columns: []clause.Column{{Name: "id"}},
DoUpdates: clause.AssignmentColumns([]string{"status", "subscribe_plan_id", "start_date"}),
}).Create(&spec).Error; err != nil {
return fmt.Errorf("failed to update status: %v", err)
}
return nil
}

View File

@ -1,19 +0,0 @@
package subscriberepository
import (
"fmt"
"legalgo-BE-go/database"
"gorm.io/gorm/clause"
)
func (a *SubsAccs) UpdateSubscribeStatus(spec database.Subscribe) error {
if err := a.DB.Clauses(clause.OnConflict{
Columns: []clause.Column{{Name: "id"}},
DoUpdates: clause.AssignmentColumns([]string{"status"}),
}).Create(&spec).Error; err != nil {
return fmt.Errorf("failed to update status: %v", err)
}
return nil
}

View File

@ -0,0 +1,13 @@
package subscribeplanrepository
import (
subscribeplandomain "legalgo-BE-go/internal/domain/subscribe_plan"
)
func (s *accessor) Create(spec subscribeplandomain.SubscribePlan) error {
if err := s.db.Create(&spec).Error; err != nil {
return err
}
return nil
}

View File

@ -0,0 +1,30 @@
package subscribeplanrepository
import (
"fmt"
"legalgo-BE-go/database"
subscribedomain "legalgo-BE-go/internal/domain/subscribe"
subscribeplandomain "legalgo-BE-go/internal/domain/subscribe_plan"
)
func (a *accessor) Delete(id string) error {
var subsPlan database.SubscribePlan
var basicPlan subscribeplandomain.SubscribePlan
if err := a.db.First(&basicPlan, "code = ?", "basic").Error; err != nil {
return fmt.Errorf("failed to find basic plan: %v", err)
}
if err := a.db.
Model(&subscribedomain.Subscribe{}).
Where("subscribe_plan_id = ?", id).
Update("subscribe_plan_id", basicPlan.ID); err != nil {
return fmt.Errorf("failed to change subscribe plan: %v", err)
}
if err := a.db.Where("id = ?", id).Delete(&subsPlan).Error; err != nil {
return fmt.Errorf("failed to delete subscribe plan %s : %v", id, err)
}
return nil
}

View File

@ -4,10 +4,10 @@ import (
subscribeplandomain "legalgo-BE-go/internal/domain/subscribe_plan" subscribeplandomain "legalgo-BE-go/internal/domain/subscribe_plan"
) )
func (s *SubsPlan) GetAll() ([]subscribeplandomain.SubscribePlan, error) { func (s *accessor) GetAll() ([]subscribeplandomain.SubscribePlan, error) {
var subscribePlans []subscribeplandomain.SubscribePlan var subscribePlans []subscribeplandomain.SubscribePlan
if err := s.DB.Find(&subscribePlans).Error; err != nil { if err := s.db.Find(&subscribePlans).Error; err != nil {
return nil, err return nil, err
} }

View File

@ -0,0 +1,21 @@
package subscribeplanrepository
import (
"errors"
subscribeplandomain "legalgo-BE-go/internal/domain/subscribe_plan"
"gorm.io/gorm"
)
func (s *accessor) GetByID(id string) (*subscribeplandomain.SubscribePlan, error) {
var subscribePlan *subscribeplandomain.SubscribePlan
if err := s.db.First(&subscribePlan, "id = ? ", id).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return subscribePlan, errors.New("subscribe plan not found")
}
return subscribePlan, err
}
return subscribePlan, nil
}

View File

@ -0,0 +1,22 @@
package subscribeplanrepository
import (
"legalgo-BE-go/database"
subscribeplandomain "legalgo-BE-go/internal/domain/subscribe_plan"
"github.com/google/uuid"
)
func (s *accessor) GetDefault() (*subscribeplandomain.SubscribePlan, error) {
var subscribePlan *subscribeplandomain.SubscribePlan
if err := s.db.First(&subscribePlan, "code = ?", "basic").Error; err != nil {
s.db.Create(&database.SubscribePlan{
ID: uuid.NewString(),
Code: "basic",
Name: "Basic",
})
}
return subscribePlan, nil
}

View File

@ -0,0 +1,25 @@
package subscribeplanrepository
import (
"legalgo-BE-go/database"
subscribeplandomain "legalgo-BE-go/internal/domain/subscribe_plan"
)
type accessor struct {
db *database.DB
}
type SubscribePlan interface {
Create(subscribeplandomain.SubscribePlan) error
GetAll() ([]subscribeplandomain.SubscribePlan, error)
GetByID(string) (*subscribeplandomain.SubscribePlan, error)
GetDefault() (*subscribeplandomain.SubscribePlan, error)
Update(subscribeplandomain.SubscribePlan) error
Delete(string) error
}
func New(
db *database.DB,
) SubscribePlan {
return &accessor{db}
}

View File

@ -0,0 +1,23 @@
package subscribeplanrepository
import (
"fmt"
subscribeplandomain "legalgo-BE-go/internal/domain/subscribe_plan"
"gorm.io/gorm/clause"
)
func (a *accessor) Update(spec subscribeplandomain.SubscribePlan) error {
if err := a.db.Clauses(clause.OnConflict{
Columns: []clause.Column{{Name: "id"}},
DoUpdates: clause.AssignmentColumns([]string{
"name",
"code",
"updated_at",
}),
}).Select("name", "code", "updated_at").Save(&spec).Error; err != nil {
return fmt.Errorf("failed to update tag: %v", err)
}
return nil
}

View File

@ -1,21 +0,0 @@
package subscribeplanrepository
import (
subscribeplandomain "legalgo-BE-go/internal/domain/subscribe_plan"
"github.com/google/uuid"
)
func (s *SubsPlan) Create(spec subscribeplandomain.SubscribePlanReq) error {
data := &subscribeplandomain.SubscribePlan{
ID: uuid.NewString(),
Code: spec.Code,
Name: spec.Name,
}
if err := s.DB.Create(&data).Error; err != nil {
return err
}
return nil
}

View File

@ -1,21 +0,0 @@
package subscribeplanrepository
import (
"errors"
"legalgo-BE-go/database"
"gorm.io/gorm"
)
func (s *SubsPlan) GetByID(id string) (*database.SubscribePlan, error) {
var subscribePlan *database.SubscribePlan
if err := s.DB.First(&subscribePlan, "id = ? ", id).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return subscribePlan, errors.New("subscribe plan not found")
}
return subscribePlan, err
}
return subscribePlan, nil
}

View File

@ -1,21 +0,0 @@
package subscribeplanrepository
import (
"legalgo-BE-go/database"
"github.com/google/uuid"
)
func (s *SubsPlan) GetDefault() (*database.SubscribePlan, error) {
var subscribePlan *database.SubscribePlan
if err := s.DB.First(&subscribePlan, "code = ?", "basic").Error; err != nil {
s.DB.Create(&database.SubscribePlan{
ID: uuid.NewString(),
Code: "basic",
Name: "Basic",
})
}
return subscribePlan, nil
}

View File

@ -1,23 +0,0 @@
package subscribeplanrepository
import (
"legalgo-BE-go/database"
subscribeplandomain "legalgo-BE-go/internal/domain/subscribe_plan"
)
type SubsPlan struct {
DB *database.DB
}
type SubsPlanIntf interface {
Create(subscribeplandomain.SubscribePlanReq) error
GetAll() ([]subscribeplandomain.SubscribePlan, error)
GetByID(string) (*database.SubscribePlan, error)
GetDefault() (*database.SubscribePlan, error)
}
func New(
db *database.DB,
) SubsPlanIntf {
return &SubsPlan{db}
}

View File

@ -5,6 +5,7 @@ import (
newshttp "legalgo-BE-go/internal/api/http/news" newshttp "legalgo-BE-go/internal/api/http/news"
osshttp "legalgo-BE-go/internal/api/http/oss" osshttp "legalgo-BE-go/internal/api/http/oss"
staffhttp "legalgo-BE-go/internal/api/http/staffhttp" staffhttp "legalgo-BE-go/internal/api/http/staffhttp"
subscribehttp "legalgo-BE-go/internal/api/http/subscribe"
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"
userhttp "legalgo-BE-go/internal/api/http/user" userhttp "legalgo-BE-go/internal/api/http/user"
@ -29,6 +30,7 @@ var Module = fx.Module("router",
newshttp.Module, newshttp.Module,
osshttp.Module, osshttp.Module,
userhttp.Module, userhttp.Module,
subscribehttp.Module,
) )
func initRouter() chi.Router { func initRouter() chi.Router {

View File

@ -2,4 +2,6 @@ package subscribehttp
import "go.uber.org/fx" import "go.uber.org/fx"
var Module = fx.Module("subscribe", fx.Invoke()) var Module = fx.Module("subscribe", fx.Invoke(
Update,
))

View File

@ -1,9 +1,9 @@
package subscribehttp package subscribehttp
import ( import (
userrepository "legalgo-BE-go/internal/accessor/user"
authmiddleware "legalgo-BE-go/internal/api/http/middleware/auth" authmiddleware "legalgo-BE-go/internal/api/http/middleware/auth"
userdomain "legalgo-BE-go/internal/domain/user" userdomain "legalgo-BE-go/internal/domain/user"
authsvc "legalgo-BE-go/internal/services/auth"
subscribesvc "legalgo-BE-go/internal/services/subscribe" subscribesvc "legalgo-BE-go/internal/services/subscribe"
"legalgo-BE-go/internal/utilities/response" "legalgo-BE-go/internal/utilities/response"
"legalgo-BE-go/internal/utilities/utils" "legalgo-BE-go/internal/utilities/utils"
@ -14,7 +14,7 @@ import (
func Update( func Update(
router chi.Router, router chi.Router,
authSvc authsvc.Auth, userRepo userrepository.User,
subSvc subscribesvc.Subscribe, subSvc subscribesvc.Subscribe,
) { ) {
router. router.
@ -60,9 +60,11 @@ func Update(
return return
} }
user, err := authSvc.GetUserProfile(detail.Email) user, err := userRepo.GetUserProfile(detail.Email)
if err := subSvc.Update(user.ID, body); err != nil { body.ID = user.Subscribe.ID
if err := subSvc.Update(body); err != nil {
response.ResponseWithErrorCode( response.ResponseWithErrorCode(
ctx, ctx,
w, w,
@ -73,5 +75,11 @@ func Update(
) )
return return
} }
response.RespondJsonSuccess(ctx, w, struct {
Message string
}{
Message: "update user plan success",
})
}) })
} }

View File

@ -49,7 +49,7 @@ func CreateSubscribePlan(
return return
} }
if err := subsSvc.CreatePlan(spec); err != nil { if err := subsSvc.Create(spec); err != nil {
response.ResponseWithErrorCode( response.ResponseWithErrorCode(
ctx, ctx,
w, w,

View File

@ -0,0 +1,53 @@
package subscribeplanhttp
import (
"fmt"
authmiddleware "legalgo-BE-go/internal/api/http/middleware/auth"
subscribeplansvc "legalgo-BE-go/internal/services/subscribe_plan"
"legalgo-BE-go/internal/utilities/response"
"net/http"
"github.com/go-chi/chi/v5"
)
func Delete(
router chi.Router,
subscribePlanSvc subscribeplansvc.SubscribePlan,
) {
router.
With(authmiddleware.Authorize()).
Delete("/subscribe-plan/{subsplan_id}/delete", func(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
subsPlanID := chi.URLParam(r, "subsplan_id")
if subsPlanID == "" {
response.RespondJsonErrorWithCode(
ctx,
w,
fmt.Errorf("subscribe plan id is not provided"),
response.ErrBadRequest.Code,
response.ErrBadRequest.HttpCode,
"subscribe plan id is not provided",
)
return
}
if err := subscribePlanSvc.Delete(subsPlanID); err != nil {
response.RespondJsonErrorWithCode(
ctx,
w,
err,
response.ErrBadRequest.Code,
response.ErrBadRequest.HttpCode,
err.Error(),
)
return
}
response.RespondJsonSuccess(ctx, w, struct {
Message string
}{
Message: "subscribe plan has been deleted",
})
})
}

View File

@ -6,5 +6,7 @@ var Module = fx.Module("subscribe-plan",
fx.Invoke( fx.Invoke(
CreateSubscribePlan, CreateSubscribePlan,
GetAllPlan, GetAllPlan,
Update,
Delete,
), ),
) )

View File

@ -0,0 +1,82 @@
package subscribeplanhttp
import (
"fmt"
authmiddleware "legalgo-BE-go/internal/api/http/middleware/auth"
subscribeplandomain "legalgo-BE-go/internal/domain/subscribe_plan"
subscribeplansvc "legalgo-BE-go/internal/services/subscribe_plan"
"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 Update(
router chi.Router,
validate *validator.Validate,
subsPlanSvc subscribeplansvc.SubscribePlan,
) {
router.
With(authmiddleware.Authorize()).
Put("/subscribe-plan/{subsplan_id}/update", func(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
tagID := chi.URLParam(r, "subsplan_id")
if tagID == "" {
response.RespondJsonErrorWithCode(
ctx,
w,
fmt.Errorf("subscribe plan id is not provided"),
response.ErrBadRequest.Code,
response.ErrBadRequest.HttpCode,
"subscribe plan id is not provided",
)
return
}
var spec subscribeplandomain.SubscribePlanUpdate
if err := utils.UnmarshalBody(r, &spec); err != nil {
response.RespondJsonErrorWithCode(
ctx,
w,
err,
response.ErrBadRequest.Code,
response.ErrBadRequest.HttpCode,
"failed to unmarshal body",
)
return
}
if err := validate.Struct(spec); err != nil {
response.RespondJsonErrorWithCode(
ctx,
w,
err,
response.ErrBadRequest.Code,
response.ErrBadRequest.HttpCode,
err.(validator.ValidationErrors).Error(),
)
return
}
if err := subsPlanSvc.Update(tagID, spec); err != nil {
response.RespondJsonErrorWithCode(
ctx,
w,
err,
response.ErrBadRequest.Code,
response.ErrBadRequest.HttpCode,
err.Error(),
)
return
}
response.RespondJsonSuccess(ctx, w, struct {
Message string
}{
Message: "update subscribe plan success",
})
})
}

View File

@ -16,23 +16,23 @@ func Delete(
) { ) {
router. router.
With(authmiddleware.Authorize()). With(authmiddleware.Authorize()).
Delete("/tag/{category_id}/delete", func(w http.ResponseWriter, r *http.Request) { Delete("/tag/{tag_id}/delete", func(w http.ResponseWriter, r *http.Request) {
ctx := r.Context() ctx := r.Context()
categoryID := chi.URLParam(r, "category_id") tagID := chi.URLParam(r, "tag_id")
if categoryID == "" { if tagID == "" {
response.RespondJsonErrorWithCode( response.RespondJsonErrorWithCode(
ctx, ctx,
w, w,
fmt.Errorf("category id is not provided"), fmt.Errorf("tag id is not provided"),
response.ErrBadRequest.Code, response.ErrBadRequest.Code,
response.ErrBadRequest.HttpCode, response.ErrBadRequest.HttpCode,
"category id is not provided", "tag id is not provided",
) )
return return
} }
if err := tagSvc.Delete(categoryID); err != nil { if err := tagSvc.Delete(tagID); err != nil {
response.RespondJsonErrorWithCode( response.RespondJsonErrorWithCode(
ctx, ctx,
w, w,

View File

@ -14,8 +14,7 @@ func GetAll(
) { ) {
router.Get("/tag", func(w http.ResponseWriter, r *http.Request) { router.Get("/tag", func(w http.ResponseWriter, r *http.Request) {
ctx := r.Context() ctx := r.Context()
tags, err := tagSvc.GetAllModel() tags, err := tagSvc.GetAll()
// tags, err := tagSvc.GetAll()
if err != nil { if err != nil {
response.ResponseWithErrorCode( response.ResponseWithErrorCode(
ctx, ctx,

View File

@ -3,7 +3,7 @@ package userhttp
import ( import (
responsedomain "legalgo-BE-go/internal/domain/reponse" responsedomain "legalgo-BE-go/internal/domain/reponse"
userdomain "legalgo-BE-go/internal/domain/user" userdomain "legalgo-BE-go/internal/domain/user"
authsvc "legalgo-BE-go/internal/services/auth" usersvc "legalgo-BE-go/internal/services/user"
"legalgo-BE-go/internal/utilities/response" "legalgo-BE-go/internal/utilities/response"
"legalgo-BE-go/internal/utilities/utils" "legalgo-BE-go/internal/utilities/utils"
"net/http" "net/http"
@ -15,7 +15,7 @@ import (
func Login( func Login(
router chi.Router, router chi.Router,
authSvc authsvc.Auth, userSvc usersvc.User,
validate *validator.Validate, validate *validator.Validate,
rdb *redis.Client, rdb *redis.Client,
) { ) {
@ -48,7 +48,7 @@ func Login(
return return
} }
token, err := authSvc.LoginAsUser(spec) token, err := userSvc.LoginAsUser(spec)
if err != nil { if err != nil {
response.ResponseWithErrorCode( response.ResponseWithErrorCode(
ctx, ctx,

View File

@ -1,7 +1,7 @@
package userhttp package userhttp
import ( import (
authsvc "legalgo-BE-go/internal/services/auth" usersvc "legalgo-BE-go/internal/services/user"
"legalgo-BE-go/internal/utilities/response" "legalgo-BE-go/internal/utilities/response"
"legalgo-BE-go/internal/utilities/utils" "legalgo-BE-go/internal/utilities/utils"
"net/http" "net/http"
@ -11,7 +11,7 @@ import (
func GetProfile( func GetProfile(
router chi.Router, router chi.Router,
authSvc authsvc.Auth, userSvc usersvc.User,
) { ) {
router.Get("/user/profile", func(w http.ResponseWriter, r *http.Request) { router.Get("/user/profile", func(w http.ResponseWriter, r *http.Request) {
ctx := r.Context() ctx := r.Context()
@ -28,7 +28,7 @@ func GetProfile(
return return
} }
userProfile, err := authSvc.GetUserProfile(destructedToken.Email) userProfile, err := userSvc.GetUserProfile(destructedToken.Email)
if err != nil { if err != nil {
response.ResponseWithErrorCode( response.ResponseWithErrorCode(
ctx, ctx,

View File

@ -3,7 +3,7 @@ package userhttp
import ( import (
responsedomain "legalgo-BE-go/internal/domain/reponse" responsedomain "legalgo-BE-go/internal/domain/reponse"
userdomain "legalgo-BE-go/internal/domain/user" userdomain "legalgo-BE-go/internal/domain/user"
authsvc "legalgo-BE-go/internal/services/auth" usersvc "legalgo-BE-go/internal/services/user"
"legalgo-BE-go/internal/utilities/response" "legalgo-BE-go/internal/utilities/response"
"legalgo-BE-go/internal/utilities/utils" "legalgo-BE-go/internal/utilities/utils"
"net/http" "net/http"
@ -16,7 +16,7 @@ import (
func Register( func Register(
router chi.Router, router chi.Router,
validate *validator.Validate, validate *validator.Validate,
authSvc authsvc.Auth, authSvc usersvc.User,
rdb *redis.Client, rdb *redis.Client,
) { ) {
router.Post("/user/register", func(w http.ResponseWriter, r *http.Request) { router.Post("/user/register", func(w http.ResponseWriter, r *http.Request) {

View File

@ -1,28 +1,18 @@
package subscribedomain package subscribedomain
import ( import (
subscribeplandm "legalgo-BE-go/internal/domain/subscribe_plan_model" subscribeplan "legalgo-BE-go/internal/domain/subscribe_plan"
"time" "time"
) )
type SubscribeDepecrate struct {
ID string `json:"id"`
SubscribePlanID string `json:"subscribe_plan_id"`
}
type SubscribeUpdateReqDepecrate struct {
ID string `json:"id"`
Status string `json:"status"`
}
// refactored
type Subscribe struct { type Subscribe struct {
ID string `gorm:"primaryKey" json:"id"` ID string `json:"id"`
SubscribePlanID string `gorm:"not null" json:"subscribe_plan_id"` SubscribePlanID string `json:"subscribe_plan_id"`
StartDate time.Time `gorm:"default:CURRENT_TIMESTAMP"` StartDate time.Time `json:"start_date"`
EndDate time.Time `gorm:"default:null"` EndDate *time.Time `json:"end_date"`
Status string `gorm:"default:'inactive'"` Status string `json:"status"`
AutoRenew bool `gorm:"default:true"` AutoRenew bool `json:"auto_renew"`
UpdatedAt time.Time `json:"updated_at"`
SubscribePlan subscribeplandm.SubscribePlan `gorm:"foreignKey:SubscribePlanID;constraint:OnDelete:CASCADE" json:"subscribe_plan"` SubscribePlan subscribeplan.SubscribePlan `gorm:"foreignKey:SubscribePlanID" json:"subscribe_plan"`
} }

View File

@ -1,17 +0,0 @@
package subscribedm
import (
subscribeplandm "legalgo-BE-go/internal/domain/subscribe_plan_model"
"time"
)
type Subscribe struct {
ID string `json:"id"`
SubscribePlanID string `json:"subscribe_plan_id"`
StartDate time.Time `json:"start_date"`
EndDate *time.Time `json:"end_date"`
Status string `json:"status"`
AutoRenew bool `json:"auto_renew"`
SubscribePlan subscribeplandm.SubscribePlan `gorm:"foreignKey:SubscribePlanID" json:"subscribe_plan"`
}

View File

@ -1,12 +1,22 @@
package subscribeplandomain package subscribeplandomain
import "time"
type SubscribePlan struct {
ID string `json:"id"`
Code string `json:"code"`
Name string `json:"name"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
type SubscribePlanUpdate struct {
Code string `json:"code" validate:"required"`
Name string `json:"name" validate:"required"`
UpdatedAt time.Time `json:"updated_at"`
}
type SubscribePlanReq struct { type SubscribePlanReq struct {
Code string `json:"code" validate:"required"` Code string `json:"code" validate:"required"`
Name string `json:"name" validate:"required"` Name string `json:"name" validate:"required"`
} }
type SubscribePlan struct {
ID string `json:"id"`
Code string `json:"code"`
Name string `json:"name"`
}

View File

@ -1,8 +0,0 @@
package subscribeplandm
// refactored
type SubscribePlan struct {
ID string `json:"id"`
Code string `json:"code"`
Name string `json:"name"`
}

View File

@ -1,6 +1,9 @@
package userdomain package userdomain
import subscribedm "legalgo-BE-go/internal/domain/subscribe_model" import (
subscribe "legalgo-BE-go/internal/domain/subscribe"
"time"
)
type User struct { type User struct {
ID string `json:"id"` ID string `json:"id"`
@ -9,7 +12,7 @@ type User struct {
Email string `json:"email"` Email string `json:"email"`
Phone string `json:"phone"` Phone string `json:"phone"`
Subscribe subscribedm.Subscribe `gorm:"foreignKey:SubscribeID" json:"subscribe"` Subscribe subscribe.Subscribe `gorm:"foreignKey:SubscribeID" json:"subscribe"`
} }
type UserRegister struct { type UserRegister struct {
@ -24,7 +27,7 @@ type UserProfile struct {
Email string `json:"email"` Email string `json:"email"`
Phone string `json:"phone"` Phone string `json:"phone"`
Subscribe subscribedm.Subscribe `gorm:"foreignKey:SubscribeID" json:"subscribe"` Subscribe subscribe.Subscribe `gorm:"foreignKey:SubscribeID" json:"subscribe"`
} }
type UserLogin struct { type UserLogin struct {
@ -33,5 +36,10 @@ type UserLogin struct {
} }
type UserSubsUpdate struct { type UserSubsUpdate struct {
Status string `json:"status"` ID string `json:"id"`
Status string `json:"status"`
SubscribePlanID string `json:"subscribe_plan_id"`
AutoRenew bool `json:"auto_renew"`
StartDate time.Time `json:"start_date"`
EndDate *time.Time `json:"end_date"`
} }

View File

@ -1,14 +0,0 @@
package authsvc
import (
userdomain "legalgo-BE-go/internal/domain/user"
)
func (as *impl) GetUserProfile(email string) (*userdomain.UserProfile, error) {
user, err := as.userRepo.GetUserProfile(email)
if err != nil {
return nil, err
}
return user, nil
}

View File

@ -3,7 +3,7 @@ package authsvc
import ( import (
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"
subscribeplanrepository "legalgo-BE-go/internal/accessor/subscribeplan" subscribeplanrepository "legalgo-BE-go/internal/accessor/subscribe_plan"
userrepository "legalgo-BE-go/internal/accessor/user" userrepository "legalgo-BE-go/internal/accessor/user"
staffdomain "legalgo-BE-go/internal/domain/staff" staffdomain "legalgo-BE-go/internal/domain/staff"
userdomain "legalgo-BE-go/internal/domain/user" userdomain "legalgo-BE-go/internal/domain/user"
@ -12,8 +12,8 @@ import (
type impl struct { type impl struct {
staffRepo staffrepository.Staff staffRepo staffrepository.Staff
userRepo userrepository.User userRepo userrepository.User
subsRepo subscriberepository.SubsIntf subsRepo subscriberepository.Subscribe
subsPlanRepo subscribeplanrepository.SubsPlanIntf subsPlanRepo subscribeplanrepository.SubscribePlan
} }
type Auth interface { type Auth interface {
@ -22,17 +22,13 @@ type Auth interface {
GetStaffProfile(string) (*staffdomain.StaffProfile, error) GetStaffProfile(string) (*staffdomain.StaffProfile, error)
GetUsers() ([]userdomain.UserProfile, error) GetUsers() ([]userdomain.UserProfile, error)
UpdateStaff(staffdomain.Staff) error UpdateStaff(staffdomain.Staff) error
LoginAsUser(userdomain.UserLogin) (string, error)
RegisterUser(userdomain.UserRegister) (string, error)
GetUserProfile(string) (*userdomain.UserProfile, error)
} }
func New( func New(
staffRepo staffrepository.Staff, staffRepo staffrepository.Staff,
userRepo userrepository.User, userRepo userrepository.User,
subsRepo subscriberepository.SubsIntf, subsRepo subscriberepository.Subscribe,
subsPlanRepo subscribeplanrepository.SubsPlanIntf, subsPlanRepo subscribeplanrepository.SubscribePlan,
) Auth { ) Auth {
return &impl{ return &impl{
staffRepo: staffRepo, staffRepo: staffRepo,

View File

@ -16,7 +16,7 @@ func (sv *impl) LoginAsStaff(spec staffdomain.StaffLogin) (string, error) {
return "", errors.New(err.Error()) return "", errors.New(err.Error())
} }
matchPassword := ComparePassword(staff.Password, spec.Password) matchPassword := utils.ComparePassword(staff.Password, spec.Password)
if !matchPassword { if !matchPassword {
return "", errors.New("wrong password") return "", errors.New("wrong password")
} }

View File

@ -15,7 +15,7 @@ func (a *impl) RegisterStaff(spec staffdomain.StaffRegister) (string, error) {
if err == nil { if err == nil {
return "", errors.New("this email address is already in use") return "", errors.New("this email address is already in use")
} }
hashedPwd, err := HashPassword(spec.Password) hashedPwd, err := utils.HashPassword(spec.Password)
if err != nil { if err != nil {
return "", err return "", err
} }

View File

@ -8,6 +8,7 @@ import (
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"
usersvc "legalgo-BE-go/internal/services/user"
"go.uber.org/fx" "go.uber.org/fx"
) )
@ -21,5 +22,6 @@ var Module = fx.Module("services",
categorysvc.New, categorysvc.New,
newssvc.New, newssvc.New,
oss.NewOSSService, oss.NewOSSService,
usersvc.New,
), ),
) )

View File

@ -6,14 +6,14 @@ import (
) )
type impl struct { type impl struct {
subsRepo subscriberepository.SubsIntf subsRepo subscriberepository.Subscribe
} }
type Subscribe interface { type Subscribe interface {
Create(string) (string, error) Create(string) (string, error)
Update(string, userdomain.UserSubsUpdate) error Update(userdomain.UserSubsUpdate) error
} }
func New(subsRepo subscriberepository.SubsIntf) Subscribe { func New(subsRepo subscriberepository.Subscribe) Subscribe {
return &impl{subsRepo} return &impl{subsRepo}
} }

View File

@ -1,9 +1,20 @@
package subscribesvc package subscribesvc
import ( import (
subscribedomain "legalgo-BE-go/internal/domain/subscribe"
userdomain "legalgo-BE-go/internal/domain/user" userdomain "legalgo-BE-go/internal/domain/user"
timeutils "legalgo-BE-go/internal/utilities/time_utils"
) )
func (i *impl) Update(id string, spec userdomain.UserSubsUpdate) error { func (i *impl) Update(spec userdomain.UserSubsUpdate) error {
return nil newSpec := subscribedomain.Subscribe{
ID: spec.ID,
AutoRenew: spec.AutoRenew,
StartDate: timeutils.Now(),
EndDate: spec.EndDate,
Status: spec.Status,
SubscribePlanID: spec.SubscribePlanID,
UpdatedAt: timeutils.Now(),
}
return i.subsRepo.Update(newSpec)
} }

View File

@ -0,0 +1,16 @@
package subscribeplansvc
import (
subscribeplandomain "legalgo-BE-go/internal/domain/subscribe_plan"
"github.com/google/uuid"
)
func (sb *impl) Create(spec subscribeplandomain.SubscribePlanReq) error {
data := subscribeplandomain.SubscribePlan{
ID: uuid.NewString(),
Code: spec.Code,
Name: spec.Name,
}
return sb.subsRepo.Create(data)
}

View File

@ -1,7 +0,0 @@
package subscribeplansvc
import subscribeplandomain "legalgo-BE-go/internal/domain/subscribe_plan"
func (sb *impl) CreatePlan(spec subscribeplandomain.SubscribePlanReq) error {
return sb.subsAccs.Create(spec)
}

View File

@ -0,0 +1,5 @@
package subscribeplansvc
func (i *impl) Delete(id string) error {
return i.subsRepo.Delete(id)
}

View File

@ -5,5 +5,5 @@ import (
) )
func (s *impl) GetAllPlan() ([]subscribeplandomain.SubscribePlan, error) { func (s *impl) GetAllPlan() ([]subscribeplandomain.SubscribePlan, error) {
return s.subsAccs.GetAll() return s.subsRepo.GetAll()
} }

View File

@ -1,21 +1,23 @@
package subscribeplansvc package subscribeplansvc
import ( import (
subscribeplanrepository "legalgo-BE-go/internal/accessor/subscribeplan" subscribeplanrepository "legalgo-BE-go/internal/accessor/subscribe_plan"
subscribeplandomain "legalgo-BE-go/internal/domain/subscribe_plan" subscribeplandomain "legalgo-BE-go/internal/domain/subscribe_plan"
) )
type impl struct { type impl struct {
subsAccs subscribeplanrepository.SubsPlanIntf subsRepo subscribeplanrepository.SubscribePlan
} }
type SubscribePlan interface { type SubscribePlan interface {
CreatePlan(subscribeplandomain.SubscribePlanReq) error Create(subscribeplandomain.SubscribePlanReq) error
Update(string, subscribeplandomain.SubscribePlanUpdate) error
GetAllPlan() ([]subscribeplandomain.SubscribePlan, error) GetAllPlan() ([]subscribeplandomain.SubscribePlan, error)
Delete(string) error
} }
func New( func New(
subsAccs subscribeplanrepository.SubsPlanIntf, subsAccs subscribeplanrepository.SubscribePlan,
) SubscribePlan { ) SubscribePlan {
return &impl{subsAccs} return &impl{subsAccs}
} }

View File

@ -0,0 +1,16 @@
package subscribeplansvc
import (
subscribeplandomain "legalgo-BE-go/internal/domain/subscribe_plan"
timeutils "legalgo-BE-go/internal/utilities/time_utils"
)
func (i *impl) Update(id string, spec subscribeplandomain.SubscribePlanUpdate) error {
newData := subscribeplandomain.SubscribePlan{
ID: id,
Code: spec.Code,
Name: spec.Name,
UpdatedAt: timeutils.Now(),
}
return i.subsRepo.Update(newData)
}

View File

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

View File

@ -12,7 +12,6 @@ type impl struct {
type Tag interface { type Tag interface {
Create(tagdomain.TagReq) error Create(tagdomain.TagReq) error
GetAll() ([]tagdomain.Tag, error) GetAll() ([]tagdomain.Tag, error)
GetAllModel() ([]tagdomain.Tag, error)
Update(string, tagdomain.TagReq) error Update(string, tagdomain.TagReq) error
Delete(string) error Delete(string) error
} }

View File

@ -0,0 +1,14 @@
package usersvc
import (
userdomain "legalgo-BE-go/internal/domain/user"
)
func (i *impl) GetUserProfile(email string) (*userdomain.UserProfile, error) {
user, err := i.userRepo.GetUserProfile(email)
if err != nil {
return nil, err
}
return user, nil
}

View File

@ -0,0 +1,32 @@
package usersvc
import (
subscriberepository "legalgo-BE-go/internal/accessor/subscribe"
subscribeplanrepository "legalgo-BE-go/internal/accessor/subscribe_plan"
userrepository "legalgo-BE-go/internal/accessor/user"
userdomain "legalgo-BE-go/internal/domain/user"
)
type impl struct {
subsRepo subscriberepository.Subscribe
userRepo userrepository.User
subsPlanRepo subscribeplanrepository.SubscribePlan
}
type User interface {
GetUserProfile(string) (*userdomain.UserProfile, error)
LoginAsUser(userdomain.UserLogin) (string, error)
RegisterUser(userdomain.UserRegister) (string, error)
}
func New(
subsRepo subscriberepository.Subscribe,
userRepo userrepository.User,
subsPlanRepo subscribeplanrepository.SubscribePlan,
) User {
return &impl{
subsRepo,
userRepo,
subsPlanRepo,
}
}

View File

@ -1,4 +1,4 @@
package authsvc package usersvc
import ( import (
"errors" "errors"
@ -10,13 +10,13 @@ import (
"github.com/google/uuid" "github.com/google/uuid"
) )
func (a *impl) LoginAsUser(spec userdomain.UserLogin) (string, error) { func (i *impl) LoginAsUser(spec userdomain.UserLogin) (string, error) {
user, err := a.userRepo.GetUserByEmail(spec.Email) user, err := i.userRepo.GetUserByEmail(spec.Email)
if err != nil { if err != nil {
return "", errors.New(err.Error()) return "", errors.New(err.Error())
} }
matchPassword := ComparePassword(user.Password, spec.Password) matchPassword := utils.ComparePassword(user.Password, spec.Password)
if !matchPassword { if !matchPassword {
return "", errors.New("wrong password") return "", errors.New("wrong password")
} }

View File

@ -1,4 +1,4 @@
package authsvc package usersvc
import ( import (
"errors" "errors"
@ -10,15 +10,15 @@ import (
"github.com/google/uuid" "github.com/google/uuid"
) )
func (a *impl) RegisterUser(spec userdomain.UserRegister) (string, error) { func (i *impl) RegisterUser(spec userdomain.UserRegister) (string, error) {
_, err := a.userRepo.GetUserByEmail(spec.Email) _, err := i.userRepo.GetUserByEmail(spec.Email)
if err == nil { if err == nil {
return "", errors.New("this email address is already in use") return "", errors.New("this email address is already in use")
} }
if spec.SubscribePlanID == "" { if spec.SubscribePlanID == "" {
subsPlan, err := a.subsPlanRepo.GetDefault() subsPlan, err := i.subsPlanRepo.GetDefault()
if err != nil { if err != nil {
return "", err return "", err
} }
@ -26,17 +26,17 @@ func (a *impl) RegisterUser(spec userdomain.UserRegister) (string, error) {
spec.SubscribePlanID = subsPlan.ID spec.SubscribePlanID = subsPlan.ID
} }
_, err = a.subsPlanRepo.GetByID(spec.SubscribePlanID) _, err = i.subsPlanRepo.GetByID(spec.SubscribePlanID)
if err != nil { if err != nil {
return "", errors.New(err.Error()) return "", errors.New(err.Error())
} }
subsId, err := a.subsRepo.Create(spec.SubscribePlanID) subsId, err := i.subsRepo.Create(spec.SubscribePlanID)
if err != nil { if err != nil {
return "", err return "", err
} }
hashedPwd, err := HashPassword(spec.Password) hashedPwd, err := utils.HashPassword(spec.Password)
if err != nil { if err != nil {
return "", err return "", err
} }
@ -49,7 +49,7 @@ func (a *impl) RegisterUser(spec userdomain.UserRegister) (string, error) {
Phone: spec.Phone, Phone: spec.Phone,
} }
err = a.userRepo.CreateUser(user) err = i.userRepo.CreateUser(user)
if err != nil { if err != nil {
return "", errors.New(err.Error()) return "", errors.New(err.Error())
} }

View File

@ -1,4 +1,4 @@
package authsvc package utils
import ( import (
"fmt" "fmt"