147 lines
3.1 KiB
Go
147 lines
3.1 KiB
Go
package repository
|
|
|
|
import (
|
|
dbgen "Yimaru-Backend/gen/db"
|
|
"Yimaru-Backend/internal/domain"
|
|
"Yimaru-Backend/internal/ports"
|
|
"context"
|
|
|
|
"github.com/jackc/pgx/v5/pgtype"
|
|
)
|
|
|
|
func NewRatingStore(s *Store) ports.RatingStore { return s }
|
|
|
|
func ratingToDomain(r dbgen.Rating) domain.Rating {
|
|
var review *string
|
|
if r.Review.Valid {
|
|
review = &r.Review.String
|
|
}
|
|
return domain.Rating{
|
|
ID: r.ID,
|
|
UserID: r.UserID,
|
|
TargetType: domain.RatingTargetType(r.TargetType),
|
|
TargetID: r.TargetID,
|
|
Stars: r.Stars,
|
|
Review: review,
|
|
CreatedAt: r.CreatedAt.Time,
|
|
UpdatedAt: r.UpdatedAt.Time,
|
|
}
|
|
}
|
|
|
|
func (s *Store) UpsertRating(
|
|
ctx context.Context,
|
|
userID int64,
|
|
targetType domain.RatingTargetType,
|
|
targetID int64,
|
|
stars int16,
|
|
review *string,
|
|
) (domain.Rating, error) {
|
|
reviewVal := pgtype.Text{Valid: false}
|
|
if review != nil {
|
|
reviewVal = pgtype.Text{String: *review, Valid: true}
|
|
}
|
|
|
|
row, err := s.queries.UpsertRating(ctx, dbgen.UpsertRatingParams{
|
|
UserID: userID,
|
|
TargetType: string(targetType),
|
|
TargetID: targetID,
|
|
Stars: stars,
|
|
Review: reviewVal,
|
|
})
|
|
if err != nil {
|
|
return domain.Rating{}, err
|
|
}
|
|
|
|
return ratingToDomain(row), nil
|
|
}
|
|
|
|
func (s *Store) GetRatingByUserAndTarget(
|
|
ctx context.Context,
|
|
userID int64,
|
|
targetType domain.RatingTargetType,
|
|
targetID int64,
|
|
) (domain.Rating, error) {
|
|
row, err := s.queries.GetRatingByUserAndTarget(ctx, dbgen.GetRatingByUserAndTargetParams{
|
|
UserID: userID,
|
|
TargetType: string(targetType),
|
|
TargetID: targetID,
|
|
})
|
|
if err != nil {
|
|
return domain.Rating{}, err
|
|
}
|
|
|
|
return ratingToDomain(row), nil
|
|
}
|
|
|
|
func (s *Store) GetRatingsByTarget(
|
|
ctx context.Context,
|
|
targetType domain.RatingTargetType,
|
|
targetID int64,
|
|
limit int32,
|
|
offset int32,
|
|
) ([]domain.Rating, error) {
|
|
rows, err := s.queries.GetRatingsByTarget(ctx, dbgen.GetRatingsByTargetParams{
|
|
TargetType: string(targetType),
|
|
TargetID: targetID,
|
|
Limit: pgtype.Int4{Int32: limit, Valid: true},
|
|
Offset: pgtype.Int4{Int32: offset, Valid: true},
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var ratings []domain.Rating
|
|
for _, row := range rows {
|
|
ratings = append(ratings, ratingToDomain(row))
|
|
}
|
|
|
|
return ratings, nil
|
|
}
|
|
|
|
func (s *Store) GetRatingSummary(
|
|
ctx context.Context,
|
|
targetType domain.RatingTargetType,
|
|
targetID int64,
|
|
) (domain.RatingSummary, error) {
|
|
row, err := s.queries.GetRatingSummary(ctx, dbgen.GetRatingSummaryParams{
|
|
TargetType: string(targetType),
|
|
TargetID: targetID,
|
|
})
|
|
if err != nil {
|
|
return domain.RatingSummary{}, err
|
|
}
|
|
|
|
return domain.RatingSummary{
|
|
TotalCount: row.TotalCount,
|
|
AverageStars: row.AverageStars,
|
|
}, nil
|
|
}
|
|
|
|
func (s *Store) GetUserRatings(
|
|
ctx context.Context,
|
|
userID int64,
|
|
) ([]domain.Rating, error) {
|
|
rows, err := s.queries.GetUserRatings(ctx, userID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var ratings []domain.Rating
|
|
for _, row := range rows {
|
|
ratings = append(ratings, ratingToDomain(row))
|
|
}
|
|
|
|
return ratings, nil
|
|
}
|
|
|
|
func (s *Store) DeleteRating(
|
|
ctx context.Context,
|
|
ratingID int64,
|
|
userID int64,
|
|
) error {
|
|
return s.queries.DeleteRating(ctx, dbgen.DeleteRatingParams{
|
|
ID: ratingID,
|
|
UserID: userID,
|
|
})
|
|
}
|