feat: update staff data

This commit is contained in:
ericprd 2025-03-14 12:41:11 +08:00
parent 1297c71200
commit 11bc19360c
31 changed files with 130 additions and 115 deletions

View File

@ -2,6 +2,7 @@ package staffrepository
import (
"errors"
"fmt"
staffdomain "legalgo-BE-go/internal/domain/staff"
@ -12,12 +13,12 @@ func (sr *accessor) GetStaffByEmail(email string) (*staffdomain.Staff, error) {
var staff staffdomain.Staff
if email == "" {
return nil, errors.New("email is required")
return nil, fmt.Errorf("email is required")
}
if err := sr.db.First(&staff, "email = ?", email).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, errors.New("staff not found")
return nil, fmt.Errorf("staff not found")
}
return nil, err
}

View File

@ -2,6 +2,7 @@ package staffrepository
import (
"errors"
"fmt"
staffdomain "legalgo-BE-go/internal/domain/staff"
"gorm.io/gorm"
@ -11,12 +12,12 @@ func (sr *accessor) GetStaffByID(ID string) (*staffdomain.Staff, error) {
var staff staffdomain.Staff
if ID == "" {
return nil, errors.New("id is required")
return nil, fmt.Errorf("id is required")
}
if err := sr.db.First(&staff, "id = ? ", ID).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, errors.New("staff not found")
return nil, fmt.Errorf("staff not found")
}
return nil, err
}

View File

