using Application.Abstractions.Data; using Application.Abstractions.Cache; using Application.Abstractions.Messaging; using SharedKernel.Results; using Microsoft.EntityFrameworkCore; namespace Application.Features.Admin.Forum.BoardMeta.Get; public sealed class Handler(IAppDbContext db, ICacheService cache) : IQueryHandler> { public async Task> Handle(Query request, CancellationToken ct) { var cacheKey = CacheKeys.BoardMeta(request.BoardID); var cached = await cache.GetAsync(cacheKey, ct); if (cached is not null) { return Result.Success(cached); } var board = await db.Board .AsNoTracking() .FirstOrDefaultAsync(x => x.ID == request.BoardID, ct); if (board is null) { return Result.Failure(Error.NotFound("Board.NotFound", "게시판을 찾을 수 없습니다.")); } var meta = await db.BoardMeta .FirstOrDefaultAsync(x => x.BoardID == request.BoardID, ct); if (meta is null) { meta = new Domain.Entities.Forum.Boards.BoardMeta { BoardID = request.BoardID }; db.BoardMeta.Add(meta); await db.SaveChangesAsync(ct); } var response = new Response( meta.ID, meta.BoardID, board.Code, board.Name, meta.List, meta.View, meta.Write, meta.Comment, meta.General, meta.Permission, meta.Notify, meta.NotifyTemplate, meta.Exp); await cache.SetAsync(cacheKey, response, ct); return Result.Success(response); } }