tercul-backend/internal/data/sql/analytics_repository.go
google-labs-jules[bot] 05bf1fbb05 feat: Implement analytics features
This commit introduces analytics features to the application. It includes:
- Extended domain models for storing analytics data.
- An analytics repository and service for managing the data.
- Integration with GraphQL mutations to update analytics counts.
- New GraphQL queries to expose analytics data.
- Unit and integration tests for the new features.
2025-09-07 16:43:15 +00:00

109 lines
4.1 KiB
Go

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
}