@ -2,16 +2,15 @@ package staffrepository
import (
staffdomain "legalgo-BE-go/internal/domain/staff"
"legalgo-BE-go/internal/utilities/utils"
)
func (ur *accessor) Update(spec staffdomain.Staff) error {
val, err := utils.StructToMap(spec)
if err != nil {
return err
}
// val, err := utils.StructToMap(spec)
// if err != nil {
// return err
// }
if err := ur.db.Model(&staffdomain.Staff{}).Where("id = ?", spec.ID).Updates(val).Error; err != nil {
if err := ur.db.Model(&staffdomain.Staff{}).Where("id = ?", spec.ID).Updates(spec).Error; err != nil {
return err
}

View File

@ -2,6 +2,7 @@ package subscribeplanrepository
import (
"errors"
"fmt"
subscribeplandomain "legalgo-BE-go/internal/domain/subscribe_plan"
"gorm.io/gorm"
@ -12,7 +13,7 @@ func (s *accessor) GetByID(id string) (*subscribeplandomain.SubscribePlan, error
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, fmt.Errorf("subscribe plan not found")
}
return subscribePlan, err
}

View File

@ -2,6 +2,7 @@ package userrepository
import (
"errors"
"fmt"
userdomain "legalgo-BE-go/internal/domain/user"
"gorm.io/gorm"
@ -11,12 +12,12 @@ func (ur *accessor) GetUserByEmail(email string) (*userdomain.User, error) {
var user *userdomain.User
if email == "" {
return nil, errors.New("email is empty")
return nil, fmt.Errorf("email is empty")
}
if err := ur.db.First(&user, "email = ?", email).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, errors.New("user not found")
return nil, fmt.Errorf("user not found")
}
return nil, err
}

View File

@ -1,8 +1,7 @@
package userrepository
import (
"errors"
"fmt"
userdomain "legalgo-BE-go/internal/domain/user"
)
@ -10,7 +9,7 @@ func (ur *accessor) GetUserByID(id string) (*userdomain.User, error) {
var user userdomain.User
if id == "" {
return nil, errors.New("id is empty")
return nil, fmt.Errorf("id is empty")
}
if err := ur.db.

View File

@ -1,7 +1,7 @@
package userrepository
import (
"errors"
"fmt"
userdomain "legalgo-BE-go/internal/domain/user"
)
@ -9,7 +9,7 @@ func (ur *accessor) GetUserProfile(email string) (*userdomain.UserProfile, error
var user *userdomain.User
if email == "" {
return nil, errors.New("email is empty")
return nil, fmt.Errorf("email is empty")
}
if err := ur.db.

View File

@ -4,8 +4,8 @@ import (
"fmt"
authmiddleware "legalgo-BE-go/internal/api/http/middleware/auth"
newsdomain "legalgo-BE-go/internal/domain/news"
authsvc "legalgo-BE-go/internal/services/auth"
newssvc "legalgo-BE-go/internal/services/news"
staffsvc "legalgo-BE-go/internal/services/staffsvc"
"legalgo-BE-go/internal/utilities/response"
"legalgo-BE-go/internal/utilities/utils"
"net/http"
@ -16,7 +16,7 @@ import (
func Update(
router chi.Router,
newsSvc newssvc.News,
authSvc authsvc.Auth,
authSvc staffsvc.Auth,
) {
router.With(authmiddleware.Authorize()).
Put("/news/{news_id}/update", func(w http.ResponseWriter, r *http.Request) {
@ -48,7 +48,7 @@ func Update(
return
}
staff, err := authSvc.GetStaffProfile(destructedToken.Email)
staff, err := authSvc.GetProfile(destructedToken.Email)
if err != nil {
response.ResponseWithErrorCode(
ctx,

View File

@ -5,7 +5,7 @@ import (
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"
staffhttp "legalgo-BE-go/internal/api/http/staff"
subscribehttp "legalgo-BE-go/internal/api/http/subscribe"
subscribeplanhttp "legalgo-BE-go/internal/api/http/subscribe_plan"
taghttp "legalgo-BE-go/internal/api/http/tag"

View File

@ -2,7 +2,7 @@ package staffhttp
import (
authmiddleware "legalgo-BE-go/internal/api/http/middleware/auth"
authsvc "legalgo-BE-go/internal/services/auth"
staffsvc "legalgo-BE-go/internal/services/staffsvc"
"legalgo-BE-go/internal/utilities/response"
"legalgo-BE-go/internal/utilities/utils"
"net/http"
@ -12,7 +12,7 @@ import (
func GetUsers(
router chi.Router,
authSvc authsvc.Auth,
authSvc staffsvc.Auth,
) {
router.With(authmiddleware.Authorize()).Get("/staff/users", func(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()

View File

@ -5,7 +5,7 @@ import (
responsedomain "legalgo-BE-go/internal/domain/reponse"
staffdomain "legalgo-BE-go/internal/domain/staff"
authsvc "legalgo-BE-go/internal/services/auth"
staffsvc "legalgo-BE-go/internal/services/staffsvc"
"legalgo-BE-go/internal/utilities/response"
"legalgo-BE-go/internal/utilities/utils"
@ -16,7 +16,7 @@ import (
func Login(
router chi.Router,
authSvc authsvc.Auth,
authSvc staffsvc.Auth,
validate *validator.Validate,
rdb *redis.Client,
) {
@ -49,7 +49,7 @@ func Login(
return
}
token, err := authSvc.LoginAsStaff(spec)
token, err := authSvc.Login(spec)
if err != nil {
response.ResponseWithErrorCode(
ctx,

View File

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

View File

@ -5,7 +5,7 @@ import (
responsedomain "legalgo-BE-go/internal/domain/reponse"
staffdomain "legalgo-BE-go/internal/domain/staff"
authsvc "legalgo-BE-go/internal/services/auth"
staffsvc "legalgo-BE-go/internal/services/staffsvc"
"legalgo-BE-go/internal/utilities/response"
"legalgo-BE-go/internal/utilities/utils"
@ -17,7 +17,7 @@ import (
func Register(
router chi.Router,
validate *validator.Validate,
authSvc authsvc.Auth,
authSvc staffsvc.Auth,
rdb *redis.Client,
) {
router.Post("/staff/register", func(w http.ResponseWriter, r *http.Request) {
@ -49,7 +49,7 @@ func Register(
return
}
token, err := authSvc.RegisterStaff(spec)
token, err := authSvc.Register(spec)
if err != nil {
response.ResponseWithErrorCode(
ctx,

View File

@ -1,9 +1,8 @@
package staffhttp
import (
"errors"
staffdomain "legalgo-BE-go/internal/domain/staff"
authsvc "legalgo-BE-go/internal/services/auth"
staffsvc "legalgo-BE-go/internal/services/staffsvc"
"legalgo-BE-go/internal/utilities/response"
"legalgo-BE-go/internal/utilities/utils"
"net/http"
@ -13,25 +12,25 @@ import (
func Update(
router chi.Router,
authSvc authsvc.Auth,
authSvc staffsvc.Auth,
) {
router.Patch("/staff/{id}/update", func(w http.ResponseWriter, r *http.Request) {
router.Put("/staff/update", func(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
id := chi.URLParam(r, "id")
if id == "" {
destructedToken, err := utils.GetTokenDetail(r)
if err != nil {
response.ResponseWithErrorCode(
ctx,
w,
errors.New("provided id is empty"),
err,
response.ErrBadRequest.Code,
response.ErrBadRequest.HttpCode,
"required params is not provided",
err.Error(),
)
return
}
var spec staffdomain.StaffRegister
var spec staffdomain.StaffUpdate
if err := utils.UnmarshalBody(r, &spec); err != nil {
response.ResponseWithErrorCode(
@ -45,14 +44,7 @@ func Update(
return
}
staff := staffdomain.Staff{
ID: id,
Email: spec.Email,
Password: spec.Password,
Name: spec.Name,
}
if err := authSvc.UpdateStaff(staff); err != nil {
if err := authSvc.Update(destructedToken.ID, spec); err != nil {
response.ResponseWithErrorCode(
ctx,
w,

View File

@ -4,4 +4,5 @@ type AuthToken struct {
Email string
SessionID string
Role string
ID string
}

View File

@ -15,6 +15,12 @@ type StaffRegister struct {
ProfilePicture string `json:"profile_picture"`
}
type StaffUpdate struct {
Email string `json:"email" validate:"required"`
Name string `json:"name" validate:"required"`
ProfilePicture string `json:"profile_picture"`
}
type StaffProfile struct {
ID string `json:"id"`
Name string `json:"name"`

View File

@ -10,4 +10,5 @@ const (
ISSUED_AT JWTClaim = "iat"
RESOURCES JWTClaim = "resources"
ROLE JWTClaim = "role"
ID JWTClaim = "skb"
)

View File

@ -1,17 +0,0 @@
package authsvc
import (
staffdomain "legalgo-BE-go/internal/domain/staff"
)
func (as *impl) UpdateStaff(spec staffdomain.Staff) error {
if _, err := as.staffRepo.GetStaffByID(spec.ID); err != nil {
return err
}
if err := as.staffRepo.Update(spec); err != nil {
return err
}
return nil
}

View File

@ -2,10 +2,10 @@ package services
import (
adssvc "legalgo-BE-go/internal/services/ads"
serviceauth "legalgo-BE-go/internal/services/auth"
categorysvc "legalgo-BE-go/internal/services/category"
newssvc "legalgo-BE-go/internal/services/news"
"legalgo-BE-go/internal/services/oss"
staffsvc "legalgo-BE-go/internal/services/staffsvc"
subscribesvc "legalgo-BE-go/internal/services/subscribe"
subscribeplansvc "legalgo-BE-go/internal/services/subscribe_plan"
tagsvc "legalgo-BE-go/internal/services/tag"
@ -16,7 +16,7 @@ import (
var Module = fx.Module("services",
fx.Provide(
serviceauth.New,
staffsvc.New,
subscribeplansvc.New,
subscribesvc.New,
tagsvc.New,

View File

@ -1,10 +1,10 @@
package authsvc
package staffsvc
import (
staffdomain "legalgo-BE-go/internal/domain/staff"
)
func (as *impl) GetStaffProfile(email string) (*staffdomain.StaffProfile, error) {
func (as *impl) GetProfile(email string) (*staffdomain.StaffProfile, error) {
staff, err := as.staffRepo.GetStaffByEmail(email)
if err != nil {
return nil, err

View File

@ -1,4 +1,4 @@
package authsvc
package staffsvc
import userdomain "legalgo-BE-go/internal/domain/user"

View File

@ -1,4 +1,4 @@
package authsvc
package staffsvc
import (
staffrepository "legalgo-BE-go/internal/accessor/staff"
@ -17,11 +17,11 @@ type impl struct {
}
type Auth interface {
LoginAsStaff(staffdomain.StaffLogin) (string, error)
RegisterStaff(staffdomain.StaffRegister) (string, error)
GetStaffProfile(string) (*staffdomain.StaffProfile, error)
Login(staffdomain.StaffLogin) (string, error)
Register(staffdomain.StaffRegister) (string, error)
GetProfile(string) (*staffdomain.StaffProfile, error)
GetUsers() ([]userdomain.UserProfile, error)
UpdateStaff(staffdomain.Staff) error
Update(string, staffdomain.StaffUpdate) error
}
func New(

View File

@ -1,8 +1,7 @@
package authsvc
package staffsvc
import (
"errors"
"fmt"
authdomain "legalgo-BE-go/internal/domain/auth"
staffdomain "legalgo-BE-go/internal/domain/staff"
"legalgo-BE-go/internal/utilities/utils"
@ -10,26 +9,27 @@ import (
"github.com/google/uuid"
)
func (sv *impl) LoginAsStaff(spec staffdomain.StaffLogin) (string, error) {
func (sv *impl) Login(spec staffdomain.StaffLogin) (string, error) {
staff, err := sv.staffRepo.GetStaffByEmail(spec.Email)
if err != nil {
return "", errors.New(err.Error())
return "", err
}
matchPassword := utils.ComparePassword(staff.Password, spec.Password)
if !matchPassword {
return "", errors.New("wrong password")
return "", fmt.Errorf("wrong password")
}
authToken := authdomain.AuthToken{
Email: staff.Email,
SessionID: uuid.NewString(),
Role: "staff",
ID: staff.ID,
}
token, err := utils.GenerateToken(authToken)
if err != nil {
return "", errors.New(err.Error())
return "", err
}
return token, nil

View File

@ -1,8 +1,7 @@
package authsvc
package staffsvc
import (
"errors"
"fmt"
authdomain "legalgo-BE-go/internal/domain/auth"
staffdomain "legalgo-BE-go/internal/domain/staff"
"legalgo-BE-go/internal/utilities/utils"
@ -10,10 +9,10 @@ import (
"github.com/google/uuid"
)
func (a *impl) RegisterStaff(spec staffdomain.StaffRegister) (string, error) {
func (a *impl) Register(spec staffdomain.StaffRegister) (string, error) {
_, err := a.staffRepo.GetStaffByEmail(spec.Email)
if err == nil {
return "", errors.New("this email address is already in use")
return "", fmt.Errorf("this email address is already in use")
}
hashedPwd, err := utils.HashPassword(spec.Password)
if err != nil {
@ -30,18 +29,19 @@ func (a *impl) RegisterStaff(spec staffdomain.StaffRegister) (string, error) {
err = a.staffRepo.Create(staff)
if err != nil {
return "", errors.New(err.Error())
return "", err
}
authToken := authdomain.AuthToken{
Email: staff.Email,
SessionID: uuid.NewString(),
Role: "staff",
ID: staff.ID,
}
token, err := utils.GenerateToken(authToken)
if err != nil {
return "", errors.New(err.Error())
return "", err
}
return token, nil
}

View File

@ -0,0 +1,24 @@
package staffsvc
import (
staffdomain "legalgo-BE-go/internal/domain/staff"
)
func (as *impl) Update(id string, spec staffdomain.StaffUpdate) error {
if _, err := as.staffRepo.GetStaffByID(id); err != nil {
return err
}
newSpec := staffdomain.Staff{
ID: id,
Email: spec.Email,
Name: spec.Name,
ProfilePicture: spec.ProfilePicture,
}
if err := as.staffRepo.Update(newSpec); err != nil {
return err
}
return nil
}

View File

@ -1,8 +1,7 @@
package usersvc
import (
"errors"
"fmt"
authdomain "legalgo-BE-go/internal/domain/auth"
userdomain "legalgo-BE-go/internal/domain/user"
"legalgo-BE-go/internal/utilities/utils"
@ -13,23 +12,24 @@ import (
func (i *impl) LoginAsUser(spec userdomain.UserLogin) (string, error) {
user, err := i.userRepo.GetUserByEmail(spec.Email)
if err != nil {
return "", errors.New(err.Error())
return "", err
}
matchPassword := utils.ComparePassword(user.Password, spec.Password)
if !matchPassword {
return "", errors.New("wrong password")
return "", fmt.Errorf("wrong password")
}
authToken := authdomain.AuthToken{
Email: user.Email,
SessionID: uuid.NewString(),
Role: "user",
ID: user.ID,
}
token, err := utils.GenerateToken(authToken)
if err != nil {
return "", errors.New(err.Error())
return "", err
}
return token, nil

View File

@ -1,8 +1,7 @@
package usersvc
import (
"errors"
"fmt"
authdomain "legalgo-BE-go/internal/domain/auth"
userdomain "legalgo-BE-go/internal/domain/user"
"legalgo-BE-go/internal/utilities/utils"
@ -14,7 +13,7 @@ func (i *impl) RegisterUser(spec userdomain.UserRegister) (string, error) {
_, err := i.userRepo.GetUserByEmail(spec.Email)
if err == nil {
return "", errors.New("this email address is already in use")
return "", fmt.Errorf("this email address is already in use")
}
if spec.SubscribePlanID == "" {
@ -28,7 +27,7 @@ func (i *impl) RegisterUser(spec userdomain.UserRegister) (string, error) {
_, err = i.subsPlanRepo.GetByID(spec.SubscribePlanID)
if err != nil {
return "", errors.New(err.Error())
return "", err
}
subsId, err := i.subsRepo.Create(spec.SubscribePlanID)
@ -51,18 +50,19 @@ func (i *impl) RegisterUser(spec userdomain.UserRegister) (string, error) {
err = i.userRepo.CreateUser(user)
if err != nil {
return "", errors.New(err.Error())
return "", fmt.Errorf(err.Error())
}
authToken := authdomain.AuthToken{
Email: user.Email,
SessionID: uuid.NewString(),
Role: "user",
ID: user.ID,
}
token, err := utils.GenerateToken(authToken)
if err != nil {
return "", errors.New(err.Error())
return "", fmt.Errorf(err.Error())
}
return token, nil
}

View File

@ -1,7 +1,7 @@
package utils
import (
"errors"
"fmt"
authdomain "legalgo-BE-go/internal/domain/auth"
"net/http"
"strings"
@ -13,16 +13,16 @@ func GetTokenDetail(r *http.Request) (authdomain.AuthToken, error) {
var data authdomain.AuthToken
if authHeader == "" {
return data, errors.New("unauthorized")
return data, fmt.Errorf("unauthorized")
}
if !strings.HasPrefix(authHeader, "Bearer") {
return data, errors.New("invalid token")
return data, fmt.Errorf("invalid token")
}
token := strings.Split(authHeader, " ")
if len(token) < 2 {
return data, errors.New("invalid token")
return data, fmt.Errorf("invalid token")
}
data, err := DestructToken(token[1])

View File

@ -1,7 +1,6 @@
package utils
import (
"errors"
"fmt"
"time"
@ -37,6 +36,7 @@ func GenerateToken(data authdomain.AuthToken) (string, error) {
string(jwtclaimenum.EMAIL): data.Email,
string(jwtclaimenum.ROLE): data.Role,
string(jwtclaimenum.SESSION_ID): data.SessionID,
string(jwtclaimenum.ID): data.ID,
string(jwtclaimenum.EXPIRED_AT): now.Add(time.Minute * time.Duration(config.REDIS_TIMEOUT)).Unix(),
}
@ -66,32 +66,38 @@ func DestructToken(s string) (authdomain.AuthToken, error) {
claims, ok := token.Claims.(jwt.MapClaims)
if !ok {
return data, errors.New("failed to parse token")
return data, fmt.Errorf("failed to parse token")
}
if !token.Valid {
return data, errors.New("invalid token")
return data, fmt.Errorf("invalid token")
}
email, ok := claims[string(jwtclaimenum.EMAIL)].(string)
if !ok {
return data, errors.New("invalid email")
return data, fmt.Errorf("invalid email")
}
sessionId, ok := claims[string(jwtclaimenum.SESSION_ID)].(string)
if !ok {
return data, errors.New("invalid session_id")
return data, fmt.Errorf("invalid session_id")
}
role, ok := claims[string(jwtclaimenum.ROLE)].(string)
if !ok {
return data, errors.New("invalid role")
return data, fmt.Errorf("invalid role")
}
id, ok := claims[string(jwtclaimenum.ID)].(string)
if !ok {
return data, fmt.Errorf("invalid id")
}
data = authdomain.AuthToken{
Email: email,
SessionID: sessionId,
Role: role,
ID: id,
}
return data, nil

View File

@ -1,7 +1,7 @@
package utils
import (
"errors"
"fmt"
"reflect"
)
@ -11,14 +11,14 @@ func StructToMap(s any) (map[string]any, error) {
val := reflect.ValueOf(s)
if val.Kind() != reflect.Struct {
return nil, errors.New("provided value is not struct")
return nil, fmt.Errorf("provided value is not struct")
}
for i := range val.NumField() {
field := val.Type().Field(i)
value := val.Field(i)
if value.IsZero() || value.IsNil() {
if !value.IsValid() {
continue
}