using Application.Abstractions.Data; using Web.Api.Common; using Microsoft.EntityFrameworkCore; namespace Web.Api.Endpoints.Widget; /// WidgetToken + configID로 CrewWidgetConfig 조회 (위젯 스타일 적용용, 인증 불필요). /// configID 미지정 시 활성 첫 번째 자동 선택. internal sealed class CrewWidgetConfigByToken : IEndpoint { public void MapEndpoint(IEndpointRouteBuilder app) { app.MapGet("api/widget/crew/config/{widgetToken}", async ( string widgetToken, int? configID, IAppDbContext db, CancellationToken ct ) => { var channelID = await db.Channel.AsNoTracking() .Where(c => c.WidgetToken == widgetToken && c.IsActive) .Select(c => c.ID) .FirstOrDefaultAsync(ct); if (channelID == 0) { return ApiResponse.Ok((object?)null); } var query = db.CrewWidgetConfig.AsNoTracking() .Where(w => w.ChannelID == channelID); if (configID.HasValue) { query = query.Where(w => w.ID == configID.Value); } else { query = query.Where(w => w.IsActive); } var config = await query .OrderByDescending(w => w.ID) .Select(w => new { id = w.ID, crewID = w.CrewID, crewName = w.Crew != null ? w.Crew.Name : "", title = w.Title, theme = (int)w.Theme, period = (int)w.Period, maxDisplayCount = w.MaxDisplayCount, isShowAmount = w.IsShowAmount, isShowDonationCount = w.IsShowDonationCount, isShowContributionRate = w.IsShowContributionRate, isShowMemberIcon = w.IsShowMemberIcon, isActive = w.IsActive, bgColor = w.BgColor, titleFontFamily = w.TitleFontFamily, titleFontSizePx = w.TitleFontSizePx, titleFontColor = w.TitleFontColor, rank1FontFamily = w.Rank1FontFamily, rank1FontSizePx = w.Rank1FontSizePx, rank1FontColor = w.Rank1FontColor, rank2FontFamily = w.Rank2FontFamily, rank2FontSizePx = w.Rank2FontSizePx, rank2FontColor = w.Rank2FontColor, rank3FontFamily = w.Rank3FontFamily, rank3FontSizePx = w.Rank3FontSizePx, rank3FontColor = w.Rank3FontColor, rowFontFamily = w.RowFontFamily, rowFontSizePx = w.RowFontSizePx, rowFontColor = w.RowFontColor }) .FirstOrDefaultAsync(ct); return ApiResponse.Ok((object?)config); }) .WithTags("Widget") .AllowAnonymous(); } }