Files
work-club-manager/backend/WorkClub.Api/Services/ClubService.cs

80 lines
2.1 KiB
C#
Raw Normal View History

using Microsoft.EntityFrameworkCore;
using WorkClub.Application.Clubs.DTOs;
using WorkClub.Application.Interfaces;
using WorkClub.Infrastructure.Data;
namespace WorkClub.Api.Services;
public class ClubService
{
private readonly AppDbContext _context;
private readonly ITenantProvider _tenantProvider;
private readonly IHttpContextAccessor _httpContextAccessor;
public ClubService(
AppDbContext context,
ITenantProvider tenantProvider,
IHttpContextAccessor httpContextAccessor)
{
_context = context;
_tenantProvider = tenantProvider;
_httpContextAccessor = httpContextAccessor;
}
public async Task<List<ClubListDto>> GetMyClubsAsync()
{
var userIdClaim = _httpContextAccessor.HttpContext?.User.FindFirst("sub")?.Value;
if (string.IsNullOrEmpty(userIdClaim))
{
return new List<ClubListDto>();
}
var memberships = await _context.Members
.Where(m => m.ExternalUserId == userIdClaim)
.ToListAsync();
var clubIds = memberships.Select(m => m.ClubId).ToList();
var clubs = await _context.Clubs
.Where(c => clubIds.Contains(c.Id))
.ToListAsync();
var clubDtos = new List<ClubListDto>();
foreach (var club in clubs)
{
var memberCount = await _context.Members
.Where(m => m.ClubId == club.Id)
.CountAsync();
clubDtos.Add(new ClubListDto(
club.Id,
club.Name,
club.SportType.ToString(),
memberCount
));
}
return clubDtos;
}
public async Task<ClubDetailDto?> GetCurrentClubAsync()
{
var tenantId = _tenantProvider.GetTenantId();
var club = await _context.Clubs
.FirstOrDefaultAsync(c => c.TenantId == tenantId);
if (club == null)
return null;
return new ClubDetailDto(
club.Id,
club.Name,
club.SportType.ToString(),
club.Description,
club.CreatedAt,
club.UpdatedAt
);
}
}