feat: ads log
This commit is contained in:
parent
ee8e8e140d
commit
c0dcdb77fa
11
database/log_ads_model.go
Normal file
11
database/log_ads_model.go
Normal file
@ -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"`
|
||||
}
|
||||
11
database/log_news_model.go
Normal file
11
database/log_news_model.go
Normal file
@ -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"`
|
||||
}
|
||||
@ -55,5 +55,7 @@ func (db *DB) Migrate() error {
|
||||
&Tag{},
|
||||
&Category{},
|
||||
&Ads{},
|
||||
&LogAds{},
|
||||
&LogNews{},
|
||||
)
|
||||
}
|
||||
|
||||
20
internal/accessor/log/create_log_ads.go
Normal file
20
internal/accessor/log/create_log_ads.go
Normal file
@ -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
|
||||
}
|
||||
21
internal/accessor/log/get_all_logs_ads.go
Normal file
21
internal/accessor/log/get_all_logs_ads.go
Normal file
@ -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
|
||||
}
|
||||
19
internal/accessor/log/impl.go
Normal file
19
internal/accessor/log/impl.go
Normal file
@ -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}
|
||||
}
|
||||
@ -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,
|
||||
))
|
||||
|
||||
68
internal/api/http/logs/create_log_ads.go
Normal file
68
internal/api/http/logs/create_log_ads.go
Normal file
@ -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",
|
||||
})
|
||||
})
|
||||
}
|
||||
37
internal/api/http/logs/get_all_log_ads.go
Normal file
37
internal/api/http/logs/get_all_log_ads.go
Normal file
@ -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)
|
||||
})
|
||||
}
|
||||
8
internal/api/http/logs/module.go
Normal file
8
internal/api/http/logs/module.go
Normal file
@ -0,0 +1,8 @@
|
||||
package logshttp
|
||||
|
||||
import "go.uber.org/fx"
|
||||
|
||||
var Module = fx.Module("logs-http", fx.Invoke(
|
||||
CreateLogAds,
|
||||
GetUserAds,
|
||||
))
|
||||
@ -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 {
|
||||
|
||||
14
internal/domain/logs/spec.go
Normal file
14
internal/domain/logs/spec.go
Normal file
@ -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"`
|
||||
}
|
||||
11
internal/services/logs/create_logs_ads.go
Normal file
11
internal/services/logs/create_logs_ads.go
Normal file
@ -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
|
||||
}
|
||||
20
internal/services/logs/get_all_logs_ads.go
Normal file
20
internal/services/logs/get_all_logs_ads.go
Normal file
@ -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
|
||||
}
|
||||
23
internal/services/logs/impl.go
Normal file
23
internal/services/logs/impl.go
Normal file
@ -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,
|
||||
}
|
||||
}
|
||||
@ -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,
|
||||
),
|
||||
)
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -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}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user