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"
subscribeplanrepository "legalgo-BE-go/internal/accessor/subscribeplan"
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"
)

View File

@ -4,7 +4,7 @@ import (
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 {
return err
}

View File

@ -8,7 +8,7 @@ import (
"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
if email == "" {

View File

@ -7,7 +7,7 @@ import (
"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
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 (
"legalgo-BE-go/database"
staffdomain "legalgo-BE-go/internal/domain/staff"
userdomain "legalgo-BE-go/internal/domain/user"
)
type impl struct {
type accessor struct {
db *database.DB
}
type Staff interface {
GetStaffByEmail(string) (*staffdomain.Staff, error)
GetStaffByID(string) (*staffdomain.Staff, error)
GetUsers() ([]userdomain.UserProfile, error)
Create(staffdomain.Staff) error
Update(staffdomain.Staff) error
}
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"
)
func (ur *impl) Update(spec staffdomain.Staff) error {
func (ur *accessor) Update(spec staffdomain.Staff) error {
val, err := utils.StructToMap(spec)
if err != nil {
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
import (
authhttp "legalgo-BE-go/internal/api/http/auth"
categoryhttp "legalgo-BE-go/internal/api/http/category"
newshttp "legalgo-BE-go/internal/api/http/news"
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"
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/cors"
@ -21,12 +22,13 @@ var Module = fx.Module("router",
initRouter,
validator.New,
),
authhttp.Module,
staffhttp.Module,
subscribeplanhttp.Module,
taghttp.Module,
categoryhttp.Module,
newshttp.Module,
osshttp.Module,
userhttp.Module,
)
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 (
"net/http"
@ -14,7 +14,7 @@ import (
"github.com/redis/go-redis/v9"
)
func LoginStaff(
func Login(
router chi.Router,
authSvc authsvc.Auth,
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 (
authsvc "legalgo-BE-go/internal/services/auth"
@ -9,7 +9,7 @@ import (
"github.com/go-chi/chi/v5"
)
func GetStaffProfile(
func GetProfile(
router chi.Router,
authSvc authsvc.Auth,
) {
@ -44,39 +44,3 @@ func GetStaffProfile(
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 (
"net/http"
@ -14,7 +14,7 @@ import (
"github.com/redis/go-redis/v9"
)
func RegisterStaff(
func Register(
router chi.Router,
validate *validator.Validate,
authSvc authsvc.Auth,

View File

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

View File

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

View File

@ -9,4 +9,5 @@ const (
SESSION_ID JWTClaim = "sid"
ISSUED_AT JWTClaim = "iat"
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"
subscriberepository "legalgo-BE-go/internal/accessor/subscribe"
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"
userdomain "legalgo-BE-go/internal/domain/user"
)
@ -20,6 +20,7 @@ type Auth interface {
LoginAsStaff(staffdomain.StaffLogin) (string, error)
RegisterStaff(staffdomain.StaffRegister) (string, error)
GetStaffProfile(string) (*staffdomain.StaffProfile, error)
GetUsers() ([]userdomain.UserProfile, error)
UpdateStaff(staffdomain.Staff) error
LoginAsUser(userdomain.UserLogin) (string, error)

View File

@ -4,7 +4,7 @@ import (
categoryrepository "legalgo-BE-go/internal/accessor/category"
newsrepository "legalgo-BE-go/internal/accessor/news"
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"
)

View File

@ -34,10 +34,10 @@ type ClaimOption func(options jwt.MapClaims)
func GenerateToken(data authdomain.AuthToken) (string, error) {
now := timeutils.Now()
claims := jwt.MapClaims{
"email": data.Email,
"role": data.Role,
"session_id": data.SessionID,
"exp": now.Add(time.Minute * time.Duration(config.REDIS_TIMEOUT)).Unix(),
string(jwtclaimenum.EMAIL): data.Email,
string(jwtclaimenum.ROLE): data.Role,
string(jwtclaimenum.SESSION_ID): data.SessionID,
string(jwtclaimenum.EXPIRED_AT): now.Add(time.Minute * time.Duration(config.REDIS_TIMEOUT)).Unix(),
}
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)
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{
Email: email,
SessionID: sessionId,
Role: role,
}
return data, nil