Compare commits
No commits in common. "ee8e8e140d6fd42b452751b6507c90b8156c45e7" and "1297c71200aef4b43fe8999dc915fbe0372120f3" have entirely different histories.
ee8e8e140d
...
1297c71200
@ -2,7 +2,6 @@ package staffrepository
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
|
||||||
|
|
||||||
staffdomain "legalgo-BE-go/internal/domain/staff"
|
staffdomain "legalgo-BE-go/internal/domain/staff"
|
||||||
|
|
||||||
@ -13,12 +12,12 @@ func (sr *accessor) GetStaffByEmail(email string) (*staffdomain.Staff, error) {
|
|||||||
var staff staffdomain.Staff
|
var staff staffdomain.Staff
|
||||||
|
|
||||||
if email == "" {
|
if email == "" {
|
||||||
return nil, fmt.Errorf("email is required")
|
return nil, errors.New("email is required")
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := sr.db.First(&staff, "email = ?", email).Error; err != nil {
|
if err := sr.db.First(&staff, "email = ?", email).Error; err != nil {
|
||||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||||
return nil, fmt.Errorf("staff not found")
|
return nil, errors.New("staff not found")
|
||||||
}
|
}
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,7 +2,6 @@ package staffrepository
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
|
||||||
staffdomain "legalgo-BE-go/internal/domain/staff"
|
staffdomain "legalgo-BE-go/internal/domain/staff"
|
||||||
|
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
@ -12,12 +11,12 @@ func (sr *accessor) GetStaffByID(ID string) (*staffdomain.Staff, error) {
|
|||||||
var staff staffdomain.Staff
|
var staff staffdomain.Staff
|
||||||
|
|
||||||
if ID == "" {
|
if ID == "" {
|
||||||
return nil, fmt.Errorf("id is required")
|
return nil, errors.New("id is required")
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := sr.db.First(&staff, "id = ? ", ID).Error; err != nil {
|
if err := sr.db.First(&staff, "id = ? ", ID).Error; err != nil {
|
||||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||||
return nil, fmt.Errorf("staff not found")
|
return nil, errors.New("staff not found")
|
||||||
}
|
}
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,15 +2,16 @@ package staffrepository
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
staffdomain "legalgo-BE-go/internal/domain/staff"
|
staffdomain "legalgo-BE-go/internal/domain/staff"
|
||||||
|
"legalgo-BE-go/internal/utilities/utils"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (ur *accessor) 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
|
||||||
// }
|
}
|
||||||
|
|
||||||
if err := ur.db.Model(&staffdomain.Staff{}).Where("id = ?", spec.ID).Updates(spec).Error; err != nil {
|
if err := ur.db.Model(&staffdomain.Staff{}).Where("id = ?", spec.ID).Updates(val).Error; err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -2,7 +2,6 @@ package subscribeplanrepository
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
|
||||||
subscribeplandomain "legalgo-BE-go/internal/domain/subscribe_plan"
|
subscribeplandomain "legalgo-BE-go/internal/domain/subscribe_plan"
|
||||||
|
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
@ -13,7 +12,7 @@ func (s *accessor) GetByID(id string) (*subscribeplandomain.SubscribePlan, error
|
|||||||
|
|
||||||
if err := s.db.First(&subscribePlan, "id = ? ", id).Error; err != nil {
|
if err := s.db.First(&subscribePlan, "id = ? ", id).Error; err != nil {
|
||||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||||
return subscribePlan, fmt.Errorf("subscribe plan not found")
|
return subscribePlan, errors.New("subscribe plan not found")
|
||||||
}
|
}
|
||||||
return subscribePlan, err
|
return subscribePlan, err
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,7 +2,6 @@ package userrepository
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
|
||||||
userdomain "legalgo-BE-go/internal/domain/user"
|
userdomain "legalgo-BE-go/internal/domain/user"
|
||||||
|
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
@ -12,12 +11,12 @@ func (ur *accessor) GetUserByEmail(email string) (*userdomain.User, error) {
|
|||||||
var user *userdomain.User
|
var user *userdomain.User
|
||||||
|
|
||||||
if email == "" {
|
if email == "" {
|
||||||
return nil, fmt.Errorf("email is empty")
|
return nil, errors.New("email is empty")
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := ur.db.First(&user, "email = ?", email).Error; err != nil {
|
if err := ur.db.First(&user, "email = ?", email).Error; err != nil {
|
||||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||||
return nil, fmt.Errorf("user not found")
|
return nil, errors.New("user not found")
|
||||||
}
|
}
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,7 +1,8 @@
|
|||||||
package userrepository
|
package userrepository
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"errors"
|
||||||
|
|
||||||
userdomain "legalgo-BE-go/internal/domain/user"
|
userdomain "legalgo-BE-go/internal/domain/user"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -9,7 +10,7 @@ func (ur *accessor) GetUserByID(id string) (*userdomain.User, error) {
|
|||||||
var user userdomain.User
|
var user userdomain.User
|
||||||
|
|
||||||
if id == "" {
|
if id == "" {
|
||||||
return nil, fmt.Errorf("id is empty")
|
return nil, errors.New("id is empty")
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := ur.db.
|
if err := ur.db.
|
||||||
|
|||||||
@ -1,21 +1,21 @@
|
|||||||
package userrepository
|
package userrepository
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"errors"
|
||||||
userdomain "legalgo-BE-go/internal/domain/user"
|
userdomain "legalgo-BE-go/internal/domain/user"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (ur *accessor) GetUserProfile(id string) (*userdomain.UserProfile, error) {
|
func (ur *accessor) GetUserProfile(email string) (*userdomain.UserProfile, error) {
|
||||||
var user *userdomain.User
|
var user *userdomain.User
|
||||||
|
|
||||||
if id == "" {
|
if email == "" {
|
||||||
return nil, fmt.Errorf("email is empty")
|
return nil, errors.New("email is empty")
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := ur.db.
|
if err := ur.db.
|
||||||
Preload("Subscribe").
|
Preload("Subscribe").
|
||||||
Preload("Subscribe.SubscribePlan").
|
Preload("Subscribe.SubscribePlan").
|
||||||
First(&user, "id = ?", id).
|
First(&user, "email = ?", email).
|
||||||
Error; err != nil {
|
Error; err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
@ -59,7 +59,20 @@ func Create(
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := newsSvc.Create(spec, destructedToken.ID); err != nil {
|
staffProfile, err := staffRepo.GetStaffByEmail(destructedToken.Email)
|
||||||
|
if err != nil {
|
||||||
|
response.ResponseWithErrorCode(
|
||||||
|
ctx,
|
||||||
|
w,
|
||||||
|
err,
|
||||||
|
response.ErrBadRequest.Code,
|
||||||
|
response.ErrBadRequest.HttpCode,
|
||||||
|
err.Error(),
|
||||||
|
)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := newsSvc.Create(spec, staffProfile.ID); err != nil {
|
||||||
response.ResponseWithErrorCode(
|
response.ResponseWithErrorCode(
|
||||||
ctx,
|
ctx,
|
||||||
w,
|
w,
|
||||||
|
|||||||
@ -4,8 +4,8 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
authmiddleware "legalgo-BE-go/internal/api/http/middleware/auth"
|
authmiddleware "legalgo-BE-go/internal/api/http/middleware/auth"
|
||||||
newsdomain "legalgo-BE-go/internal/domain/news"
|
newsdomain "legalgo-BE-go/internal/domain/news"
|
||||||
|
authsvc "legalgo-BE-go/internal/services/auth"
|
||||||
newssvc "legalgo-BE-go/internal/services/news"
|
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/response"
|
||||||
"legalgo-BE-go/internal/utilities/utils"
|
"legalgo-BE-go/internal/utilities/utils"
|
||||||
"net/http"
|
"net/http"
|
||||||
@ -16,7 +16,7 @@ import (
|
|||||||
func Update(
|
func Update(
|
||||||
router chi.Router,
|
router chi.Router,
|
||||||
newsSvc newssvc.News,
|
newsSvc newssvc.News,
|
||||||
authSvc staffsvc.Auth,
|
authSvc authsvc.Auth,
|
||||||
) {
|
) {
|
||||||
router.With(authmiddleware.Authorize()).
|
router.With(authmiddleware.Authorize()).
|
||||||
Put("/news/{news_id}/update", func(w http.ResponseWriter, r *http.Request) {
|
Put("/news/{news_id}/update", func(w http.ResponseWriter, r *http.Request) {
|
||||||
@ -48,6 +48,19 @@ func Update(
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
staff, err := authSvc.GetStaffProfile(destructedToken.Email)
|
||||||
|
if err != nil {
|
||||||
|
response.ResponseWithErrorCode(
|
||||||
|
ctx,
|
||||||
|
w,
|
||||||
|
err,
|
||||||
|
response.ErrBadRequest.Code,
|
||||||
|
response.ErrBadRequest.HttpCode,
|
||||||
|
err.Error(),
|
||||||
|
)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
var spec newsdomain.NewsUpdate
|
var spec newsdomain.NewsUpdate
|
||||||
if err := utils.UnmarshalBody(r, &spec); err != nil {
|
if err := utils.UnmarshalBody(r, &spec); err != nil {
|
||||||
response.ResponseWithErrorCode(
|
response.ResponseWithErrorCode(
|
||||||
@ -63,7 +76,7 @@ func Update(
|
|||||||
|
|
||||||
spec.ID = newsID
|
spec.ID = newsID
|
||||||
|
|
||||||
if err := newsSvc.Update(destructedToken.ID, spec); err != nil {
|
if err := newsSvc.Update(staff.ID, spec); err != nil {
|
||||||
response.ResponseWithErrorCode(
|
response.ResponseWithErrorCode(
|
||||||
ctx,
|
ctx,
|
||||||
w,
|
w,
|
||||||
|
|||||||
@ -5,7 +5,7 @@ import (
|
|||||||
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/staff"
|
staffhttp "legalgo-BE-go/internal/api/http/staffhttp"
|
||||||
subscribehttp "legalgo-BE-go/internal/api/http/subscribe"
|
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"
|
||||||
|
|||||||
@ -2,7 +2,7 @@ package staffhttp
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
authmiddleware "legalgo-BE-go/internal/api/http/middleware/auth"
|
authmiddleware "legalgo-BE-go/internal/api/http/middleware/auth"
|
||||||
staffsvc "legalgo-BE-go/internal/services/staffsvc"
|
authsvc "legalgo-BE-go/internal/services/auth"
|
||||||
"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"
|
||||||
@ -12,7 +12,7 @@ import (
|
|||||||
|
|
||||||
func GetUsers(
|
func GetUsers(
|
||||||
router chi.Router,
|
router chi.Router,
|
||||||
authSvc staffsvc.Auth,
|
authSvc authsvc.Auth,
|
||||||
) {
|
) {
|
||||||
router.With(authmiddleware.Authorize()).Get("/staff/users", func(w http.ResponseWriter, r *http.Request) {
|
router.With(authmiddleware.Authorize()).Get("/staff/users", func(w http.ResponseWriter, r *http.Request) {
|
||||||
ctx := r.Context()
|
ctx := r.Context()
|
||||||
@ -5,7 +5,7 @@ import (
|
|||||||
|
|
||||||
responsedomain "legalgo-BE-go/internal/domain/reponse"
|
responsedomain "legalgo-BE-go/internal/domain/reponse"
|
||||||
staffdomain "legalgo-BE-go/internal/domain/staff"
|
staffdomain "legalgo-BE-go/internal/domain/staff"
|
||||||
staffsvc "legalgo-BE-go/internal/services/staffsvc"
|
authsvc "legalgo-BE-go/internal/services/auth"
|
||||||
"legalgo-BE-go/internal/utilities/response"
|
"legalgo-BE-go/internal/utilities/response"
|
||||||
"legalgo-BE-go/internal/utilities/utils"
|
"legalgo-BE-go/internal/utilities/utils"
|
||||||
|
|
||||||
@ -16,7 +16,7 @@ import (
|
|||||||
|
|
||||||
func Login(
|
func Login(
|
||||||
router chi.Router,
|
router chi.Router,
|
||||||
authSvc staffsvc.Auth,
|
authSvc authsvc.Auth,
|
||||||
validate *validator.Validate,
|
validate *validator.Validate,
|
||||||
rdb *redis.Client,
|
rdb *redis.Client,
|
||||||
) {
|
) {
|
||||||
@ -49,7 +49,7 @@ func Login(
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
token, err := authSvc.Login(spec)
|
token, err := authSvc.LoginAsStaff(spec)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
response.ResponseWithErrorCode(
|
response.ResponseWithErrorCode(
|
||||||
ctx,
|
ctx,
|
||||||
@ -1,7 +1,7 @@
|
|||||||
package staffhttp
|
package staffhttp
|
||||||
|
|
||||||
import (
|
import (
|
||||||
staffsvc "legalgo-BE-go/internal/services/staffsvc"
|
authsvc "legalgo-BE-go/internal/services/auth"
|
||||||
"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 staffsvc.Auth,
|
authSvc authsvc.Auth,
|
||||||
) {
|
) {
|
||||||
router.Get("/staff/profile", func(w http.ResponseWriter, r *http.Request) {
|
router.Get("/staff/profile", func(w http.ResponseWriter, r *http.Request) {
|
||||||
ctx := r.Context()
|
ctx := r.Context()
|
||||||
@ -28,7 +28,7 @@ func GetProfile(
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
staffProfile, err := authSvc.GetProfile(destructedToken.ID)
|
staffProfile, err := authSvc.GetStaffProfile(destructedToken.Email)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
response.ResponseWithErrorCode(
|
response.ResponseWithErrorCode(
|
||||||
ctx,
|
ctx,
|
||||||
@ -5,7 +5,7 @@ import (
|
|||||||
|
|
||||||
responsedomain "legalgo-BE-go/internal/domain/reponse"
|
responsedomain "legalgo-BE-go/internal/domain/reponse"
|
||||||
staffdomain "legalgo-BE-go/internal/domain/staff"
|
staffdomain "legalgo-BE-go/internal/domain/staff"
|
||||||
staffsvc "legalgo-BE-go/internal/services/staffsvc"
|
authsvc "legalgo-BE-go/internal/services/auth"
|
||||||
"legalgo-BE-go/internal/utilities/response"
|
"legalgo-BE-go/internal/utilities/response"
|
||||||
"legalgo-BE-go/internal/utilities/utils"
|
"legalgo-BE-go/internal/utilities/utils"
|
||||||
|
|
||||||
@ -17,7 +17,7 @@ import (
|
|||||||
func Register(
|
func Register(
|
||||||
router chi.Router,
|
router chi.Router,
|
||||||
validate *validator.Validate,
|
validate *validator.Validate,
|
||||||
authSvc staffsvc.Auth,
|
authSvc authsvc.Auth,
|
||||||
rdb *redis.Client,
|
rdb *redis.Client,
|
||||||
) {
|
) {
|
||||||
router.Post("/staff/register", func(w http.ResponseWriter, r *http.Request) {
|
router.Post("/staff/register", func(w http.ResponseWriter, r *http.Request) {
|
||||||
@ -49,7 +49,7 @@ func Register(
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
token, err := authSvc.Register(spec)
|
token, err := authSvc.RegisterStaff(spec)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
response.ResponseWithErrorCode(
|
response.ResponseWithErrorCode(
|
||||||
ctx,
|
ctx,
|
||||||
@ -1,8 +1,9 @@
|
|||||||
package staffhttp
|
package staffhttp
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
staffdomain "legalgo-BE-go/internal/domain/staff"
|
staffdomain "legalgo-BE-go/internal/domain/staff"
|
||||||
staffsvc "legalgo-BE-go/internal/services/staffsvc"
|
authsvc "legalgo-BE-go/internal/services/auth"
|
||||||
"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"
|
||||||
@ -12,25 +13,25 @@ import (
|
|||||||
|
|
||||||
func Update(
|
func Update(
|
||||||
router chi.Router,
|
router chi.Router,
|
||||||
authSvc staffsvc.Auth,
|
authSvc authsvc.Auth,
|
||||||
) {
|
) {
|
||||||
router.Put("/staff/update", func(w http.ResponseWriter, r *http.Request) {
|
router.Patch("/staff/{id}/update", func(w http.ResponseWriter, r *http.Request) {
|
||||||
ctx := r.Context()
|
ctx := r.Context()
|
||||||
|
|
||||||
destructedToken, err := utils.GetTokenDetail(r)
|
id := chi.URLParam(r, "id")
|
||||||
if err != nil {
|
if id == "" {
|
||||||
response.ResponseWithErrorCode(
|
response.ResponseWithErrorCode(
|
||||||
ctx,
|
ctx,
|
||||||
w,
|
w,
|
||||||
err,
|
errors.New("provided id is empty"),
|
||||||
response.ErrBadRequest.Code,
|
response.ErrBadRequest.Code,
|
||||||
response.ErrBadRequest.HttpCode,
|
response.ErrBadRequest.HttpCode,
|
||||||
err.Error(),
|
"required params is not provided",
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
var spec staffdomain.StaffUpdate
|
var spec staffdomain.StaffRegister
|
||||||
|
|
||||||
if err := utils.UnmarshalBody(r, &spec); err != nil {
|
if err := utils.UnmarshalBody(r, &spec); err != nil {
|
||||||
response.ResponseWithErrorCode(
|
response.ResponseWithErrorCode(
|
||||||
@ -44,7 +45,14 @@ func Update(
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := authSvc.Update(destructedToken.ID, spec); err != nil {
|
staff := staffdomain.Staff{
|
||||||
|
ID: id,
|
||||||
|
Email: spec.Email,
|
||||||
|
Password: spec.Password,
|
||||||
|
Name: spec.Name,
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := authSvc.UpdateStaff(staff); err != nil {
|
||||||
response.ResponseWithErrorCode(
|
response.ResponseWithErrorCode(
|
||||||
ctx,
|
ctx,
|
||||||
w,
|
w,
|
||||||
@ -60,7 +60,7 @@ func Update(
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
user, err := userRepo.GetUserProfile(detail.ID)
|
user, err := userRepo.GetUserProfile(detail.Email)
|
||||||
|
|
||||||
body.ID = user.Subscribe.ID
|
body.ID = user.Subscribe.ID
|
||||||
|
|
||||||
|
|||||||
@ -28,7 +28,7 @@ func GetProfile(
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
userProfile, err := userSvc.GetUserProfile(destructedToken.ID)
|
userProfile, err := userSvc.GetUserProfile(destructedToken.Email)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
response.ResponseWithErrorCode(
|
response.ResponseWithErrorCode(
|
||||||
ctx,
|
ctx,
|
||||||
|
|||||||
@ -4,5 +4,4 @@ type AuthToken struct {
|
|||||||
Email string
|
Email string
|
||||||
SessionID string
|
SessionID string
|
||||||
Role string
|
Role string
|
||||||
ID string
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -15,12 +15,6 @@ type StaffRegister struct {
|
|||||||
ProfilePicture string `json:"profile_picture"`
|
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 {
|
type StaffProfile struct {
|
||||||
ID string `json:"id"`
|
ID string `json:"id"`
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
|
|||||||
@ -10,5 +10,4 @@ const (
|
|||||||
ISSUED_AT JWTClaim = "iat"
|
ISSUED_AT JWTClaim = "iat"
|
||||||
RESOURCES JWTClaim = "resources"
|
RESOURCES JWTClaim = "resources"
|
||||||
ROLE JWTClaim = "role"
|
ROLE JWTClaim = "role"
|
||||||
ID JWTClaim = "skb"
|
|
||||||
)
|
)
|
||||||
|
|||||||
@ -1,11 +1,11 @@
|
|||||||
package staffsvc
|
package authsvc
|
||||||
|
|
||||||
import (
|
import (
|
||||||
staffdomain "legalgo-BE-go/internal/domain/staff"
|
staffdomain "legalgo-BE-go/internal/domain/staff"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (as *impl) GetProfile(id string) (*staffdomain.StaffProfile, error) {
|
func (as *impl) GetStaffProfile(email string) (*staffdomain.StaffProfile, error) {
|
||||||
staff, err := as.staffRepo.GetStaffByID(id)
|
staff, err := as.staffRepo.GetStaffByEmail(email)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package staffsvc
|
package authsvc
|
||||||
|
|
||||||
import userdomain "legalgo-BE-go/internal/domain/user"
|
import userdomain "legalgo-BE-go/internal/domain/user"
|
||||||
|
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package staffsvc
|
package authsvc
|
||||||
|
|
||||||
import (
|
import (
|
||||||
staffrepository "legalgo-BE-go/internal/accessor/staff"
|
staffrepository "legalgo-BE-go/internal/accessor/staff"
|
||||||
@ -17,11 +17,11 @@ type impl struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type Auth interface {
|
type Auth interface {
|
||||||
Login(staffdomain.StaffLogin) (string, error)
|
LoginAsStaff(staffdomain.StaffLogin) (string, error)
|
||||||
Register(staffdomain.StaffRegister) (string, error)
|
RegisterStaff(staffdomain.StaffRegister) (string, error)
|
||||||
GetProfile(string) (*staffdomain.StaffProfile, error)
|
GetStaffProfile(string) (*staffdomain.StaffProfile, error)
|
||||||
GetUsers() ([]userdomain.UserProfile, error)
|
GetUsers() ([]userdomain.UserProfile, error)
|
||||||
Update(string, staffdomain.StaffUpdate) error
|
UpdateStaff(staffdomain.Staff) error
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(
|
func New(
|
||||||
@ -1,7 +1,8 @@
|
|||||||
package staffsvc
|
package authsvc
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"errors"
|
||||||
|
|
||||||
authdomain "legalgo-BE-go/internal/domain/auth"
|
authdomain "legalgo-BE-go/internal/domain/auth"
|
||||||
staffdomain "legalgo-BE-go/internal/domain/staff"
|
staffdomain "legalgo-BE-go/internal/domain/staff"
|
||||||
"legalgo-BE-go/internal/utilities/utils"
|
"legalgo-BE-go/internal/utilities/utils"
|
||||||
@ -9,27 +10,26 @@ import (
|
|||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (sv *impl) Login(spec staffdomain.StaffLogin) (string, error) {
|
func (sv *impl) LoginAsStaff(spec staffdomain.StaffLogin) (string, error) {
|
||||||
staff, err := sv.staffRepo.GetStaffByEmail(spec.Email)
|
staff, err := sv.staffRepo.GetStaffByEmail(spec.Email)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", errors.New(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
matchPassword := utils.ComparePassword(staff.Password, spec.Password)
|
matchPassword := utils.ComparePassword(staff.Password, spec.Password)
|
||||||
if !matchPassword {
|
if !matchPassword {
|
||||||
return "", fmt.Errorf("wrong password")
|
return "", errors.New("wrong password")
|
||||||
}
|
}
|
||||||
|
|
||||||
authToken := authdomain.AuthToken{
|
authToken := authdomain.AuthToken{
|
||||||
Email: staff.Email,
|
Email: staff.Email,
|
||||||
SessionID: uuid.NewString(),
|
SessionID: uuid.NewString(),
|
||||||
Role: "staff",
|
Role: "staff",
|
||||||
ID: staff.ID,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
token, err := utils.GenerateToken(authToken)
|
token, err := utils.GenerateToken(authToken)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", errors.New(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
return token, nil
|
return token, nil
|
||||||
@ -1,7 +1,8 @@
|
|||||||
package staffsvc
|
package authsvc
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"errors"
|
||||||
|
|
||||||
authdomain "legalgo-BE-go/internal/domain/auth"
|
authdomain "legalgo-BE-go/internal/domain/auth"
|
||||||
staffdomain "legalgo-BE-go/internal/domain/staff"
|
staffdomain "legalgo-BE-go/internal/domain/staff"
|
||||||
"legalgo-BE-go/internal/utilities/utils"
|
"legalgo-BE-go/internal/utilities/utils"
|
||||||
@ -9,10 +10,10 @@ import (
|
|||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (a *impl) Register(spec staffdomain.StaffRegister) (string, error) {
|
func (a *impl) RegisterStaff(spec staffdomain.StaffRegister) (string, error) {
|
||||||
_, err := a.staffRepo.GetStaffByEmail(spec.Email)
|
_, err := a.staffRepo.GetStaffByEmail(spec.Email)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
return "", fmt.Errorf("this email address is already in use")
|
return "", errors.New("this email address is already in use")
|
||||||
}
|
}
|
||||||
hashedPwd, err := utils.HashPassword(spec.Password)
|
hashedPwd, err := utils.HashPassword(spec.Password)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -29,19 +30,18 @@ func (a *impl) Register(spec staffdomain.StaffRegister) (string, error) {
|
|||||||
|
|
||||||
err = a.staffRepo.Create(staff)
|
err = a.staffRepo.Create(staff)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", errors.New(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
authToken := authdomain.AuthToken{
|
authToken := authdomain.AuthToken{
|
||||||
Email: staff.Email,
|
Email: staff.Email,
|
||||||
SessionID: uuid.NewString(),
|
SessionID: uuid.NewString(),
|
||||||
Role: "staff",
|
Role: "staff",
|
||||||
ID: staff.ID,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
token, err := utils.GenerateToken(authToken)
|
token, err := utils.GenerateToken(authToken)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", errors.New(err.Error())
|
||||||
}
|
}
|
||||||
return token, nil
|
return token, nil
|
||||||
}
|
}
|
||||||
17
internal/services/auth/update_staff.go
Normal file
17
internal/services/auth/update_staff.go
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
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
|
||||||
|
}
|
||||||
@ -2,10 +2,10 @@ package services
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
adssvc "legalgo-BE-go/internal/services/ads"
|
adssvc "legalgo-BE-go/internal/services/ads"
|
||||||
|
serviceauth "legalgo-BE-go/internal/services/auth"
|
||||||
categorysvc "legalgo-BE-go/internal/services/category"
|
categorysvc "legalgo-BE-go/internal/services/category"
|
||||||
newssvc "legalgo-BE-go/internal/services/news"
|
newssvc "legalgo-BE-go/internal/services/news"
|
||||||
"legalgo-BE-go/internal/services/oss"
|
"legalgo-BE-go/internal/services/oss"
|
||||||
staffsvc "legalgo-BE-go/internal/services/staffsvc"
|
|
||||||
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"
|
||||||
@ -16,7 +16,7 @@ import (
|
|||||||
|
|
||||||
var Module = fx.Module("services",
|
var Module = fx.Module("services",
|
||||||
fx.Provide(
|
fx.Provide(
|
||||||
staffsvc.New,
|
serviceauth.New,
|
||||||
subscribeplansvc.New,
|
subscribeplansvc.New,
|
||||||
subscribesvc.New,
|
subscribesvc.New,
|
||||||
tagsvc.New,
|
tagsvc.New,
|
||||||
|
|||||||
@ -1,24 +0,0 @@
|
|||||||
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
|
|
||||||
}
|
|
||||||
@ -1,7 +1,8 @@
|
|||||||
package usersvc
|
package usersvc
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"errors"
|
||||||
|
|
||||||
authdomain "legalgo-BE-go/internal/domain/auth"
|
authdomain "legalgo-BE-go/internal/domain/auth"
|
||||||
userdomain "legalgo-BE-go/internal/domain/user"
|
userdomain "legalgo-BE-go/internal/domain/user"
|
||||||
"legalgo-BE-go/internal/utilities/utils"
|
"legalgo-BE-go/internal/utilities/utils"
|
||||||
@ -12,24 +13,23 @@ import (
|
|||||||
func (i *impl) LoginAsUser(spec userdomain.UserLogin) (string, error) {
|
func (i *impl) LoginAsUser(spec userdomain.UserLogin) (string, error) {
|
||||||
user, err := i.userRepo.GetUserByEmail(spec.Email)
|
user, err := i.userRepo.GetUserByEmail(spec.Email)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", errors.New(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
matchPassword := utils.ComparePassword(user.Password, spec.Password)
|
matchPassword := utils.ComparePassword(user.Password, spec.Password)
|
||||||
if !matchPassword {
|
if !matchPassword {
|
||||||
return "", fmt.Errorf("wrong password")
|
return "", errors.New("wrong password")
|
||||||
}
|
}
|
||||||
|
|
||||||
authToken := authdomain.AuthToken{
|
authToken := authdomain.AuthToken{
|
||||||
Email: user.Email,
|
Email: user.Email,
|
||||||
SessionID: uuid.NewString(),
|
SessionID: uuid.NewString(),
|
||||||
Role: "user",
|
Role: "user",
|
||||||
ID: user.ID,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
token, err := utils.GenerateToken(authToken)
|
token, err := utils.GenerateToken(authToken)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", errors.New(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
return token, nil
|
return token, nil
|
||||||
@ -1,7 +1,8 @@
|
|||||||
package usersvc
|
package usersvc
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"errors"
|
||||||
|
|
||||||
authdomain "legalgo-BE-go/internal/domain/auth"
|
authdomain "legalgo-BE-go/internal/domain/auth"
|
||||||
userdomain "legalgo-BE-go/internal/domain/user"
|
userdomain "legalgo-BE-go/internal/domain/user"
|
||||||
"legalgo-BE-go/internal/utilities/utils"
|
"legalgo-BE-go/internal/utilities/utils"
|
||||||
@ -13,7 +14,7 @@ func (i *impl) RegisterUser(spec userdomain.UserRegister) (string, error) {
|
|||||||
_, err := i.userRepo.GetUserByEmail(spec.Email)
|
_, err := i.userRepo.GetUserByEmail(spec.Email)
|
||||||
|
|
||||||
if err == nil {
|
if err == nil {
|
||||||
return "", fmt.Errorf("this email address is already in use")
|
return "", errors.New("this email address is already in use")
|
||||||
}
|
}
|
||||||
|
|
||||||
if spec.SubscribePlanID == "" {
|
if spec.SubscribePlanID == "" {
|
||||||
@ -27,7 +28,7 @@ func (i *impl) RegisterUser(spec userdomain.UserRegister) (string, error) {
|
|||||||
|
|
||||||
_, err = i.subsPlanRepo.GetByID(spec.SubscribePlanID)
|
_, err = i.subsPlanRepo.GetByID(spec.SubscribePlanID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", errors.New(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
subsId, err := i.subsRepo.Create(spec.SubscribePlanID)
|
subsId, err := i.subsRepo.Create(spec.SubscribePlanID)
|
||||||
@ -50,19 +51,18 @@ func (i *impl) RegisterUser(spec userdomain.UserRegister) (string, error) {
|
|||||||
|
|
||||||
err = i.userRepo.CreateUser(user)
|
err = i.userRepo.CreateUser(user)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", fmt.Errorf(err.Error())
|
return "", errors.New(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
authToken := authdomain.AuthToken{
|
authToken := authdomain.AuthToken{
|
||||||
Email: user.Email,
|
Email: user.Email,
|
||||||
SessionID: uuid.NewString(),
|
SessionID: uuid.NewString(),
|
||||||
Role: "user",
|
Role: "user",
|
||||||
ID: user.ID,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
token, err := utils.GenerateToken(authToken)
|
token, err := utils.GenerateToken(authToken)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", fmt.Errorf(err.Error())
|
return "", errors.New(err.Error())
|
||||||
}
|
}
|
||||||
return token, nil
|
return token, nil
|
||||||
}
|
}
|
||||||
@ -1,7 +1,7 @@
|
|||||||
package utils
|
package utils
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"errors"
|
||||||
authdomain "legalgo-BE-go/internal/domain/auth"
|
authdomain "legalgo-BE-go/internal/domain/auth"
|
||||||
"net/http"
|
"net/http"
|
||||||
"strings"
|
"strings"
|
||||||
@ -13,16 +13,16 @@ func GetTokenDetail(r *http.Request) (authdomain.AuthToken, error) {
|
|||||||
var data authdomain.AuthToken
|
var data authdomain.AuthToken
|
||||||
|
|
||||||
if authHeader == "" {
|
if authHeader == "" {
|
||||||
return data, fmt.Errorf("unauthorized")
|
return data, errors.New("unauthorized")
|
||||||
}
|
}
|
||||||
|
|
||||||
if !strings.HasPrefix(authHeader, "Bearer") {
|
if !strings.HasPrefix(authHeader, "Bearer") {
|
||||||
return data, fmt.Errorf("invalid token")
|
return data, errors.New("invalid token")
|
||||||
}
|
}
|
||||||
|
|
||||||
token := strings.Split(authHeader, " ")
|
token := strings.Split(authHeader, " ")
|
||||||
if len(token) < 2 {
|
if len(token) < 2 {
|
||||||
return data, fmt.Errorf("invalid token")
|
return data, errors.New("invalid token")
|
||||||
}
|
}
|
||||||
data, err := DestructToken(token[1])
|
data, err := DestructToken(token[1])
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
package utils
|
package utils
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@ -36,7 +37,6 @@ func GenerateToken(data authdomain.AuthToken) (string, error) {
|
|||||||
string(jwtclaimenum.EMAIL): data.Email,
|
string(jwtclaimenum.EMAIL): data.Email,
|
||||||
string(jwtclaimenum.ROLE): data.Role,
|
string(jwtclaimenum.ROLE): data.Role,
|
||||||
string(jwtclaimenum.SESSION_ID): data.SessionID,
|
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(),
|
string(jwtclaimenum.EXPIRED_AT): now.Add(time.Minute * time.Duration(config.REDIS_TIMEOUT)).Unix(),
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -66,38 +66,32 @@ func DestructToken(s string) (authdomain.AuthToken, error) {
|
|||||||
claims, ok := token.Claims.(jwt.MapClaims)
|
claims, ok := token.Claims.(jwt.MapClaims)
|
||||||
|
|
||||||
if !ok {
|
if !ok {
|
||||||
return data, fmt.Errorf("failed to parse token")
|
return data, errors.New("failed to parse token")
|
||||||
}
|
}
|
||||||
|
|
||||||
if !token.Valid {
|
if !token.Valid {
|
||||||
return data, fmt.Errorf("invalid token")
|
return data, errors.New("invalid token")
|
||||||
}
|
}
|
||||||
|
|
||||||
email, ok := claims[string(jwtclaimenum.EMAIL)].(string)
|
email, ok := claims[string(jwtclaimenum.EMAIL)].(string)
|
||||||
if !ok {
|
if !ok {
|
||||||
return data, fmt.Errorf("invalid email")
|
return data, errors.New("invalid email")
|
||||||
}
|
}
|
||||||
|
|
||||||
sessionId, ok := claims[string(jwtclaimenum.SESSION_ID)].(string)
|
sessionId, ok := claims[string(jwtclaimenum.SESSION_ID)].(string)
|
||||||
if !ok {
|
if !ok {
|
||||||
return data, fmt.Errorf("invalid session_id")
|
return data, errors.New("invalid session_id")
|
||||||
}
|
}
|
||||||
|
|
||||||
role, ok := claims[string(jwtclaimenum.ROLE)].(string)
|
role, ok := claims[string(jwtclaimenum.ROLE)].(string)
|
||||||
if !ok {
|
if !ok {
|
||||||
return data, fmt.Errorf("invalid role")
|
return data, errors.New("invalid role")
|
||||||
}
|
|
||||||
|
|
||||||
id, ok := claims[string(jwtclaimenum.ID)].(string)
|
|
||||||
if !ok {
|
|
||||||
return data, fmt.Errorf("invalid id")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
data = authdomain.AuthToken{
|
data = authdomain.AuthToken{
|
||||||
Email: email,
|
Email: email,
|
||||||
SessionID: sessionId,
|
SessionID: sessionId,
|
||||||
Role: role,
|
Role: role,
|
||||||
ID: id,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return data, nil
|
return data, nil
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
package utils
|
package utils
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"errors"
|
||||||
"reflect"
|
"reflect"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -11,14 +11,14 @@ func StructToMap(s any) (map[string]any, error) {
|
|||||||
val := reflect.ValueOf(s)
|
val := reflect.ValueOf(s)
|
||||||
|
|
||||||
if val.Kind() != reflect.Struct {
|
if val.Kind() != reflect.Struct {
|
||||||
return nil, fmt.Errorf("provided value is not struct")
|
return nil, errors.New("provided value is not struct")
|
||||||
}
|
}
|
||||||
|
|
||||||
for i := range val.NumField() {
|
for i := range val.NumField() {
|
||||||
field := val.Type().Field(i)
|
field := val.Type().Field(i)
|
||||||
value := val.Field(i)
|
value := val.Field(i)
|
||||||
|
|
||||||
if !value.IsValid() {
|
if value.IsZero() || value.IsNil() {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user