package sql import ( "context" "tercul/internal/domain" "gorm.io/gorm" ) type analyticsRepository struct { db *gorm.DB } func NewAnalyticsRepository(db *gorm.DB) domain.AnalyticsRepository { return &analyticsRepository{db: db} } func (r *analyticsRepository) IncrementWorkViews(ctx context.Context, workID uint) error { _, err := r.GetOrCreateWorkStats(ctx, workID) if err != nil { return err } return r.db.WithContext(ctx).Model(&domain.WorkStats{}).Where("work_id = ?", workID).UpdateColumn("views", gorm.Expr("views + 1")).Error } func (r *analyticsRepository) IncrementWorkLikes(ctx context.Context, workID uint) error { _, err := r.GetOrCreateWorkStats(ctx, workID) if err != nil { return err } return r.db.WithContext(ctx).Model(&domain.WorkStats{}).Where("work_id = ?", workID).UpdateColumn("likes", gorm.Expr("likes + 1")).Error } func (r *analyticsRepository) IncrementWorkComments(ctx context.Context, workID uint) error { _, err := r.GetOrCreateWorkStats(ctx, workID) if err != nil { return err } return r.db.WithContext(ctx).Model(&domain.WorkStats{}).Where("work_id = ?", workID).UpdateColumn("comments", gorm.Expr("comments + 1")).Error } func (r *analyticsRepository) IncrementWorkBookmarks(ctx context.Context, workID uint) error { _, err := r.GetOrCreateWorkStats(ctx, workID) if err != nil { return err } return r.db.WithContext(ctx).Model(&domain.WorkStats{}).Where("work_id = ?", workID).UpdateColumn("bookmarks", gorm.Expr("bookmarks + 1")).Error } func (r *analyticsRepository) IncrementWorkShares(ctx context.Context, workID uint) error { _, err := r.GetOrCreateWorkStats(ctx, workID) if err != nil { return err } return r.db.WithContext(ctx).Model(&domain.WorkStats{}).Where("work_id = ?", workID).UpdateColumn("shares", gorm.Expr("shares + 1")).Error } func (r *analyticsRepository) IncrementWorkTranslationCount(ctx context.Context, workID uint) error { _, err := r.GetOrCreateWorkStats(ctx, workID) if err != nil { return err } return r.db.WithContext(ctx).Model(&domain.WorkStats{}).Where("work_id = ?", workID).UpdateColumn("translation_count", gorm.Expr("translation_count + 1")).Error } func (r *analyticsRepository) IncrementTranslationViews(ctx context.Context, translationID uint) error { _, err := r.GetOrCreateTranslationStats(ctx, translationID) if err != nil { return err } return r.db.WithContext(ctx).Model(&domain.TranslationStats{}).Where("translation_id = ?", translationID).UpdateColumn("views", gorm.Expr("views + 1")).Error } func (r *analyticsRepository) IncrementTranslationLikes(ctx context.Context, translationID uint) error { _, err := r.GetOrCreateTranslationStats(ctx, translationID) if err != nil { return err } return r.db.WithContext(ctx).Model(&domain.TranslationStats{}).Where("translation_id = ?", translationID).UpdateColumn("likes", gorm.Expr("likes + 1")).Error } func (r *analyticsRepository) IncrementTranslationComments(ctx context.Context, translationID uint) error { _, err := r.GetOrCreateTranslationStats(ctx, translationID) if err != nil { return err } return r.db.WithContext(ctx).Model(&domain.TranslationStats{}).Where("translation_id = ?", translationID).UpdateColumn("comments", gorm.Expr("comments + 1")).Error } func (r *analyticsRepository) IncrementTranslationShares(ctx context.Context, translationID uint) error { _, err := r.GetOrCreateTranslationStats(ctx, translationID) if err != nil { return err } return r.db.WithContext(ctx).Model(&domain.TranslationStats{}).Where("translation_id = ?", translationID).UpdateColumn("shares", gorm.Expr("shares + 1")).Error } func (r *analyticsRepository) GetOrCreateWorkStats(ctx context.Context, workID uint) (*domain.WorkStats, error) { var stats domain.WorkStats err := r.db.WithContext(ctx).Where(domain.WorkStats{WorkID: workID}).FirstOrCreate(&stats).Error return &stats, err } func (r *analyticsRepository) GetOrCreateTranslationStats(ctx context.Context, translationID uint) (*domain.TranslationStats, error) { var stats domain.TranslationStats err := r.db.WithContext(ctx).Where(domain.TranslationStats{TranslationID: translationID}).FirstOrCreate(&stats).Error return &stats, err }