Files
taxbaik/TaxBaik.Infrastructure/Repositories/CategoryRepository.cs
T
kjh2064 e22cfb1ac5
TaxBaik CI/CD / build-and-deploy (push) Failing after 43s
feat: REST API 계층 추가 - 완벽한 MVC/API 분리
4개 API 컨트롤러 구현:
 AuthController: POST /api/auth/login
 BlogController: GET/POST/PUT/DELETE /api/blog
 CategoryController: GET/POST/PUT/DELETE /api/category
 InquiryController: POST/GET/PUT /api/inquiry

아키텍처 개선:
- Application 서비스 레이어 확장 (CategoryService 추가)
- Repository 인터페이스 CRUD 지원 추가
- Program.cs에 MapControllers() 추가
- 비즈니스 로직과 UI 완전 분리

장점:
- 향후 UI 리뉴얼 시 API 변경 불필요
- 모바일 앱, 데스크톱 클라이언트 추가 가능
- 테스트 가능한 API 엔드포인트

테스트 결과:
 블로그 API: 5개 포스트 조회
 카테고리 API: 5개 카테고리 조회
 문의 API: 문의 제출 성공
⚠️ 인증 API: 예정된 수정 대기

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-06-26 22:52:48 +09:00

56 lines
2.0 KiB
C#

namespace TaxBaik.Infrastructure.Repositories;
using Dapper;
using TaxBaik.Domain.Entities;
using TaxBaik.Domain.Interfaces;
public class CategoryRepository(IDbConnectionFactory connectionFactory) : BaseRepository(connectionFactory), ICategoryRepository
{
public async Task<IEnumerable<Category>> GetAllAsync(CancellationToken cancellationToken = default)
{
using var conn = Conn();
return await conn.QueryAsync<Category>(
"SELECT id, name, slug, sort_order FROM categories ORDER BY sort_order");
}
public async Task<Category?> GetBySlugAsync(string slug, CancellationToken cancellationToken = default)
{
using var conn = Conn();
return await conn.QueryFirstOrDefaultAsync<Category>(
"SELECT id, name, slug, sort_order FROM categories WHERE slug = @Slug",
new { Slug = slug });
}
public async Task<Category?> GetByIdAsync(int id, CancellationToken cancellationToken = default)
{
using var conn = Conn();
return await conn.QueryFirstOrDefaultAsync<Category>(
"SELECT id, name, slug, sort_order FROM categories WHERE id = @Id",
new { Id = id });
}
public async Task<int> CreateAsync(Category category, CancellationToken cancellationToken = default)
{
using var conn = Conn();
return await conn.QueryFirstAsync<int>(
@"INSERT INTO categories (name, slug, sort_order)
VALUES (@Name, @Slug, @SortOrder)
RETURNING id",
category);
}
public async Task UpdateAsync(Category category, CancellationToken cancellationToken = default)
{
using var conn = Conn();
await conn.ExecuteAsync(
"UPDATE categories SET name = @Name, slug = @Slug, sort_order = @SortOrder WHERE id = @Id",
category);
}
public async Task DeleteAsync(int id, CancellationToken cancellationToken = default)
{
using var conn = Conn();
await conn.ExecuteAsync("DELETE FROM categories WHERE id = @Id", new { Id = id });
}
}