mirror of
https://github.com/SamyRai/tercul-backend.git
synced 2025-12-27 00:31:35 +00:00
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.
109 lines
4.1 KiB
Go
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
|
|
}
|