feat: Phase 1 mobile tablet — Jenkins APK, PC tab, in-app update

Capacitor 확장으로 git push 시 Mobile Jenkins 빌드, PC 탭 Android/iPad 다운로드,
앱 내 APK 업데이트, iOS TestFlight API 및 Capacitor ios 프로젝트를 추가한다.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Macbook
2026-06-14 16:31:55 +09:00
parent 36c06b55ea
commit f34104b721
38 changed files with 1468 additions and 15 deletions
+34
View File
@@ -1506,3 +1506,37 @@ export async function fetchTrendSearchDetail(
return request<TrendSearchResultDto>(`/trend-search/detail?${params}`);
}
// ── 모바일 앱 배포 ─────────────────────────────────────────────────────────────
export interface MobileAppReleaseInfoDto {
available: boolean;
fileName?: string;
version?: string;
sizeBytes?: number;
updatedAt?: string;
downloadUrl?: string;
installPageUrl?: string;
iosAvailable?: boolean;
iosTestFlightUrl?: string;
}
export async function loadMobileAppReleaseInfo(): Promise<MobileAppReleaseInfoDto | null> {
return request<MobileAppReleaseInfoDto>('/mobile-app/info');
}
/** semver 유사 비교 — remote > local 이면 true */
export function isRemoteVersionNewer(local: string, remote: string): boolean {
const parse = (v: string) =>
v.trim().replace(/^v/i, '').split(/[.-]/).map(p => parseInt(p, 10)).map(n => (Number.isFinite(n) ? n : 0));
const a = parse(local);
const b = parse(remote);
const len = Math.max(a.length, b.length);
for (let i = 0; i < len; i += 1) {
const av = a[i] ?? 0;
const bv = b[i] ?? 0;
if (bv > av) return true;
if (bv < av) return false;
}
return false;
}