| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- using Application.Abstractions.Data;
- using Domain.Entities.Forum.ValueObject;
- using Microsoft.EntityFrameworkCore;
- using BoardEntity = Domain.Entities.Forum.Boards.Board;
- using BoardGroupEntity = Domain.Entities.Forum.Boards.BoardGroup;
- using BoardMetaEntity = Domain.Entities.Forum.Boards.BoardMeta;
- namespace Application.Helpers;
- /// <summary>
- /// 물리 게시판 lazy 시드 (d2 §③ M3) — 코드별 물리 Board 행이 없으면 BoardGroup+Board+BoardMeta 를 생성하고 Board.ID 를 반환한다.
- /// 종목 가상보드(CreatePost 의 ResolveStockBoardID)와 동일한 패턴이며, 수익인증(proof)/장전브리핑(briefing) 처럼
- /// 물리 보드가 필요한 곳에서 재사용한다. 마이그레이션 데이터 시드 대신 최초 사용 시점 provisioning 을 택해
- /// (예측 채점처럼) 시드 여부와 무관하게 항상 존재를 보장한다.
- /// </summary>
- public static class BoardSeeder
- {
- /// <summary>수익인증 게시판 코드 — 이미지 필수(RequireImage), 사진/동영상 레이아웃.</summary>
- public const string ProofBoardCode = "proof";
- /// <summary>장전 브리핑 게시판 코드 — 공지 리스트(IsNotice 발행).</summary>
- public const string BriefingBoardCode = "briefing";
- /// <summary>수익인증 게시판(Code="proof")을 해석 — 없으면 이미지 필수·사진/동영상 레이아웃으로 lazy 시드하고 Board.ID 반환.</summary>
- public static Task<int> ResolveProofBoardIDAsync(IAppDbContext db, CancellationToken ct)
- {
- return ResolveAsync(db, ProofBoardCode, "수익인증", meta =>
- {
- meta.List = new Domain.Entities.Forum.Boards.BoardMetaList { Layout = BoardLayout.Media, PerPage = 20 };
- meta.View = new Domain.Entities.Forum.Boards.BoardMetaView { AllowLike = true, AllowBookmark = true, ShowMemberThumb = true };
- meta.Write = new Domain.Entities.Forum.Boards.BoardMetaWrite { AllowEditor = true, AllowImage = true, RequireImage = true };
- meta.Comment = new Domain.Entities.Forum.Boards.BoardMetaComment { EnableComment = true, AllowLike = true };
- }, ct);
- }
- /// <summary>장전 브리핑 게시판(Code="briefing")을 해석 — 없으면 공지 리스트로 lazy 시드하고 Board.ID 반환.</summary>
- public static Task<int> ResolveBriefingBoardIDAsync(IAppDbContext db, CancellationToken ct)
- {
- return ResolveAsync(db, BriefingBoardCode, "장전브리핑", meta =>
- {
- meta.List = new Domain.Entities.Forum.Boards.BoardMetaList { Layout = BoardLayout.Default, PerPage = 20 };
- meta.View = new Domain.Entities.Forum.Boards.BoardMetaView { AllowLike = true, AllowBookmark = true };
- meta.Write = new Domain.Entities.Forum.Boards.BoardMetaWrite { AllowEditor = true, AllowImage = true };
- meta.Comment = new Domain.Entities.Forum.Boards.BoardMetaComment { EnableComment = true, AllowLike = true };
- }, ct);
- }
- private static async Task<int> ResolveAsync(IAppDbContext db, string code, string name, Action<BoardMetaEntity> configureMeta, CancellationToken ct)
- {
- var existing = await db.Board.AsNoTracking().Where(c => c.Code == code).Select(c => (int?)c.ID).FirstOrDefaultAsync(ct);
- if (existing is int id)
- {
- return id;
- }
- var group = await db.BoardGroup.FirstOrDefaultAsync(c => c.Code == code, ct);
- if (group is null)
- {
- group = new BoardGroupEntity { Code = code, Name = name };
- await db.BoardGroup.AddAsync(group, ct);
- await db.SaveChangesAsync(ct);
- }
- var board = new BoardEntity
- {
- BoardGroupID = group.ID,
- Code = code,
- Name = name,
- IsActive = true,
- IsSearch = true
- };
- await db.Board.AddAsync(board, ct);
- await db.SaveChangesAsync(ct);
- var meta = new BoardMetaEntity { BoardID = board.ID };
- configureMeta(meta);
- await db.BoardMeta.AddAsync(meta, ct);
- await db.SaveChangesAsync(ct);
- return board.ID;
- }
- }
|