feat: refactor auth package and add get users for staff

This commit is contained in:
ericprd 2025-03-07 17:39:26 +08:00
parent c48a4b944b
commit fdf572cd3d
29 changed files with 203 additions and 78 deletions

View File

@ -9,7 +9,7 @@ import (
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/subscribeplan"
tagrepository "legalgo-BE-go/internal/accessor/tag" tagrepository "legalgo-BE-go/internal/accessor/tag"
userrepository "legalgo-BE-go/internal/accessor/user_repository" userrepository "legalgo-BE-go/internal/accessor/user"
"go.uber.org/fx" "go.uber.org/fx"
) )

View File

@ -4,7 +4,7 @@ import (
staffdomain "legalgo-BE-go/internal/domain/staff" staffdomain "legalgo-BE-go/internal/domain/staff"
) )
func (ur *impl) Create(spec staffdomain.Staff) error { func (ur *accessor) Create(spec staffdomain.Staff) error {
if err := ur.db.Create(&spec).Error; err != nil { if err := ur.db.Create(&spec).Error; err != nil {
return err return err
} }

View File

@ -8,7 +8,7 @@ import (
"gorm.io/gorm" "gorm.io/gorm"
) )
func (sr *impl) GetStaffByEmail(email string) (*staffdomain.Staff, error) { func (sr *accessor) GetStaffByEmail(email string) (*staffdomain.Staff, error) {
var staff staffdomain.Staff var staff staffdomain.Staff
if email == "" { if email == "" {

View File

@ -7,7 +7,7 @@ import (
"gorm.io/gorm" "gorm.io/gorm"
) )
func (sr *impl) GetStaffByID(ID string) (*staffdomain.Staff, error) { func (sr *accessor) GetStaffByID(ID string) (*staffdomain.Staff, error) {
var staff staffdomain.Staff var staff staffdomain.Staff
if ID == "" { if ID == "" {

View File

@ -0,0 +1,27 @@
package staffrepository
import userdomain "legalgo-BE-go/internal/domain/user"
func (a *accessor) GetUsers() ([]userdomain.UserProfile, error) {
var usersRaw []userdomain.User
if err := a.db.
Preload("Subscribe").
Preload("Subscribe.SubscribePlan").
Find(&usersRaw).
Error; err != nil {
return nil, err
}
users := []userdomain.UserProfile{}
for _, user := range usersRaw {
users = append(users, userdomain.UserProfile{
ID: user.ID,
Email: user.Email,
Phone: user.Phone,
Subscribe: user.Subscribe,
})
}
return users, nil
}

View File

@ -3,19 +3,21 @@ package staffrepository
import ( import (
"legalgo-BE-go/database" "legalgo-BE-go/database"
staffdomain "legalgo-BE-go/internal/domain/staff" staffdomain "legalgo-BE-go/internal/domain/staff"
userdomain "legalgo-BE-go/internal/domain/user"
) )
type impl struct { type accessor struct {
db *database.DB db *database.DB
} }
type Staff interface { type Staff interface {
GetStaffByEmail(string) (*staffdomain.Staff, error) GetStaffByEmail(string) (*staffdomain.Staff, error)
GetStaffByID(string) (*staffdomain.Staff, error) GetStaffByID(string) (*staffdomain.Staff, error)
GetUsers() ([]userdomain.UserProfile, error)
Create(staffdomain.Staff) error Create(staffdomain.Staff) error
Update(staffdomain.Staff) error Update(staffdomain.Staff) error
} }
func New(db *database.DB) Staff { func New(db *database.DB) Staff {
return &impl{db} return &accessor{db}
} }

View File

@ -5,7 +5,7 @@ import (
"legalgo-BE-go/internal/utilities/utils" "legalgo-BE-go/internal/utilities/utils"
) )
func (ur *impl) Update(spec staffdomain.Staff) error { func (ur *accessor) Update(spec staffdomain.Staff) error {
val, err := utils.StructToMap(spec) val, err := utils.StructToMap(spec)
if err != nil { if err != nil {
return err return err

View File

@ -1,15 +0,0 @@
package authhttp
import "go.uber.org/fx"
var Module = fx.Module("auth-api",
fx.Invoke(
LoginStaff,
LoginUser,
RegisterUser,
RegisterStaff,
UpdateStaff,
GetStaffProfile,
GetUserProfile,
),
)

View File

@ -1,12 +1,13 @@
package internalhttp package internalhttp
import ( import (
authhttp "legalgo-BE-go/internal/api/http/auth"
categoryhttp "legalgo-BE-go/internal/api/http/category" categoryhttp "legalgo-BE-go/internal/api/http/category"
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"
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"
"github.com/go-chi/chi/v5" "github.com/go-chi/chi/v5"
"github.com/go-chi/cors" "github.com/go-chi/cors"
@ -21,12 +22,13 @@ var Module = fx.Module("router",
initRouter, initRouter,
validator.New, validator.New,
), ),
authhttp.Module, staffhttp.Module,
subscribeplanhttp.Module, subscribeplanhttp.Module,
taghttp.Module, taghttp.Module,
categoryhttp.Module, categoryhttp.Module,
newshttp.Module, newshttp.Module,
osshttp.Module, osshttp.Module,
userhttp.Module,
) )
func initRouter() chi.Router { func initRouter() chi.Router {

View File

@ -0,0 +1,59 @@
package staffhttp
import (
authmiddleware "legalgo-BE-go/internal/api/http/middleware/auth"
authsvc "legalgo-BE-go/internal/services/auth"
"legalgo-BE-go/internal/utilities/response"
"legalgo-BE-go/internal/utilities/utils"
"net/http"
"github.com/go-chi/chi/v5"
)
func GetUsers(
router chi.Router,
authSvc authsvc.Auth,
) {
router.With(authmiddleware.Authorize()).Get("/staff/users", func(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
staffDetail, err := utils.GetTokenDetail(r)
if err != nil {
response.RespondJsonErrorWithCode(
ctx,
w,
err,
response.ErrBadRequest.Code,
response.ErrBadRequest.HttpCode,
"failed to get staff token",
)
return
}
if staffDetail.Role != "staff" {
response.RespondJsonErrorWithCode(
ctx,
w,
err,
response.ErrUnauthorized.Code,
response.ErrUnauthorized.HttpCode,
"unauthorized",
)
return
}
users, err := authSvc.GetUsers()
if err != nil {
response.RespondJsonErrorWithCode(
ctx,
w,
err,
response.ErrBadRequest.Code,
response.ErrBadRequest.HttpCode,
"failed to get users",
)
return
}
response.RespondJsonSuccess(ctx, w, users)
})
}

View File

@ -1,4 +1,4 @@
package authhttp package staffhttp
import ( import (
"net/http" "net/http"
@ -14,7 +14,7 @@ import (
"github.com/redis/go-redis/v9" "github.com/redis/go-redis/v9"
) )
func LoginStaff( func Login(
router chi.Router, router chi.Router,
authSvc authsvc.Auth, authSvc authsvc.Auth,
validate *validator.Validate, validate *validator.Validate,

View File

@ -0,0 +1,13 @@
package staffhttp
import "go.uber.org/fx"
var Module = fx.Module("auth-api",
fx.Invoke(
Login,
Register,
Update,
GetProfile,
GetUsers,
),
)

View File

@ -1,4 +1,4 @@
package authhttp package staffhttp
import ( import (
authsvc "legalgo-BE-go/internal/services/auth" authsvc "legalgo-BE-go/internal/services/auth"
@ -9,7 +9,7 @@ import (
"github.com/go-chi/chi/v5" "github.com/go-chi/chi/v5"
) )
func GetStaffProfile( func GetProfile(
router chi.Router, router chi.Router,
authSvc authsvc.Auth, authSvc authsvc.Auth,
) { ) {
@ -44,39 +44,3 @@ func GetStaffProfile(
response.RespondJsonSuccess(ctx, w, staffProfile) response.RespondJsonSuccess(ctx, w, staffProfile)
}) })
} }
func GetUserProfile(
router chi.Router,
authSvc authsvc.Auth,
) {
router.Get("/user/profile", func(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
destructedToken, err := utils.GetTokenDetail(r)
if err != nil {
response.ResponseWithErrorCode(
ctx,
w,
err,
response.ErrBadRequest.Code,
response.ErrBadRequest.HttpCode,
err.Error(),
)
return
}
userProfile, err := authSvc.GetUserProfile(destructedToken.Email)
if err != nil {
response.ResponseWithErrorCode(
ctx,
w,
err,
response.ErrBadRequest.Code,
response.ErrBadRequest.HttpCode,
err.Error(),
)
return
}
response.RespondJsonSuccess(ctx, w, userProfile)
})
}

View File

@ -1,4 +1,4 @@
package authhttp package staffhttp
import ( import (
"net/http" "net/http"
@ -14,7 +14,7 @@ import (
"github.com/redis/go-redis/v9" "github.com/redis/go-redis/v9"
) )
func RegisterStaff( func Register(
router chi.Router, router chi.Router,
validate *validator.Validate, validate *validator.Validate,
authSvc authsvc.Auth, authSvc authsvc.Auth,

View File

@ -1,4 +1,4 @@
package authhttp package staffhttp
import ( import (
"errors" "errors"
@ -11,7 +11,7 @@ import (
"github.com/go-chi/chi/v5" "github.com/go-chi/chi/v5"
) )
func UpdateStaff( func Update(
router chi.Router, router chi.Router,
authSvc authsvc.Auth, authSvc authsvc.Auth,
) { ) {

View File

@ -1,4 +1,4 @@
package authhttp package userhttp
import ( import (
responsedomain "legalgo-BE-go/internal/domain/reponse" responsedomain "legalgo-BE-go/internal/domain/reponse"
@ -13,7 +13,7 @@ import (
"github.com/redis/go-redis/v9" "github.com/redis/go-redis/v9"
) )
func LoginUser( func Login(
router chi.Router, router chi.Router,
authSvc authsvc.Auth, authSvc authsvc.Auth,
validate *validator.Validate, validate *validator.Validate,

View File

@ -0,0 +1,9 @@
package userhttp
import "go.uber.org/fx"
var Module = fx.Module("user-http", fx.Invoke(
Register,
Login,
GetProfile,
))

View File

@ -0,0 +1,46 @@
package userhttp
import (
authsvc "legalgo-BE-go/internal/services/auth"
"legalgo-BE-go/internal/utilities/response"
"legalgo-BE-go/internal/utilities/utils"
"net/http"
"github.com/go-chi/chi/v5"
)
func GetProfile(
router chi.Router,
authSvc authsvc.Auth,
) {
router.Get("/user/profile", func(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
destructedToken, err := utils.GetTokenDetail(r)
if err != nil {
response.ResponseWithErrorCode(
ctx,
w,
err,
response.ErrBadRequest.Code,
response.ErrBadRequest.HttpCode,
err.Error(),
)
return
}
userProfile, err := authSvc.GetUserProfile(destructedToken.Email)
if err != nil {
response.ResponseWithErrorCode(
ctx,
w,
err,
response.ErrBadRequest.Code,
response.ErrBadRequest.HttpCode,
err.Error(),
)
return
}
response.RespondJsonSuccess(ctx, w, userProfile)
})
}

View File

@ -1,4 +1,4 @@
package authhttp package userhttp
import ( import (
responsedomain "legalgo-BE-go/internal/domain/reponse" responsedomain "legalgo-BE-go/internal/domain/reponse"
@ -13,7 +13,7 @@ import (
"github.com/redis/go-redis/v9" "github.com/redis/go-redis/v9"
) )
func RegisterUser( func Register(
router chi.Router, router chi.Router,
validate *validator.Validate, validate *validator.Validate,
authSvc authsvc.Auth, authSvc authsvc.Auth,

View File

@ -9,4 +9,5 @@ const (
SESSION_ID JWTClaim = "sid" SESSION_ID JWTClaim = "sid"
ISSUED_AT JWTClaim = "iat" ISSUED_AT JWTClaim = "iat"
RESOURCES JWTClaim = "resources" RESOURCES JWTClaim = "resources"
ROLE JWTClaim = "role"
) )

View File

@ -0,0 +1,7 @@
package authsvc
import userdomain "legalgo-BE-go/internal/domain/user"
func (i *impl) GetUsers() ([]userdomain.UserProfile, error) {
return i.staffRepo.GetUsers()
}

View File

@ -4,7 +4,7 @@ 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/subscribeplan"
userrepository "legalgo-BE-go/internal/accessor/user_repository" 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"
) )
@ -20,6 +20,7 @@ type Auth interface {
LoginAsStaff(staffdomain.StaffLogin) (string, error) LoginAsStaff(staffdomain.StaffLogin) (string, error)
RegisterStaff(staffdomain.StaffRegister) (string, error) RegisterStaff(staffdomain.StaffRegister) (string, error)
GetStaffProfile(string) (*staffdomain.StaffProfile, error) GetStaffProfile(string) (*staffdomain.StaffProfile, error)
GetUsers() ([]userdomain.UserProfile, error)
UpdateStaff(staffdomain.Staff) error UpdateStaff(staffdomain.Staff) error
LoginAsUser(userdomain.UserLogin) (string, error) LoginAsUser(userdomain.UserLogin) (string, error)

View File

@ -4,7 +4,7 @@ import (
categoryrepository "legalgo-BE-go/internal/accessor/category" categoryrepository "legalgo-BE-go/internal/accessor/category"
newsrepository "legalgo-BE-go/internal/accessor/news" newsrepository "legalgo-BE-go/internal/accessor/news"
tagrepository "legalgo-BE-go/internal/accessor/tag" tagrepository "legalgo-BE-go/internal/accessor/tag"
userrepository "legalgo-BE-go/internal/accessor/user_repository" userrepository "legalgo-BE-go/internal/accessor/user"
newsdomain "legalgo-BE-go/internal/domain/news" newsdomain "legalgo-BE-go/internal/domain/news"
) )

View File

@ -34,10 +34,10 @@ type ClaimOption func(options jwt.MapClaims)
func GenerateToken(data authdomain.AuthToken) (string, error) { func GenerateToken(data authdomain.AuthToken) (string, error) {
now := timeutils.Now() now := timeutils.Now()
claims := jwt.MapClaims{ claims := jwt.MapClaims{
"email": data.Email, string(jwtclaimenum.EMAIL): data.Email,
"role": data.Role, string(jwtclaimenum.ROLE): data.Role,
"session_id": data.SessionID, string(jwtclaimenum.SESSION_ID): data.SessionID,
"exp": now.Add(time.Minute * time.Duration(config.REDIS_TIMEOUT)).Unix(), string(jwtclaimenum.EXPIRED_AT): now.Add(time.Minute * time.Duration(config.REDIS_TIMEOUT)).Unix(),
} }
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
@ -79,10 +79,19 @@ func DestructToken(s string) (authdomain.AuthToken, error) {
} }
sessionId, ok := claims[string(jwtclaimenum.SESSION_ID)].(string) sessionId, ok := claims[string(jwtclaimenum.SESSION_ID)].(string)
if !ok {
return data, errors.New("invalid session_id")
}
role, ok := claims[string(jwtclaimenum.ROLE)].(string)
if !ok {
return data, errors.New("invalid role")
}
data = authdomain.AuthToken{ data = authdomain.AuthToken{
Email: email, Email: email,
SessionID: sessionId, SessionID: sessionId,
Role: role,
} }
return data, nil return data, nil