7f3c564605
ga-core (22 tables): - user/role: VO + Mapper + XML (login + RBAC) - org: Grade, Organization (CTE recursive tree), Agent + history - product: InsuranceCompany, Product, Contract - rule: CommissionRate, PayoutRule, OverrideRule, ChargebackRule, ExceptionTypeCode - receive: CompanyProfile, FieldMapping, CodeMapping, RawCommissionData, ParseError - ledger: Recruit, Maintain, Exception (batch insert + cursor) - settle: SettleMaster (UPSERT), Override, Chargeback, Payment, Reconciliation, BatchJobLog - All XMLs use EncryptTypeHandler for PII fields ga-api: - AuthController: login (lock on N fails), refresh, me, password, logout - Domain controllers: Agent, Organization, Contract, Company, Product, Rule, Receive, Ledger (recruit/maintain/exception + approve), Settle (confirm/hold/release), Payment, User, Role (matrix), BatchTrigger - All use @RequirePermission + @DataChangeLog ga-batch: - MonthlySettlementJob: 8 Steps (receiveData, transformData, reconcile, calcRecruit, calcMaintain, chargebackException, calcOverride, aggregate) - DataReceiver strategy + ManualReceiver, MappingEngine stub - CommissionCalculator (pct/tax via MoneyUtil), JobLauncherController DB V13~V15: - V13: 14 indexes (settle_master, ledgers, contract, chargeback, payment, raw, logs) - V14: create_monthly_partition() helper function - V15: v_agent_monthly_summary, v_org_settle_summary, v_chargeback_risk views Infra: - docker-compose: postgres + redis + api + batch + frontend - Multi-stage Dockerfile (gradle build → JRE) ga-frontend (skeleton): - Vite + React 18 + TypeScript + AntD 5 + AG Grid + React Query + Zustand - API request layer (axios + JWT), LoginPage, MainLayout (dynamic menu), Dashboard - nginx.conf for /api proxying
54 lines
1.6 KiB
Java
54 lines
1.6 KiB
Java
package com.ga.api.auth;
|
|
|
|
import com.ga.common.model.ApiResponse;
|
|
import com.ga.core.vo.user.UserResp;
|
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
|
import jakarta.servlet.http.HttpServletRequest;
|
|
import jakarta.validation.Valid;
|
|
import lombok.RequiredArgsConstructor;
|
|
import org.springframework.web.bind.annotation.*;
|
|
|
|
import java.util.Map;
|
|
|
|
@Tag(name = "인증")
|
|
@RestController
|
|
@RequestMapping("/api/auth")
|
|
@RequiredArgsConstructor
|
|
public class AuthController {
|
|
|
|
private final AuthService authService;
|
|
|
|
@PostMapping("/login")
|
|
public ApiResponse<LoginResp> login(@Valid @RequestBody LoginReq req, HttpServletRequest http) {
|
|
return ApiResponse.ok(authService.login(req, ipOf(http), http.getHeader("User-Agent")));
|
|
}
|
|
|
|
@PostMapping("/refresh")
|
|
public ApiResponse<LoginResp> refresh(@RequestBody Map<String, String> body) {
|
|
return ApiResponse.ok(authService.refresh(body.get("refreshToken")));
|
|
}
|
|
|
|
@GetMapping("/me")
|
|
public ApiResponse<UserResp> me() {
|
|
return ApiResponse.ok(authService.me());
|
|
}
|
|
|
|
@PostMapping("/password")
|
|
public ApiResponse<Void> changePassword(@RequestBody Map<String, String> body) {
|
|
authService.changePassword(body.get("oldPassword"), body.get("newPassword"));
|
|
return ApiResponse.ok();
|
|
}
|
|
|
|
@PostMapping("/logout")
|
|
public ApiResponse<Void> logout() {
|
|
authService.logout();
|
|
return ApiResponse.ok();
|
|
}
|
|
|
|
private String ipOf(HttpServletRequest req) {
|
|
String xf = req.getHeader("X-Forwarded-For");
|
|
if (xf != null && !xf.isBlank()) return xf.split(",")[0].trim();
|
|
return req.getRemoteAddr();
|
|
}
|
|
}
|