This commit is contained in:
@@ -85,16 +85,12 @@ jobs:
|
||||
TELEGRAM_CHAT_ID="${{ secrets.TAXBAIK_TELEGRAM_CHAT_ID }}"
|
||||
TELEGRAM_INQUIRY_CHAT_ID="${{ secrets.TAXBAIK_TELEGRAM_INQUIRY_CHAT_ID }}"
|
||||
TELEGRAM_SYSTEM_CHAT_ID="${{ secrets.TAXBAIK_TELEGRAM_SYSTEM_CHAT_ID }}"
|
||||
JWT_SECRET_KEY="${{ secrets.TAXBAIK_JWT_SECRET_KEY }}"
|
||||
if [ -z "$JWT_SECRET_KEY" ]; then
|
||||
JWT_SECRET_KEY="$(openssl rand -base64 48 | tr -d '\n')"
|
||||
echo "⚠️ TAXBAIK_JWT_SECRET_KEY is missing; generating a one-off production secret for this deploy." >&2
|
||||
fi
|
||||
# JWT는 현재 관리자 인증에 사용하지 않지만, 포털 인증/토큰 교환용 설정으로 유지한다.
|
||||
# 없으면 런타임에서 AuthService가 실패하므로, CI 배포에서만 한 번 생성해 넣는다.
|
||||
[ -z "$TELEGRAM_BOT_TOKEN" ] && { echo "Missing TAXBAIK_TELEGRAM_BOT_TOKEN" >&2; exit 1; }
|
||||
[ -z "$TELEGRAM_CHAT_ID" ] && { echo "Missing TAXBAIK_TELEGRAM_CHAT_ID" >&2; exit 1; }
|
||||
[ -z "$TELEGRAM_INQUIRY_CHAT_ID" ] && TELEGRAM_INQUIRY_CHAT_ID="$TELEGRAM_CHAT_ID"
|
||||
[ -z "$TELEGRAM_SYSTEM_CHAT_ID" ] && TELEGRAM_SYSTEM_CHAT_ID="-5585148480"
|
||||
JWT_SECRET_KEY="$JWT_SECRET_KEY" \
|
||||
TELEGRAM_BOT_TOKEN="$TELEGRAM_BOT_TOKEN" \
|
||||
TELEGRAM_CHAT_ID="$TELEGRAM_CHAT_ID" \
|
||||
TELEGRAM_INQUIRY_CHAT_ID="$TELEGRAM_INQUIRY_CHAT_ID" \
|
||||
@@ -106,7 +102,6 @@ jobs:
|
||||
"ConnectionStrings": {
|
||||
"Default": "Host=localhost;Database=taxbaikdb;Username=taxbaik;Password=taxbaik123"
|
||||
},
|
||||
"Jwt": {"SecretKey": os.environ["JWT_SECRET_KEY"]},
|
||||
"Telegram": {
|
||||
"BotToken": os.environ["TELEGRAM_BOT_TOKEN"],
|
||||
"ChatId": os.environ["TELEGRAM_CHAT_ID"],
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
namespace TaxBaik.Web.Models;
|
||||
|
||||
public sealed record AdminPageHeaderModel(
|
||||
string Eyebrow,
|
||||
string Title,
|
||||
string? Subtitle,
|
||||
string? ActionHref,
|
||||
string? ActionText);
|
||||
@@ -3,11 +3,11 @@
|
||||
@{ ViewData["Title"] = "공지사항 작성"; }
|
||||
|
||||
<section class="admin-page-shell">
|
||||
<partial name="_AdminPageHeader" model='("Content", "공지사항 작성", "Tabler 표준 폼으로 공지사항을 등록합니다.", null, null)' />
|
||||
@await Html.PartialAsync("_AdminPageHeader", new TaxBaik.Web.Models.AdminPageHeaderModel("Content", "공지사항 작성", "Tabler 표준 폼으로 공지사항을 등록합니다.", null, null))
|
||||
|
||||
<form method="post" class="card">
|
||||
<div class="card-body">
|
||||
<partial name="_ValidationSummary" />
|
||||
@await Html.PartialAsync("_ValidationSummary")
|
||||
<div class="row g-3">
|
||||
<div class="col-lg-8">
|
||||
<label asp-for="Input.Title" class="form-label"></label>
|
||||
@@ -54,3 +54,12 @@
|
||||
</div>
|
||||
</form>
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -3,11 +3,11 @@
|
||||
@{ ViewData["Title"] = "공지사항 상세"; }
|
||||
|
||||
<section class="admin-page-shell">
|
||||
<partial name="_AdminPageHeader" model='("Content", "공지사항 상세", "공지사항의 노출 정보를 확인합니다.", null, null)' />
|
||||
@await Html.PartialAsync("_AdminPageHeader", new TaxBaik.Web.Models.AdminPageHeaderModel("Content", "공지사항 상세", "공지사항의 노출 정보를 확인합니다.", null, null))
|
||||
|
||||
@if (Model.Item is null)
|
||||
{
|
||||
<partial name="_EmptyState" model="공지사항을 찾을 수 없습니다." />
|
||||
@await Html.PartialAsync("_EmptyState", "공지사항을 찾을 수 없습니다.")
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -23,7 +23,7 @@
|
||||
<dt class="col-sm-3">내용</dt>
|
||||
<dd class="col-sm-9"><div class="pre-wrap">@Model.Item.Content</div></dd>
|
||||
<dt class="col-sm-3">활성</dt>
|
||||
<dd class="col-sm-9"><partial name="_StatusBadge" model="@(Model.Item.IsActive ? "active" : "inactive")" /></dd>
|
||||
<dd class="col-sm-9">@await Html.PartialAsync("_StatusBadge", Model.Item.IsActive ? "active" : "inactive")</dd>
|
||||
<dt class="col-sm-3">정렬</dt>
|
||||
<dd class="col-sm-9">@Model.Item.SortOrder</dd>
|
||||
<dt class="col-sm-3">시작일</dt>
|
||||
@@ -45,3 +45,12 @@
|
||||
</div>
|
||||
}
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
@{ ViewData["Title"] = "공지사항 수정"; }
|
||||
|
||||
<section class="admin-page-shell">
|
||||
<partial name="_AdminPageHeader" model='("Content", "공지사항 수정", "기존 공지사항을 Tabler 표준 폼으로 수정합니다.", null, null)' />
|
||||
@await Html.PartialAsync("_AdminPageHeader", new TaxBaik.Web.Models.AdminPageHeaderModel("Content", "공지사항 수정", "기존 공지사항을 Tabler 표준 폼으로 수정합니다.", null, null))
|
||||
|
||||
<div class="card mb-3">
|
||||
<div class="card-body">
|
||||
@@ -15,7 +15,7 @@
|
||||
|
||||
<form method="post" class="card">
|
||||
<div class="card-body">
|
||||
<partial name="_ValidationSummary" />
|
||||
@await Html.PartialAsync("_ValidationSummary")
|
||||
<input type="hidden" asp-for="Input.Id" />
|
||||
<div class="row g-3">
|
||||
<div class="col-lg-8">
|
||||
@@ -66,3 +66,12 @@
|
||||
</div>
|
||||
</form>
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
@{ ViewData["Title"] = "공지사항"; }
|
||||
|
||||
<section class="admin-page-shell">
|
||||
<partial name="_AdminPageHeader" model='("Content", "공지사항 관리", "공지 목록을 서버 렌더링으로 표시합니다.", "/admin/announcements/create", "공지 작성")' />
|
||||
@await Html.PartialAsync("_AdminPageHeader", new TaxBaik.Web.Models.AdminPageHeaderModel("Content", "공지사항 관리", "공지 목록을 서버 렌더링으로 표시합니다.", "/admin/announcements/create", "공지 작성"))
|
||||
<div class="card">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-vcenter card-table table-hover">
|
||||
@@ -19,7 +19,7 @@
|
||||
<tbody>
|
||||
@if (Model.Items.Count == 0)
|
||||
{
|
||||
<tr><td colspan="5"><partial name="_EmptyState" model="공지사항이 없습니다." /></td></tr>
|
||||
<tr><td colspan="5">@await Html.PartialAsync("_EmptyState", "공지사항이 없습니다.")</td></tr>
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -28,7 +28,7 @@
|
||||
<tr>
|
||||
<td class="fw-semibold">@item.Title</td>
|
||||
<td>@item.DisplayType</td>
|
||||
<td><partial name="_StatusBadge" model="@(item.IsActive ? "active" : "inactive")" /></td>
|
||||
<td>@await Html.PartialAsync("_StatusBadge", item.IsActive ? "active" : "inactive")</td>
|
||||
<td>@item.SortOrder</td>
|
||||
<td class="text-end">
|
||||
<div class="btn-list flex-nowrap justify-content-end">
|
||||
@@ -44,3 +44,12 @@
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
ViewData["Title"] = "블로그 등록";
|
||||
}
|
||||
|
||||
<partial name="_BlogEditor" model="new TaxBaik.Web.Pages.Shared.BlogEditorModel(
|
||||
@await Html.PartialAsync("_BlogEditor", new TaxBaik.Web.Pages.Shared.BlogEditorModel(
|
||||
Model.Input.Title,
|
||||
Model.Input.Content,
|
||||
Model.Input.CategoryId,
|
||||
@@ -12,8 +12,17 @@
|
||||
Model.Input.ThumbnailUrl,
|
||||
Model.Input.SeoTitle,
|
||||
Model.Input.SeoDescription,
|
||||
false)" />
|
||||
false))
|
||||
|
||||
@section Scripts {
|
||||
<script src="~/js/admin-blog-editor.js" asp-append-version="true"></script>
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
ViewData["BlogEditorId"] = Model.Id;
|
||||
}
|
||||
|
||||
<partial name="_BlogEditor" model='new TaxBaik.Web.Pages.Shared.BlogEditorModel(
|
||||
@await Html.PartialAsync("_BlogEditor", new TaxBaik.Web.Pages.Shared.BlogEditorModel(
|
||||
Model.Input.Title,
|
||||
Model.Input.Content,
|
||||
Model.Input.CategoryId,
|
||||
@@ -14,8 +14,17 @@
|
||||
Model.Input.SeoTitle,
|
||||
Model.Input.SeoDescription,
|
||||
true,
|
||||
"?handler=Delete")' />
|
||||
"?handler=Delete"))
|
||||
|
||||
@section Scripts {
|
||||
<script src="~/js/admin-blog-editor.js" asp-append-version="true"></script>
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
}
|
||||
|
||||
<section class="admin-page-shell">
|
||||
<partial name="_AdminPageHeader" model='("콘텐츠", "블로그 관리", "검색, 발행 상태, 작성일 기준의 블로그 목록입니다.", "/admin/blog/create", "새 글 작성")' />
|
||||
@await Html.PartialAsync("_AdminPageHeader", new TaxBaik.Web.Models.AdminPageHeaderModel("콘텐츠", "블로그 관리", "검색, 발행 상태, 작성일 기준의 블로그 목록입니다.", "/admin/blog/create", "새 글 작성"))
|
||||
|
||||
<form method="get" class="card mb-3">
|
||||
<div class="card-body">
|
||||
@@ -39,7 +39,7 @@
|
||||
@if (Model.Items.Count == 0)
|
||||
{
|
||||
<tr>
|
||||
<td colspan="5"><partial name="_EmptyState" model="블로그 글이 없습니다." /></td>
|
||||
<td colspan="5">@await Html.PartialAsync("_EmptyState", "블로그 글이 없습니다.")</td>
|
||||
</tr>
|
||||
}
|
||||
else
|
||||
@@ -51,7 +51,7 @@
|
||||
<div class="fw-semibold">@post.Title</div>
|
||||
<div class="text-muted small">@post.Slug</div>
|
||||
</td>
|
||||
<td><partial name="_StatusBadge" model="@(post.IsPublished ? "active" : "inactive")" /></td>
|
||||
<td>@await Html.PartialAsync("_StatusBadge", post.IsPublished ? "active" : "inactive")</td>
|
||||
<td>@post.ViewCount</td>
|
||||
<td>@post.CreatedAt.ToString("yyyy-MM-dd")</td>
|
||||
<td class="text-end">
|
||||
@@ -68,3 +68,12 @@
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -2,6 +2,15 @@
|
||||
@model TaxBaik.Web.Pages.Admin.ClientLogs.IndexModel
|
||||
@{ ViewData["Title"] = "클라이언트 로그"; }
|
||||
<section class="admin-page-shell">
|
||||
<partial name="_AdminPageHeader" model='("운영 로그", "클라이언트 로그", "고객별 작업 이력을 확인합니다.", null, null)' />
|
||||
<partial name="_ComingSoon" model="클라이언트 로그" />
|
||||
@await Html.PartialAsync("_AdminPageHeader", new TaxBaik.Web.Models.AdminPageHeaderModel("운영 로그", "클라이언트 로그", "고객별 작업 이력을 확인합니다.", null, null))
|
||||
@await Html.PartialAsync("_ComingSoon", "클라이언트 로그")
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -5,11 +5,11 @@
|
||||
}
|
||||
|
||||
<section class="admin-page-shell">
|
||||
<partial name="_AdminPageHeader" model='("고객 관리", "고객 등록", "FluentValidation과 Tabler 표준 폼으로 신규 고객을 등록합니다.", null, null)' />
|
||||
@await Html.PartialAsync("_AdminPageHeader", new TaxBaik.Web.Models.AdminPageHeaderModel("고객 관리", "고객 등록", "FluentValidation과 Tabler 표준 폼으로 신규 고객을 등록합니다.", null, null))
|
||||
|
||||
<form method="post" class="card">
|
||||
<div class="card-body">
|
||||
<partial name="_ValidationSummary" />
|
||||
@await Html.PartialAsync("_ValidationSummary")
|
||||
<div class="row g-3">
|
||||
<div class="col-md-6">
|
||||
<label asp-for="Input.Name" class="form-label"></label>
|
||||
@@ -56,3 +56,12 @@
|
||||
</div>
|
||||
</form>
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -5,11 +5,11 @@
|
||||
}
|
||||
|
||||
<section class="admin-page-shell">
|
||||
<partial name="_AdminPageHeader" model='("고객 관리", "고객 상세", "고객의 기본 정보와 수정 경로를 확인합니다.", null, null)' />
|
||||
@await Html.PartialAsync("_AdminPageHeader", new TaxBaik.Web.Models.AdminPageHeaderModel("고객 관리", "고객 상세", "고객의 기본 정보와 수정 경로를 확인합니다.", null, null))
|
||||
|
||||
@if (Model.Client is null)
|
||||
{
|
||||
<partial name="_EmptyState" model="조회한 고객을 찾을 수 없습니다." />
|
||||
@await Html.PartialAsync("_EmptyState", "조회한 고객을 찾을 수 없습니다.")
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -27,7 +27,7 @@
|
||||
<dt class="col-sm-3">이메일</dt>
|
||||
<dd class="col-sm-9">@Model.Client.Email</dd>
|
||||
<dt class="col-sm-3">상태</dt>
|
||||
<dd class="col-sm-9"><partial name="_StatusBadge" model="Model.Client.Status" /></dd>
|
||||
<dd class="col-sm-9">@await Html.PartialAsync("_StatusBadge", Model.Client.Status)</dd>
|
||||
<dt class="col-sm-3">서비스 유형</dt>
|
||||
<dd class="col-sm-9">@Model.Client.ServiceType</dd>
|
||||
<dt class="col-sm-3">세금 유형</dt>
|
||||
@@ -55,3 +55,12 @@
|
||||
</div>
|
||||
}
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
}
|
||||
|
||||
<section class="admin-page-shell">
|
||||
<partial name="_AdminPageHeader" model='("고객 관리", "고객 수정", "기존 고객 정보를 불러와 Tabler 표준 폼으로 수정합니다.", null, null)' />
|
||||
@await Html.PartialAsync("_AdminPageHeader", new TaxBaik.Web.Models.AdminPageHeaderModel("고객 관리", "고객 수정", "기존 고객 정보를 불러와 Tabler 표준 폼으로 수정합니다.", null, null))
|
||||
|
||||
<div class="card mb-3">
|
||||
<div class="card-body">
|
||||
@@ -17,7 +17,7 @@
|
||||
|
||||
<form method="post" class="card">
|
||||
<div class="card-body">
|
||||
<partial name="_ValidationSummary" />
|
||||
@await Html.PartialAsync("_ValidationSummary")
|
||||
<div class="row g-3">
|
||||
<div class="col-md-6">
|
||||
<label asp-for="Input.Name" class="form-label"></label>
|
||||
@@ -76,3 +76,12 @@
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
}
|
||||
|
||||
<section class="admin-page-shell">
|
||||
<partial name="_AdminPageHeader" model='("고객 관리", "고객 목록", "검색, 상태 필터, 페이지네이션 기준의 고객 목록입니다.", "/admin/clients/create", "고객 등록")' />
|
||||
@await Html.PartialAsync("_AdminPageHeader", new TaxBaik.Web.Models.AdminPageHeaderModel("고객 관리", "고객 목록", "검색, 상태 필터, 페이지네이션 기준의 고객 목록입니다.", "/admin/clients/create", "고객 등록"))
|
||||
|
||||
<form method="get" class="card mb-4">
|
||||
<div class="card-body">
|
||||
@@ -56,7 +56,7 @@
|
||||
{
|
||||
<tr>
|
||||
<td colspan="6">
|
||||
<partial name="_EmptyState" model="검색 결과가 없습니다." />
|
||||
@await Html.PartialAsync("_EmptyState", "검색 결과가 없습니다.")
|
||||
</td>
|
||||
</tr>
|
||||
}
|
||||
@@ -68,7 +68,7 @@
|
||||
<td class="fw-semibold">@item.Name</td>
|
||||
<td>@item.CompanyName</td>
|
||||
<td>@item.Phone</td>
|
||||
<td><partial name="_StatusBadge" model="item.Status" /></td>
|
||||
<td>@await Html.PartialAsync("_StatusBadge", item.Status)</td>
|
||||
<td>@item.CreatedAt.ToString("yyyy-MM-dd")</td>
|
||||
<td class="text-end">
|
||||
<div class="btn-list flex-nowrap justify-content-end">
|
||||
@@ -84,5 +84,14 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<partial name="_Pagination" model="new TaxBaik.Web.Pages.Shared.PaginationModel(Model.CurrentPage, Model.TotalPages, Model.BuildPageUrl)" />
|
||||
@await Html.PartialAsync("_Pagination", new TaxBaik.Web.Pages.Shared.PaginationModel(Model.CurrentPage, Model.TotalPages, Model.BuildPageUrl))
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -2,6 +2,15 @@
|
||||
@model TaxBaik.Web.Pages.Admin.CommonCodes.IndexModel
|
||||
@{ ViewData["Title"] = "공통코드"; }
|
||||
<section class="admin-page-shell">
|
||||
<partial name="_AdminPageHeader" model='("운영 설정", "공통 코드", "코드성 데이터를 표준화해 관리합니다.", null, null)' />
|
||||
<partial name="_ComingSoon" model="공통 코드" />
|
||||
@await Html.PartialAsync("_AdminPageHeader", new TaxBaik.Web.Models.AdminPageHeaderModel("운영 설정", "공통 코드", "코드성 데이터를 표준화해 관리합니다.", null, null))
|
||||
@await Html.PartialAsync("_ComingSoon", "공통 코드")
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
@{ ViewData["Title"] = "회사"; }
|
||||
|
||||
<section class="admin-page-shell">
|
||||
<partial name="_AdminPageHeader" model='("CRM", "회사 관리", "고객사 회사를 관리합니다.", null, null)' />
|
||||
@await Html.PartialAsync("_AdminPageHeader", new TaxBaik.Web.Models.AdminPageHeaderModel("CRM", "회사 관리", "고객사 회사를 관리합니다.", null, null))
|
||||
<div class="card">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-vcenter card-table">
|
||||
@@ -13,7 +13,7 @@
|
||||
<tbody>
|
||||
@if (Model.Items.Count == 0)
|
||||
{
|
||||
<tr><td colspan="4"><partial name="_EmptyState" model="회사가 없습니다." /></td></tr>
|
||||
<tr><td colspan="4">@await Html.PartialAsync("_EmptyState", "회사가 없습니다.")</td></tr>
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -23,7 +23,7 @@
|
||||
<td>@item.CompanyCode</td>
|
||||
<td>@item.CompanyName</td>
|
||||
<td>@item.ContactPerson</td>
|
||||
<td><partial name="_StatusBadge" model="@(item.IsActive ? "active" : "inactive")" /></td>
|
||||
<td>@await Html.PartialAsync("_StatusBadge", item.IsActive ? "active" : "inactive")</td>
|
||||
</tr>
|
||||
}
|
||||
}
|
||||
@@ -32,3 +32,12 @@
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -2,6 +2,15 @@
|
||||
@model TaxBaik.Web.Pages.Admin.ConsultingActivities.IndexModel
|
||||
@{ ViewData["Title"] = "상담 활동"; }
|
||||
<section class="admin-page-shell">
|
||||
<partial name="_AdminPageHeader" model='("세무 운영", "상담 활동", "상담 히스토리와 후속 조치를 관리합니다.", null, null)' />
|
||||
<partial name="_ComingSoon" model="상담 활동" />
|
||||
@await Html.PartialAsync("_AdminPageHeader", new TaxBaik.Web.Models.AdminPageHeaderModel("세무 운영", "상담 활동", "상담 히스토리와 후속 조치를 관리합니다.", null, null))
|
||||
@await Html.PartialAsync("_ComingSoon", "상담 활동")
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -2,6 +2,15 @@
|
||||
@model TaxBaik.Web.Pages.Admin.Contracts.IndexModel
|
||||
@{ ViewData["Title"] = "계약"; }
|
||||
<section class="admin-page-shell">
|
||||
<partial name="_AdminPageHeader" model='("세무 운영", "계약 관리", "계약 상태와 만료일을 추적합니다.", null, null)' />
|
||||
<partial name="_ComingSoon" model="계약 관리" />
|
||||
@await Html.PartialAsync("_AdminPageHeader", new TaxBaik.Web.Models.AdminPageHeaderModel("세무 운영", "계약 관리", "계약 상태와 만료일을 추적합니다.", null, null))
|
||||
@await Html.PartialAsync("_ComingSoon", "계약 관리")
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,2 +1,11 @@
|
||||
@page
|
||||
@model TaxBaik.Web.Pages.Admin.Customers.CreateModel
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,2 +1,11 @@
|
||||
@page "/admin/customers/{id:int}"
|
||||
@model TaxBaik.Web.Pages.Admin.Customers.DetailModel
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,2 +1,11 @@
|
||||
@page "/admin/customers/{id:int}/edit"
|
||||
@model TaxBaik.Web.Pages.Admin.Customers.EditModel
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,2 +1,11 @@
|
||||
@page
|
||||
@model TaxBaik.Web.Pages.Admin.Customers.IndexModel
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -118,3 +118,12 @@
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -3,11 +3,11 @@
|
||||
@{ ViewData["Title"] = "FAQ 작성"; }
|
||||
|
||||
<section class="admin-page-shell">
|
||||
<partial name="_AdminPageHeader" model='("Support", "FAQ 작성", "Tabler 표준 폼으로 FAQ를 등록합니다.", null, null)' />
|
||||
@await Html.PartialAsync("_AdminPageHeader", new TaxBaik.Web.Models.AdminPageHeaderModel("Support", "FAQ 작성", "Tabler 표준 폼으로 FAQ를 등록합니다.", null, null))
|
||||
|
||||
<form method="post" class="card">
|
||||
<div class="card-body">
|
||||
<partial name="_ValidationSummary" />
|
||||
@await Html.PartialAsync("_ValidationSummary")
|
||||
<div class="row g-3">
|
||||
<div class="col-lg-8">
|
||||
<label asp-for="Input.Question" class="form-label"></label>
|
||||
@@ -45,3 +45,12 @@
|
||||
</div>
|
||||
</form>
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -3,11 +3,11 @@
|
||||
@{ ViewData["Title"] = "FAQ 상세"; }
|
||||
|
||||
<section class="admin-page-shell">
|
||||
<partial name="_AdminPageHeader" model='("Support", "FAQ 상세", "FAQ의 질문, 답변, 상태를 확인합니다.", null, null)' />
|
||||
@await Html.PartialAsync("_AdminPageHeader", new TaxBaik.Web.Models.AdminPageHeaderModel("Support", "FAQ 상세", "FAQ의 질문, 답변, 상태를 확인합니다.", null, null))
|
||||
|
||||
@if (Model.Item is null)
|
||||
{
|
||||
<partial name="_EmptyState" model="FAQ를 찾을 수 없습니다." />
|
||||
@await Html.PartialAsync("_EmptyState", "FAQ를 찾을 수 없습니다.")
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -23,7 +23,7 @@
|
||||
<dt class="col-sm-3">카테고리</dt>
|
||||
<dd class="col-sm-9">@Model.Item.Category</dd>
|
||||
<dt class="col-sm-3">활성</dt>
|
||||
<dd class="col-sm-9"><partial name="_StatusBadge" model="@(Model.Item.IsActive ? "active" : "inactive")" /></dd>
|
||||
<dd class="col-sm-9">@await Html.PartialAsync("_StatusBadge", Model.Item.IsActive ? "active" : "inactive")</dd>
|
||||
<dt class="col-sm-3">정렬</dt>
|
||||
<dd class="col-sm-9">@Model.Item.SortOrder</dd>
|
||||
</dl>
|
||||
@@ -41,3 +41,12 @@
|
||||
</div>
|
||||
}
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
@{ ViewData["Title"] = "FAQ 수정"; }
|
||||
|
||||
<section class="admin-page-shell">
|
||||
<partial name="_AdminPageHeader" model='("Support", "FAQ 수정", "기존 FAQ를 Tabler 표준 폼으로 수정합니다.", null, null)' />
|
||||
@await Html.PartialAsync("_AdminPageHeader", new TaxBaik.Web.Models.AdminPageHeaderModel("Support", "FAQ 수정", "기존 FAQ를 Tabler 표준 폼으로 수정합니다.", null, null))
|
||||
|
||||
<div class="card mb-3">
|
||||
<div class="card-body">
|
||||
@@ -15,7 +15,7 @@
|
||||
|
||||
<form method="post" class="card">
|
||||
<div class="card-body">
|
||||
<partial name="_ValidationSummary" />
|
||||
@await Html.PartialAsync("_ValidationSummary")
|
||||
<input type="hidden" asp-for="Input.Id" />
|
||||
<div class="row g-3">
|
||||
<div class="col-lg-8">
|
||||
@@ -57,3 +57,12 @@
|
||||
</div>
|
||||
</form>
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
@{ ViewData["Title"] = "FAQ"; }
|
||||
|
||||
<section class="admin-page-shell">
|
||||
<partial name="_AdminPageHeader" model='("Support", "FAQ 관리", "질문과 답변을 관리합니다.", "/admin/faqs/create", "FAQ 작성")' />
|
||||
@await Html.PartialAsync("_AdminPageHeader", new TaxBaik.Web.Models.AdminPageHeaderModel("Support", "FAQ 관리", "질문과 답변을 관리합니다.", "/admin/faqs/create", "FAQ 작성"))
|
||||
<div class="card">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-vcenter card-table table-hover">
|
||||
@@ -13,7 +13,7 @@
|
||||
<tbody>
|
||||
@if (Model.Items.Count == 0)
|
||||
{
|
||||
<tr><td colspan="5"><partial name="_EmptyState" model="FAQ가 없습니다." /></td></tr>
|
||||
<tr><td colspan="5">@await Html.PartialAsync("_EmptyState", "FAQ가 없습니다.")</td></tr>
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -22,7 +22,7 @@
|
||||
<tr>
|
||||
<td>@item.Question</td>
|
||||
<td>@item.Category</td>
|
||||
<td><partial name="_StatusBadge" model="@(item.IsActive ? "active" : "inactive")" /></td>
|
||||
<td>@await Html.PartialAsync("_StatusBadge", item.IsActive ? "active" : "inactive")</td>
|
||||
<td>@item.SortOrder</td>
|
||||
<td class="text-end">
|
||||
<div class="btn-list flex-nowrap justify-content-end">
|
||||
@@ -38,3 +38,12 @@
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -54,3 +54,12 @@
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -3,11 +3,11 @@
|
||||
@{ ViewData["Title"] = "문의 등록"; }
|
||||
|
||||
<section class="admin-page-shell">
|
||||
<partial name="_AdminPageHeader" model='("Customer Requests", "문의 등록", "관리자가 직접 상담 요청을 등록할 수 있습니다.", null, null)' />
|
||||
@await Html.PartialAsync("_AdminPageHeader", new TaxBaik.Web.Models.AdminPageHeaderModel("Customer Requests", "문의 등록", "관리자가 직접 상담 요청을 등록할 수 있습니다.", null, null))
|
||||
|
||||
<form method="post" class="card">
|
||||
<div class="card-body">
|
||||
<partial name="_ValidationSummary" />
|
||||
@await Html.PartialAsync("_ValidationSummary")
|
||||
<div class="row g-3">
|
||||
<div class="col-md-6">
|
||||
<label asp-for="Input.Name" class="form-label"></label>
|
||||
@@ -45,3 +45,12 @@
|
||||
</div>
|
||||
</form>
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -3,11 +3,11 @@
|
||||
@{ ViewData["Title"] = "문의 상세"; }
|
||||
|
||||
<section class="admin-page-shell">
|
||||
<partial name="_AdminPageHeader" model='("Customer Requests", "문의 상세", "문의 요청과 처리 내역을 확인합니다.", null, null)' />
|
||||
@await Html.PartialAsync("_AdminPageHeader", new TaxBaik.Web.Models.AdminPageHeaderModel("Customer Requests", "문의 상세", "문의 요청과 처리 내역을 확인합니다.", null, null))
|
||||
|
||||
@if (Model.Inquiry is null)
|
||||
{
|
||||
<partial name="_EmptyState" model="문의 정보를 찾을 수 없습니다." />
|
||||
@await Html.PartialAsync("_EmptyState", "문의 정보를 찾을 수 없습니다.")
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -25,7 +25,7 @@
|
||||
<dt class="col-sm-3">서비스</dt>
|
||||
<dd class="col-sm-9">@Model.Inquiry.ServiceType</dd>
|
||||
<dt class="col-sm-3">상태</dt>
|
||||
<dd class="col-sm-9"><partial name="_StatusBadge" model="Model.Inquiry.Status" /></dd>
|
||||
<dd class="col-sm-9">@await Html.PartialAsync("_StatusBadge", Model.Inquiry.Status)</dd>
|
||||
<dt class="col-sm-3">메시지</dt>
|
||||
<dd class="col-sm-9"><div class="pre-wrap">@Model.Inquiry.Message</div></dd>
|
||||
<dt class="col-sm-3">관리 메모</dt>
|
||||
@@ -52,3 +52,12 @@
|
||||
</div>
|
||||
}
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
@{ ViewData["Title"] = "문의 수정"; }
|
||||
|
||||
<section class="admin-page-shell">
|
||||
<partial name="_AdminPageHeader" model='("Customer Requests", "문의 수정", "문의 내용을 수정하고 상태를 갱신합니다.", null, null)' />
|
||||
@await Html.PartialAsync("_AdminPageHeader", new TaxBaik.Web.Models.AdminPageHeaderModel("Customer Requests", "문의 수정", "문의 내용을 수정하고 상태를 갱신합니다.", null, null))
|
||||
|
||||
<div class="card mb-3">
|
||||
<div class="card-body">
|
||||
@@ -15,7 +15,7 @@
|
||||
|
||||
<form method="post" class="card">
|
||||
<div class="card-body">
|
||||
<partial name="_ValidationSummary" />
|
||||
@await Html.PartialAsync("_ValidationSummary")
|
||||
<input type="hidden" asp-for="Id" />
|
||||
<div class="row g-3">
|
||||
<div class="col-md-6">
|
||||
@@ -57,3 +57,12 @@
|
||||
</div>
|
||||
</form>
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
@{ ViewData["Title"] = "문의"; }
|
||||
|
||||
<section class="admin-page-shell">
|
||||
<partial name="_AdminPageHeader" model='("Customer Requests", "문의 관리", "상담 요청을 상태별로 확인합니다.", "/admin/inquiries/create", "문의 등록")' />
|
||||
@await Html.PartialAsync("_AdminPageHeader", new TaxBaik.Web.Models.AdminPageHeaderModel("Customer Requests", "문의 관리", "상담 요청을 상태별로 확인합니다.", "/admin/inquiries/create", "문의 등록"))
|
||||
<form method="get" class="card mb-3">
|
||||
<div class="card-body">
|
||||
<div class="row g-3 align-items-end">
|
||||
@@ -33,7 +33,7 @@
|
||||
<tbody>
|
||||
@if (Model.Items.Count == 0)
|
||||
{
|
||||
<tr><td colspan="6"><partial name="_EmptyState" model="문의 목록이 없습니다." /></td></tr>
|
||||
<tr><td colspan="6">@await Html.PartialAsync("_EmptyState", "문의 목록이 없습니다.")</td></tr>
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -43,7 +43,7 @@
|
||||
<td>@item.Name</td>
|
||||
<td>@item.Phone</td>
|
||||
<td>@item.ServiceType</td>
|
||||
<td><partial name="_StatusBadge" model="@(item.Status)" /></td>
|
||||
<td>@await Html.PartialAsync("_StatusBadge", item.Status)</td>
|
||||
<td>@item.CreatedAt.ToString("yyyy-MM-dd")</td>
|
||||
<td class="text-end">
|
||||
<div class="btn-list flex-nowrap justify-content-end">
|
||||
@@ -59,3 +59,12 @@
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -71,3 +71,12 @@
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -13,3 +13,12 @@
|
||||
</section>
|
||||
|
||||
<meta http-equiv="refresh" content="0;url=/admin/login" />
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -2,6 +2,15 @@
|
||||
@model TaxBaik.Web.Pages.Admin.RevenueTrackings.IndexModel
|
||||
@{ ViewData["Title"] = "매출 추적"; }
|
||||
<section class="admin-page-shell">
|
||||
<partial name="_AdminPageHeader" model='("세무 운영", "매출 추적", "월별 매출 추이를 확인하는 분석 화면입니다.", null, null)' />
|
||||
<partial name="_ComingSoon" model="매출 추적" />
|
||||
@await Html.PartialAsync("_AdminPageHeader", new TaxBaik.Web.Models.AdminPageHeaderModel("세무 운영", "매출 추적", "월별 매출 추이를 확인하는 분석 화면입니다.", null, null))
|
||||
@await Html.PartialAsync("_ComingSoon", "매출 추적")
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -2,6 +2,15 @@
|
||||
@model TaxBaik.Web.Pages.Admin.SeasonSimulator.IndexModel
|
||||
@{ ViewData["Title"] = "시즌 시뮬레이터"; }
|
||||
<section class="admin-page-shell">
|
||||
<partial name="_AdminPageHeader" model='("운영 도구", "시즌 시뮬레이터", "정책 변경 시 영향을 미리 확인하는 도구입니다.", null, null)' />
|
||||
<partial name="_ComingSoon" model="시즌 시뮬레이터" />
|
||||
@await Html.PartialAsync("_AdminPageHeader", new TaxBaik.Web.Models.AdminPageHeaderModel("운영 도구", "시즌 시뮬레이터", "정책 변경 시 영향을 미리 확인하는 도구입니다.", null, null))
|
||||
@await Html.PartialAsync("_ComingSoon", "시즌 시뮬레이터")
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -2,6 +2,15 @@
|
||||
@model TaxBaik.Web.Pages.Admin.Settings.IndexModel
|
||||
@{ ViewData["Title"] = "설정"; }
|
||||
<section class="admin-page-shell">
|
||||
<partial name="_AdminPageHeader" model='("환경 설정", "설정", "시스템 기본값과 관리자 운영 정책을 정리합니다.", null, null)' />
|
||||
<partial name="_ComingSoon" model="설정 기능" />
|
||||
@await Html.PartialAsync("_AdminPageHeader", new TaxBaik.Web.Models.AdminPageHeaderModel("환경 설정", "설정", "시스템 기본값과 관리자 운영 정책을 정리합니다.", null, null))
|
||||
@await Html.PartialAsync("_ComingSoon", "설정 기능")
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -2,6 +2,15 @@
|
||||
@model TaxBaik.Web.Pages.Admin.TaxFilingSchedules.IndexModel
|
||||
@{ ViewData["Title"] = "신고 일정"; }
|
||||
<section class="admin-page-shell">
|
||||
<partial name="_AdminPageHeader" model='("세무 운영", "세금 신고 일정", "세무 신고 마감 일정과 상태를 관리합니다.", null, null)' />
|
||||
<partial name="_ComingSoon" model="세금 신고 일정" />
|
||||
@await Html.PartialAsync("_AdminPageHeader", new TaxBaik.Web.Models.AdminPageHeaderModel("세무 운영", "세금 신고 일정", "세무 신고 마감 일정과 상태를 관리합니다.", null, null))
|
||||
@await Html.PartialAsync("_ComingSoon", "세금 신고 일정")
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -2,6 +2,15 @@
|
||||
@model TaxBaik.Web.Pages.Admin.TaxFilings.IndexModel
|
||||
@{ ViewData["Title"] = "세금 신고"; }
|
||||
<section class="admin-page-shell">
|
||||
<partial name="_AdminPageHeader" model='("세무 운영", "세금 신고", "신고 상태를 한 화면에서 관리합니다.", null, null)' />
|
||||
<partial name="_ComingSoon" model="세금 신고 관리" />
|
||||
@await Html.PartialAsync("_AdminPageHeader", new TaxBaik.Web.Models.AdminPageHeaderModel("세무 운영", "세금 신고", "신고 상태를 한 화면에서 관리합니다.", null, null))
|
||||
@await Html.PartialAsync("_ComingSoon", "세금 신고 관리")
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
@{ ViewData["Title"] = "세무 프로필"; }
|
||||
|
||||
<section class="admin-page-shell">
|
||||
<partial name="_AdminPageHeader" model='("Tax", "세무 프로필 관리", "고객별 세무 속성을 관리합니다.", null, null)' />
|
||||
@await Html.PartialAsync("_AdminPageHeader", new TaxBaik.Web.Models.AdminPageHeaderModel("Tax", "세무 프로필 관리", "고객별 세무 속성을 관리합니다.", null, null))
|
||||
<div class="card">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-vcenter card-table">
|
||||
@@ -13,7 +13,7 @@
|
||||
<tbody>
|
||||
@if (Model.Items.Count == 0)
|
||||
{
|
||||
<tr><td colspan="4"><partial name="_EmptyState" model="세무 프로필이 없습니다." /></td></tr>
|
||||
<tr><td colspan="4">@await Html.PartialAsync("_EmptyState", "세무 프로필이 없습니다.")</td></tr>
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -22,7 +22,7 @@
|
||||
<tr>
|
||||
<td>@item.ClientId</td>
|
||||
<td>@item.BusinessType</td>
|
||||
<td><partial name="_StatusBadge" model="@(item.TaxRiskLevel ?? "normal")" /></td>
|
||||
<td>@await Html.PartialAsync("_StatusBadge", item.TaxRiskLevel ?? "normal")</td>
|
||||
<td>@item.NextFilingDueDate?.ToString("yyyy-MM-dd")</td>
|
||||
</tr>
|
||||
}
|
||||
@@ -32,3 +32,12 @@
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -134,3 +134,12 @@
|
||||
@await RenderSectionAsync("Scripts", required: false)
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
@using TaxBaik.Web
|
||||
@namespace TaxBaik.Web.Pages.Admin
|
||||
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -2,3 +2,12 @@
|
||||
Layout = "_AdminLayout";
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
@model (string Eyebrow, string Title, string Subtitle, string? ActionHref, string? ActionText)
|
||||
@model TaxBaik.Web.Models.AdminPageHeaderModel
|
||||
<div class="page-header d-print-none mb-4">
|
||||
<div class="row align-items-center g-2">
|
||||
<div class="col">
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
<div class="col-lg-8">
|
||||
<form method="post" class="card">
|
||||
<div class="card-body">
|
||||
<partial name="_ValidationSummary" />
|
||||
@await Html.PartialAsync("_ValidationSummary")
|
||||
@if (Model.IsEdit)
|
||||
{
|
||||
<input type="hidden" name="Id" value="@ViewData["BlogEditorId"]" />
|
||||
|
||||
@@ -71,7 +71,7 @@
|
||||
</script>
|
||||
</head>
|
||||
<body class="with-mobile-cta" data-kakao-url="https://pf.kakao.com/_xoxchTX">
|
||||
<partial name="_Header" />
|
||||
@await Html.PartialAsync("_Header")
|
||||
<main role="main" class="pb-5">
|
||||
@RenderBody()
|
||||
</main>
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
@using TaxBaik.Web
|
||||
@namespace TaxBaik.Web.Pages
|
||||
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
|
||||
@@ -14,7 +14,7 @@ public class AuthService
|
||||
private readonly ILogger<AuthService> _logger;
|
||||
private readonly ITelegramNotificationService _telegramService;
|
||||
private readonly IHostEnvironment _environment;
|
||||
private readonly string _jwtSecretKey;
|
||||
private readonly string? _jwtSecretKey;
|
||||
private readonly string? _passwordResetToken;
|
||||
private readonly int _accessTokenExpirationMinutes = 60; // Access Token: 1시간 (사용성 향상)
|
||||
private readonly int _refreshTokenExpirationMinutes = 10080; // Refresh Token: 7일
|
||||
@@ -30,7 +30,7 @@ public class AuthService
|
||||
_logger = logger;
|
||||
_telegramService = telegramService;
|
||||
_environment = environment;
|
||||
_jwtSecretKey = configuration["Jwt:SecretKey"] ?? throw new InvalidOperationException("Missing 'Jwt:SecretKey' configuration.");
|
||||
_jwtSecretKey = configuration["Jwt:SecretKey"];
|
||||
_passwordResetToken = configuration["Admin:PasswordResetToken"];
|
||||
}
|
||||
|
||||
@@ -184,7 +184,8 @@ public class AuthService
|
||||
|
||||
private AuthTokenPair GenerateTokenPair(AdminUser user)
|
||||
{
|
||||
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_jwtSecretKey));
|
||||
var jwtSecretKey = GetJwtSecretKey();
|
||||
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSecretKey));
|
||||
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
|
||||
|
||||
var claims = new[]
|
||||
@@ -220,7 +221,7 @@ public class AuthService
|
||||
{
|
||||
try
|
||||
{
|
||||
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_jwtSecretKey));
|
||||
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(GetJwtSecretKey()));
|
||||
var handler = new JwtSecurityTokenHandler();
|
||||
var principal = handler.ValidateToken(token, new TokenValidationParameters
|
||||
{
|
||||
@@ -246,7 +247,7 @@ public class AuthService
|
||||
{
|
||||
try
|
||||
{
|
||||
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_jwtSecretKey));
|
||||
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(GetJwtSecretKey()));
|
||||
var handler = new JwtSecurityTokenHandler();
|
||||
var principal = handler.ValidateToken(token, new TokenValidationParameters
|
||||
{
|
||||
@@ -278,6 +279,14 @@ public class AuthService
|
||||
&& System.Security.Cryptography.CryptographicOperations.FixedTimeEquals(valueBytes, expectedBytes);
|
||||
}
|
||||
|
||||
private string GetJwtSecretKey()
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(_jwtSecretKey))
|
||||
throw new InvalidOperationException("Missing 'Jwt:SecretKey' configuration.");
|
||||
|
||||
return _jwtSecretKey;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public class AuthTokenPair(string accessToken, string refreshToken, int expiresIn)
|
||||
|
||||
Reference in New Issue
Block a user