diff --git a/database/log_ads_model.go b/database/log_ads_model.go new file mode 100644 index 0000000..5c007fc --- /dev/null +++ b/database/log_ads_model.go @@ -0,0 +1,11 @@ +package database + +import "time" + +type LogAds struct { + ID string `gorm:"primaryKey;not null" json:"id"` + AdsID string `gorm:"not null" json:"ads_id"` + UserID string `gorm:"not null" json:"user_id"` + CreatedAt time.Time `gorm:"default:CURRENT_TIMESTAMP" json:"created_at"` + UpdatedAt time.Time `gorm:"default:CURRENT_TIMESTAMP" json:"updated_at"` +} diff --git a/database/log_news_model.go b/database/log_news_model.go new file mode 100644 index 0000000..d173e76 --- /dev/null +++ b/database/log_news_model.go @@ -0,0 +1,11 @@ +package database + +import "time" + +type LogNews struct { + ID string `gorm:"primaryKey;not null" json:"id"` + NewsID string `gorm:"not null" json:"news_id"` + UserID string `gorm:"not null" json:"user_id"` + CreatedAt time.Time `gorm:"default:CURRENT_TIMESTAMP" json:"created_at"` + UpdatedAt time.Time `gorm:"default:CURRENT_TIMESTAMP" json:"updated_at"` +} diff --git a/database/new_db.go b/database/new_db.go index bd3c56f..d76045b 100644 --- a/database/new_db.go +++ b/database/new_db.go @@ -55,5 +55,7 @@ func (db *DB) Migrate() error { &Tag{}, &Category{}, &Ads{}, + &LogAds{}, + &LogNews{}, ) } diff --git a/internal/accessor/log/create_log_ads.go b/internal/accessor/log/create_log_ads.go new file mode 100644 index 0000000..8eff037 --- /dev/null +++ b/internal/accessor/log/create_log_ads.go @@ -0,0 +1,20 @@ +package logrepository + +import ( + "legalgo-BE-go/database" + + "github.com/google/uuid" +) + +func (a *accessor) CreateLogAds(adsID, userID string) error { + spec := database.LogAds{ + ID: uuid.NewString(), + AdsID: adsID, + UserID: userID, + } + if err := a.db.Create(&spec).Error; err != nil { + return err + } + + return nil +} diff --git a/internal/accessor/log/get_all_logs_ads.go b/internal/accessor/log/get_all_logs_ads.go new file mode 100644 index 0000000..bb9f8dd --- /dev/null +++ b/internal/accessor/log/get_all_logs_ads.go @@ -0,0 +1,21 @@ +package logrepository + +import ( + adsdomain "legalgo-BE-go/internal/domain/ads" +) + +func (a *accessor) GetAllLogAds(userID string) ([]adsdomain.Ads, error) { + var ads []adsdomain.Ads + + // if err := a.db.Find(&ads, "user_id = ?", userID).Error; err != nil { + // return ads, err + // } + + if err := a.db. + Joins("JOIN log_ads ON ads.id = log_ads.ads_id"). + Find(&ads, "log_ads.user_id = ?", userID).Error; err != nil { + return ads, err + } + + return ads, nil +} diff --git a/internal/accessor/log/impl.go b/internal/accessor/log/impl.go new file mode 100644 index 0000000..900d654 --- /dev/null +++ b/internal/accessor/log/impl.go @@ -0,0 +1,19 @@ +package logrepository + +import ( + "legalgo-BE-go/database" + adsdomain "legalgo-BE-go/internal/domain/ads" +) + +type accessor struct { + db *database.DB +} + +type Log interface { + CreateLogAds(adsID, userID string) error + GetAllLogAds(string) ([]adsdomain.Ads, error) +} + +func New(db *database.DB) Log { + return &accessor{db} +} diff --git a/internal/accessor/module.go b/internal/accessor/module.go index 5813846..662adfd 100644 --- a/internal/accessor/module.go +++ b/internal/accessor/module.go @@ -3,6 +3,7 @@ package repository import ( adsrepository "legalgo-BE-go/internal/accessor/ads" categoryrepository "legalgo-BE-go/internal/accessor/category" + logrepository "legalgo-BE-go/internal/accessor/log" newsrepository "legalgo-BE-go/internal/accessor/news" "legalgo-BE-go/internal/accessor/oss" redisaccessor "legalgo-BE-go/internal/accessor/redis" @@ -26,4 +27,5 @@ var Module = fx.Module("repository", fx.Provide( newsrepository.New, oss.New, adsrepository.New, + logrepository.New, )) diff --git a/internal/api/http/logs/create_log_ads.go b/internal/api/http/logs/create_log_ads.go new file mode 100644 index 0000000..79d5eb8 --- /dev/null +++ b/internal/api/http/logs/create_log_ads.go @@ -0,0 +1,68 @@ +package logshttp + +import ( + authmiddleware "legalgo-BE-go/internal/api/http/middleware/auth" + logsdomain "legalgo-BE-go/internal/domain/logs" + logssvc "legalgo-BE-go/internal/services/logs" + usersvc "legalgo-BE-go/internal/services/user" + "legalgo-BE-go/internal/utilities/response" + "legalgo-BE-go/internal/utilities/utils" + "net/http" + + "github.com/go-chi/chi/v5" +) + +func CreateLogAds( + router chi.Router, + userSvc usersvc.User, + logsSvc logssvc.Log, +) { + router.With(authmiddleware.Authorize()).Post("/logs/ads", func(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + + userDetail, err := utils.GetTokenDetail(r) + if err != nil { + response.RespondJsonErrorWithCode( + ctx, + w, + err, + response.ErrUnauthorized.Code, + response.ErrUnauthorized.HttpCode, + "unauthorized", + ) + return + } + + var spec logsdomain.LogsRequest + + if err := utils.UnmarshalBody(r, &spec); err != nil { + response.RespondJsonErrorWithCode( + ctx, + w, + err, + response.ErrBadRequest.Code, + response.ErrBadRequest.HttpCode, + "failed unmarshal body", + ) + return + } + + if err := logsSvc.CreateLogAds(spec.AdsID, userDetail.ID); err != nil { + response.RespondJsonErrorWithCode( + ctx, + w, + err, + response.ErrBadRequest.Code, + response.ErrBadRequest.HttpCode, + err.Error(), + ) + return + } + + response.RespondJsonSuccess(ctx, w, struct { + Message string + }{ + Message: "logs ads recorded successfully", + }) + }) +} diff --git a/internal/api/http/logs/get_all_log_ads.go b/internal/api/http/logs/get_all_log_ads.go new file mode 100644 index 0000000..3db9125 --- /dev/null +++ b/internal/api/http/logs/get_all_log_ads.go @@ -0,0 +1,37 @@ +package logshttp + +import ( + authmiddleware "legalgo-BE-go/internal/api/http/middleware/auth" + logssvc "legalgo-BE-go/internal/services/logs" + "legalgo-BE-go/internal/utilities/response" + "legalgo-BE-go/internal/utilities/utils" + "net/http" + + "github.com/go-chi/chi/v5" +) + +func GetUserAds( + router chi.Router, + logSvc logssvc.Log, +) { + router.With(authmiddleware.Authorize()).Get("/logs/ads", func(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + + userDetail, err := utils.GetTokenDetail(r) + + subsPlan, err := logSvc.GetAllLogAds(userDetail.ID) + if err != nil { + response.ResponseWithErrorCode( + ctx, + w, + err, + response.ErrBadRequest.Code, + response.ErrBadRequest.HttpCode, + err.Error(), + ) + return + } + + response.RespondJsonSuccess(ctx, w, subsPlan) + }) +} diff --git a/internal/api/http/logs/module.go b/internal/api/http/logs/module.go new file mode 100644 index 0000000..631b852 --- /dev/null +++ b/internal/api/http/logs/module.go @@ -0,0 +1,8 @@ +package logshttp + +import "go.uber.org/fx" + +var Module = fx.Module("logs-http", fx.Invoke( + CreateLogAds, + GetUserAds, +)) diff --git a/internal/api/http/router.go b/internal/api/http/router.go index b5c5454..e2f5a44 100644 --- a/internal/api/http/router.go +++ b/internal/api/http/router.go @@ -3,6 +3,7 @@ package internalhttp import ( adshttp "legalgo-BE-go/internal/api/http/ads" categoryhttp "legalgo-BE-go/internal/api/http/category" + logshttp "legalgo-BE-go/internal/api/http/logs" newshttp "legalgo-BE-go/internal/api/http/news" osshttp "legalgo-BE-go/internal/api/http/oss" staffhttp "legalgo-BE-go/internal/api/http/staff" @@ -33,6 +34,7 @@ var Module = fx.Module("router", userhttp.Module, subscribehttp.Module, adshttp.Module, + logshttp.Module, ) func initRouter() chi.Router { diff --git a/internal/domain/logs/spec.go b/internal/domain/logs/spec.go new file mode 100644 index 0000000..1feabed --- /dev/null +++ b/internal/domain/logs/spec.go @@ -0,0 +1,14 @@ +package logsdomain + +import ( + adsdomain "legalgo-BE-go/internal/domain/ads" +) + +type LogsRequest struct { + AdsID string `json:"ads_id" validate:"required"` +} + +type LogResponse struct { + ID string `json:"id"` + News []adsdomain.Ads `json:"news"` +} diff --git a/internal/services/logs/create_logs_ads.go b/internal/services/logs/create_logs_ads.go new file mode 100644 index 0000000..8ada044 --- /dev/null +++ b/internal/services/logs/create_logs_ads.go @@ -0,0 +1,11 @@ +package logssvc + +import "fmt" + +func (i *impl) CreateLogAds(adsID, userID string) error { + if err := i.logsRepo.CreateLogAds(adsID, userID); err != nil { + return fmt.Errorf("failed to create ads log: %v", err) + } + + return nil +} diff --git a/internal/services/logs/get_all_logs_ads.go b/internal/services/logs/get_all_logs_ads.go new file mode 100644 index 0000000..b34b08a --- /dev/null +++ b/internal/services/logs/get_all_logs_ads.go @@ -0,0 +1,20 @@ +package logssvc + +import ( + "fmt" + adsdomain "legalgo-BE-go/internal/domain/ads" +) + +func (i *impl) GetAllLogAds(userID string) ([]adsdomain.Ads, error) { + var ( + logs []adsdomain.Ads + err error + ) + + logs, err = i.logsRepo.GetAllLogAds(userID) + if err != nil { + return logs, fmt.Errorf("failed to get user logs ads: %v", err) + } + + return logs, nil +} diff --git a/internal/services/logs/impl.go b/internal/services/logs/impl.go new file mode 100644 index 0000000..ff2d708 --- /dev/null +++ b/internal/services/logs/impl.go @@ -0,0 +1,23 @@ +package logssvc + +import ( + logrepository "legalgo-BE-go/internal/accessor/log" + adsdomain "legalgo-BE-go/internal/domain/ads" +) + +type impl struct { + logsRepo logrepository.Log +} + +type Log interface { + CreateLogAds(adsID, userID string) error + GetAllLogAds(string) ([]adsdomain.Ads, error) +} + +func New( + logsRepo logrepository.Log, +) Log { + return &impl{ + logsRepo, + } +} diff --git a/internal/services/module.go b/internal/services/module.go index d8dbd13..5c0da4c 100644 --- a/internal/services/module.go +++ b/internal/services/module.go @@ -3,6 +3,7 @@ package services import ( adssvc "legalgo-BE-go/internal/services/ads" categorysvc "legalgo-BE-go/internal/services/category" + logssvc "legalgo-BE-go/internal/services/logs" newssvc "legalgo-BE-go/internal/services/news" "legalgo-BE-go/internal/services/oss" staffsvc "legalgo-BE-go/internal/services/staffsvc" @@ -25,5 +26,6 @@ var Module = fx.Module("services", oss.NewOSSService, usersvc.New, adssvc.New, + logssvc.New, ), ) diff --git a/internal/services/user/get_user.go b/internal/services/user/get_user.go index 78cb7b9..255be77 100644 --- a/internal/services/user/get_user.go +++ b/internal/services/user/get_user.go @@ -4,8 +4,8 @@ import ( userdomain "legalgo-BE-go/internal/domain/user" ) -func (i *impl) GetUserProfile(email string) (*userdomain.UserProfile, error) { - user, err := i.userRepo.GetUserProfile(email) +func (i *impl) GetUserProfile(id string) (*userdomain.UserProfile, error) { + user, err := i.userRepo.GetUserProfile(id) if err != nil { return nil, err } diff --git a/internal/services/user/register.go b/internal/services/user/register.go index 68feee1..913b19c 100644 --- a/internal/services/user/register.go +++ b/internal/services/user/register.go @@ -50,7 +50,7 @@ func (i *impl) RegisterUser(spec userdomain.UserRegister) (string, error) { err = i.userRepo.CreateUser(user) if err != nil { - return "", fmt.Errorf(err.Error()) + return "", fmt.Errorf("create user failed: %v", err) } authToken := authdomain.AuthToken{ @@ -62,7 +62,7 @@ func (i *impl) RegisterUser(spec userdomain.UserRegister) (string, error) { token, err := utils.GenerateToken(authToken) if err != nil { - return "", fmt.Errorf(err.Error()) + return "", fmt.Errorf("generate token failed: %v", err) } return token, nil } diff --git a/internal/utilities/response/error_code.go b/internal/utilities/response/error_code.go index 630b366..4b24a97 100644 --- a/internal/utilities/response/error_code.go +++ b/internal/utilities/response/error_code.go @@ -18,6 +18,7 @@ var ( ErrUnauthorized = &ErrorCode{Code: "UNAUTHORIZED", Message: "UNAUTHORIZED", HttpCode: http.StatusUnauthorized} ErrDBRequest = &ErrorCode{Code: "BAD_DB_REQUEST", Message: "DB_ERROR", HttpCode: http.StatusBadRequest} ErrExpiryToken = &ErrorCode{Code: "EXPIRED_TOKEN", Message: "EXPIRED_TOKEN", HttpCode: http.StatusUnauthorized} + ErrNotFound = &ErrorCode{Code: "NOT_FOUND", Message: "NOT_FOUND", HttpCode: http.StatusNotFound} // 5xx ErrMarshal = &ErrorCode{Code: "FAILED_MARSHAL", Message: "FAILED_MARSHAL_BODY", HttpCode: http.StatusInternalServerError}