// Copyright (c) 2025 Nikolai Papin // // This file is part of Easywish // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See // the GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . package services import ( "easywish/internal/database" "easywish/internal/dto" errs "easywish/internal/errors" mapspecial "easywish/internal/utils/mapSpecial" "errors" "github.com/go-redis/redis/v8" "github.com/jackc/pgx/v5" "go.uber.org/zap" ) type ProfileService interface { GetProfileByUsername(cinfo dto.ClientInfo, username string) (*dto.ProfileDto, error) GetMyProfile(cinfo dto.ClientInfo) (*dto.ProfileDto, error) UpdateProfile(cinfo dto.ClientInfo, newProfile dto.ProfileDto) (bool, error) GetProfileSettings(cinfo dto.ClientInfo) (*dto.ProfileSettingsDto, error) UpdateProfileSettings(cinfo dto.ClientInfo, newProfileSettings dto.ProfileSettingsDto) (bool, error) UploadAvatar(cinfo dto.ClientInfo, filePath string) (*string, error) } type profileServiceImpl struct { log *zap.Logger dbctx database.DbContext redis *redis.Client } func NewProfileService(_log *zap.Logger, _dbctx database.DbContext, _redis *redis.Client) ProfileService { return &profileServiceImpl{log: _log, dbctx: _dbctx, redis: _redis} } // XXX: untested func (p *profileServiceImpl) GetMyProfile(cinfo dto.ClientInfo) (*dto.ProfileDto, error) { db := database.NewDbHelper(p.dbctx); profile, err := db.Queries.GetProfileByUsername(db.CTX, cinfo.Username); if err != nil { p.log.Error( "Failed to find user profile by username", zap.Error(err)) return nil, errs.ErrServerError } var profileDto dto.ProfileDto mapspecial.MapProfileDto(profile, profileDto) return &profileDto, nil } // TODO: Profile privacy settings checks func (p *profileServiceImpl) GetProfileByUsername(cinfo dto.ClientInfo, username string) (*dto.ProfileDto, error) { helper, db, err := database.NewDbHelperTransaction(p.dbctx); if err != nil { p.log.Error( "Failed to start transaction", zap.Error(err)) return nil, errs.ErrServerError } defer helper.Rollback() profile, err := db.TXQueries.GetProfileByUsername(db.CTX, username); if err != nil { if errors.Is(err, pgx.ErrNoRows) { return nil, errs.ErrNotFound } p.log.Error( "Failed to get user profile by username", zap.String("username", username), zap.Error(err)) return nil, errs.ErrServerError } var profileDto dto.ProfileDto mapspecial.MapProfileDto(profile, profileDto) return &profileDto, nil } func (p *profileServiceImpl) GetProfileSettings(cinfo dto.ClientInfo) (*dto.ProfileSettingsDto, error) { panic("unimplemented") } func (p *profileServiceImpl) UpdateProfile(cinfo dto.ClientInfo, newProfile dto.ProfileDto) (bool, error) { panic("unimplemented") } func (p *profileServiceImpl) UpdateProfileSettings(cinfo dto.ClientInfo, newProfileSettings dto.ProfileSettingsDto) (bool, error) { panic("unimplemented") } func (p *profileServiceImpl) UploadAvatar(cinfo dto.ClientInfo, filePath string) (*string, error) { panic("unimplemented") }