diff --git a/.gitignore b/.gitignore index 01f36f3..b1ca019 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ bin .env .DS_Store /cmd/legalgo/env + +__debug* diff --git a/database/log_ads_model.go b/database/log_ads_model.go index 119b030..749b7fc 100644 --- a/database/log_ads_model.go +++ b/database/log_ads_model.go @@ -3,9 +3,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:"default:null" json:"user_id"` + ID string `gorm:"primaryKey;not null" json:"id"` + ContentID string `gorm:"not null" json:"content_id"` + UserID string `gorm:"default:null" json:"user_id"` + IP string `gorm:"default:null" json:"ip"` + UserAgent string `gorm:"default:null" json:"user_agent"` CreatedAt time.Time `gorm:"default:CURRENT_TIMESTAMP" json:"created_at"` UpdatedAt time.Time `gorm:"default:CURRENT_TIMESTAMP" json:"updated_at"` } diff --git a/internal/accessor/ads/get-all.go b/internal/accessor/ads/get-all.go index fe62a51..a5e0d11 100644 --- a/internal/accessor/ads/get-all.go +++ b/internal/accessor/ads/get-all.go @@ -9,8 +9,8 @@ func (a *accessor) GetAll() ([]adsdomain.AdsResponse, error) { var ads []adsdomain.AdsResponse if err := a.db.Table("ads"). - Select("ads.*, COUNT(log_ads.ads_id) as clicked"). - Joins("LEFT JOIN log_ads ON log_ads.ads_id = ads.id"). + Select("ads.*, COUNT(log_ads.content_id) as clicked"). + Joins("LEFT JOIN log_ads ON log_ads.content_id = ads.id"). Group("ads.id"). Scan(&ads).Error; err != nil { return ads, fmt.Errorf("failed to get all ads: %v", err) diff --git a/internal/accessor/log/create_log_ads.go b/internal/accessor/log/create_log_ads.go index cb933dd..e8d40e7 100644 --- a/internal/accessor/log/create_log_ads.go +++ b/internal/accessor/log/create_log_ads.go @@ -2,16 +2,29 @@ package logrepository import ( "legalgo-BE-go/database" + logsdomain "legalgo-BE-go/internal/domain/logs" "github.com/google/uuid" ) -func (a *accessor) CreateLogAds(adsID string) error { - spec := database.LogAds{ - ID: uuid.NewString(), - AdsID: adsID, +func (a *accessor) CreateLogAds(spec logsdomain.LogsSpec) error { + newSpec := database.LogAds{ + ID: uuid.NewString(), + ContentID: spec.ContentID, } - if err := a.db.Create(&spec).Error; err != nil { + + if spec.UserID != nil { + newSpec.UserID = *spec.UserID + } + + if spec.IP != nil { + newSpec.IP = *spec.IP + } + + if spec.UserAgent != nil { + newSpec.UserAgent = *spec.UserAgent + } + if err := a.db.Create(&newSpec).Error; err != nil { return err } diff --git a/internal/accessor/log/impl.go b/internal/accessor/log/impl.go index 8bd07cd..4118957 100644 --- a/internal/accessor/log/impl.go +++ b/internal/accessor/log/impl.go @@ -3,6 +3,7 @@ package logrepository import ( "legalgo-BE-go/database" adsdomain "legalgo-BE-go/internal/domain/ads" + logsdomain "legalgo-BE-go/internal/domain/logs" ) type accessor struct { @@ -10,7 +11,7 @@ type accessor struct { } type Log interface { - CreateLogAds(string) error + CreateLogAds(logsdomain.LogsSpec) error GetAllLogAds(string) ([]adsdomain.Ads, error) } diff --git a/internal/api/http/logs/create_log_ads.go b/internal/api/http/logs/create_log_ads.go index 171519c..8be3191 100644 --- a/internal/api/http/logs/create_log_ads.go +++ b/internal/api/http/logs/create_log_ads.go @@ -7,30 +7,22 @@ import ( "legalgo-BE-go/internal/utilities/response" "legalgo-BE-go/internal/utilities/utils" "net/http" + "strings" "github.com/go-chi/chi/v5" + "github.com/go-playground/validator/v10" ) func CreateLogAds( router chi.Router, userSvc usersvc.User, logsSvc logssvc.Log, + validate *validator.Validate, ) { router.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 specReq logsdomain.LogsSpec var spec logsdomain.LogsRequest @@ -46,7 +38,41 @@ func CreateLogAds( return } - if err := logsSvc.CreateLogAds(spec.AdsID); err != nil { + if err := validate.Struct(spec); err != nil { + response.RespondJsonErrorWithCode( + ctx, + w, + err, + response.ErrBadRequest.Code, + response.ErrBadRequest.HttpCode, + err.(validator.ValidationErrors).Error(), + ) + return + } + + specReq.ContentID = spec.AdsID + + userDetail, _ := utils.GetTokenDetail(r) + + if userDetail.ID != "" { + specReq.UserID = &userDetail.ID + } + + ip := r.RemoteAddr + + if forwarded := r.Header.Get("X-Forwarded-For"); forwarded != "" { + ip = strings.Split(forwarded, ",")[0] + } + + if ip != "" { + specReq.IP = &ip + } + + if userAgent := r.UserAgent(); userAgent != "" { + specReq.UserAgent = &userAgent + } + + if err := logsSvc.CreateLogAds(specReq); err != nil { response.RespondJsonErrorWithCode( ctx, w, diff --git a/internal/domain/logs/spec.go b/internal/domain/logs/spec.go index 1feabed..8fefd44 100644 --- a/internal/domain/logs/spec.go +++ b/internal/domain/logs/spec.go @@ -8,6 +8,13 @@ type LogsRequest struct { AdsID string `json:"ads_id" validate:"required"` } +type LogsSpec struct { + ContentID string `json:"content_id" validate:"required"` + IP *string `json:"ip"` + UserID *string `json:"user_id"` + UserAgent *string `json:"user_agent"` +} + 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 index 80a1f75..2e53f32 100644 --- a/internal/services/logs/create_logs_ads.go +++ b/internal/services/logs/create_logs_ads.go @@ -1,9 +1,12 @@ package logssvc -import "fmt" +import ( + "fmt" + logsdomain "legalgo-BE-go/internal/domain/logs" +) -func (i *impl) CreateLogAds(adsID string) error { - if err := i.logsRepo.CreateLogAds(adsID); err != nil { +func (i *impl) CreateLogAds(spec logsdomain.LogsSpec) error { + if err := i.logsRepo.CreateLogAds(spec); err != nil { return fmt.Errorf("failed to create ads log: %v", err) } diff --git a/internal/services/logs/impl.go b/internal/services/logs/impl.go index a921896..7e7a253 100644 --- a/internal/services/logs/impl.go +++ b/internal/services/logs/impl.go @@ -3,6 +3,7 @@ package logssvc import ( logrepository "legalgo-BE-go/internal/accessor/log" adsdomain "legalgo-BE-go/internal/domain/ads" + logsdomain "legalgo-BE-go/internal/domain/logs" ) type impl struct { @@ -10,7 +11,7 @@ type impl struct { } type Log interface { - CreateLogAds(string) error + CreateLogAds(logsdomain.LogsSpec) error GetAllLogAds(string) ([]adsdomain.Ads, error) }