99 lines
2.2 KiB
Go
99 lines
2.2 KiB
Go
package sqlite
|
|
|
|
import (
|
|
"context"
|
|
"database/sql"
|
|
"fmt"
|
|
"messenger/internal/models"
|
|
)
|
|
|
|
type ProfileRepository struct {
|
|
db *DB
|
|
}
|
|
|
|
func NewProfileRepository(db *DB) *ProfileRepository {
|
|
return &ProfileRepository{db: db}
|
|
}
|
|
|
|
func (r *ProfileRepository) Create(ctx context.Context, profile *models.Profile) error {
|
|
query := `
|
|
INSERT INTO profiles (user_id, display_name, bio, avatar_url)
|
|
VALUES (?, ?, ?, ?)
|
|
`
|
|
|
|
_, err := r.db.ExecContext(ctx, query,
|
|
profile.UserID, profile.DisplayName, profile.Bio, profile.AvatarURL)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to create profile: %w", err)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (r *ProfileRepository) FindByUserID(ctx context.Context, userID int64) (*models.Profile, error) {
|
|
query := `
|
|
SELECT user_id, display_name, bio, avatar_url
|
|
FROM profiles
|
|
WHERE user_id = ?
|
|
`
|
|
|
|
var profile models.Profile
|
|
|
|
err := r.db.QueryRowContext(ctx, query, userID).Scan(
|
|
&profile.UserID, &profile.DisplayName, &profile.Bio, &profile.AvatarURL,
|
|
)
|
|
|
|
if err == sql.ErrNoRows {
|
|
return nil, nil
|
|
}
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to find profile by user_id: %w", err)
|
|
}
|
|
|
|
return &profile, nil
|
|
}
|
|
|
|
func (r *ProfileRepository) Update(ctx context.Context, profile *models.Profile) error {
|
|
query := `
|
|
UPDATE profiles
|
|
SET display_name = COALESCE(?, display_name),
|
|
bio = COALESCE(?, bio)
|
|
WHERE user_id = ?
|
|
`
|
|
|
|
result, err := r.db.ExecContext(ctx, query, profile.DisplayName, profile.Bio, profile.UserID)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to update profile: %w", err)
|
|
}
|
|
|
|
rows, err := result.RowsAffected()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if rows == 0 {
|
|
return fmt.Errorf("profile not found for user: %d", profile.UserID)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (r *ProfileRepository) UpdateAvatar(ctx context.Context, userID int64, avatarURL *string) error {
|
|
query := `UPDATE profiles SET avatar_url = ? WHERE user_id = ?`
|
|
|
|
result, err := r.db.ExecContext(ctx, query, avatarURL, userID)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to update avatar: %w", err)
|
|
}
|
|
|
|
rows, err := result.RowsAffected()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if rows == 0 {
|
|
return fmt.Errorf("profile not found for user: %d", userID)
|
|
}
|
|
|
|
return nil
|
|
} |