using Application.Abstractions.Data; using Web.Api.Common; using Microsoft.EntityFrameworkCore; namespace Web.Api.Endpoints.Widget; /// WidgetToken + configID로 RankConfig 조회 (위젯 스타일 적용용, 인증 불필요). /// configID 미지정 시 활성 첫 번째 자동 선택. internal sealed class RankConfigByToken : IEndpoint { public void MapEndpoint(IEndpointRouteBuilder app) { app.MapGet("api/widget/rank/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.DonationRankConfig.AsNoTracking() .Where(r => r.ChannelID == channelID); if (configID.HasValue) { query = query.Where(r => r.ID == configID.Value); } else { query = query.Where(r => r.IsActive); } var config = await query .OrderByDescending(r => r.ID) .Select(r => new { id = r.ID, title = r.Title, theme = (int)r.Theme, period = (int)r.Period, isShowAmount = r.IsShowAmount, maxRankCount = r.MaxRankCount, nameMode = r.NameMode, isActive = r.IsActive, titleFontFamily = r.TitleFontFamily, titleFontSizePx = r.TitleFontSizePx, titleFontColor = r.TitleFontColor, nameDisplayType = (int)r.NameDisplayType, isShowDonationCount = r.IsShowDonationCount, isShowGradeIcon = r.IsShowGradeIcon, isShowMemberIcon = r.IsShowMemberIcon, rank1FontFamily = r.Rank1FontFamily, rank1FontSizePx = r.Rank1FontSizePx, rank1FontColor = r.Rank1FontColor, rank2FontFamily = r.Rank2FontFamily, rank2FontSizePx = r.Rank2FontSizePx, rank2FontColor = r.Rank2FontColor, rank3FontFamily = r.Rank3FontFamily, rank3FontSizePx = r.Rank3FontSizePx, rank3FontColor = r.Rank3FontColor }) .FirstOrDefaultAsync(ct); return ApiResponse.Ok((object?)config); }) .WithTags("Widget") .AllowAnonymous(); } }