기능구현중
This commit is contained in:
59
backend/api/admin/vcs/status.get.ts
Normal file
59
backend/api/admin/vcs/status.get.ts
Normal file
@@ -0,0 +1,59 @@
|
||||
import { query } from '../../../utils/db'
|
||||
import { requireAuth } from '../../../utils/session'
|
||||
|
||||
/**
|
||||
* 전체 VCS 동기화 상태 조회 (관리자용)
|
||||
* GET /api/admin/vcs/status
|
||||
*/
|
||||
export default defineEventHandler(async (event) => {
|
||||
await requireAuth(event)
|
||||
|
||||
// 저장소별 동기화 상태
|
||||
const repos = await query(`
|
||||
SELECT
|
||||
r.repo_id, r.repo_name, r.repo_path,
|
||||
r.last_sync_at, r.last_sync_status, r.last_sync_message,
|
||||
s.server_type, s.server_name,
|
||||
p.project_name,
|
||||
(SELECT COUNT(*) FROM wr_commit_log c WHERE c.repo_id = r.repo_id) as commit_count
|
||||
FROM wr_repository r
|
||||
JOIN wr_vcs_server s ON r.server_id = s.server_id
|
||||
LEFT JOIN wr_project_info p ON r.project_id = p.project_id
|
||||
WHERE r.is_active = true
|
||||
ORDER BY r.last_sync_at DESC NULLS LAST
|
||||
`)
|
||||
|
||||
// 전체 통계
|
||||
const stats = await query(`
|
||||
SELECT
|
||||
COUNT(DISTINCT r.repo_id) as total_repos,
|
||||
COUNT(DISTINCT CASE WHEN r.last_sync_status = 'SUCCESS' THEN r.repo_id END) as success_repos,
|
||||
COUNT(DISTINCT CASE WHEN r.last_sync_status = 'FAILED' THEN r.repo_id END) as failed_repos,
|
||||
COUNT(DISTINCT CASE WHEN r.last_sync_at IS NULL THEN r.repo_id END) as never_synced,
|
||||
(SELECT COUNT(*) FROM wr_commit_log) as total_commits
|
||||
FROM wr_repository r
|
||||
WHERE r.is_active = true
|
||||
`)
|
||||
|
||||
return {
|
||||
repositories: repos.map(r => ({
|
||||
repoId: r.repo_id,
|
||||
repoName: r.repo_name,
|
||||
repoPath: r.repo_path,
|
||||
serverType: r.server_type,
|
||||
serverName: r.server_name,
|
||||
projectName: r.project_name,
|
||||
lastSyncAt: r.last_sync_at,
|
||||
lastSyncStatus: r.last_sync_status,
|
||||
lastSyncMessage: r.last_sync_message,
|
||||
commitCount: parseInt(r.commit_count || '0')
|
||||
})),
|
||||
stats: {
|
||||
totalRepos: parseInt(stats[0]?.total_repos || '0'),
|
||||
successRepos: parseInt(stats[0]?.success_repos || '0'),
|
||||
failedRepos: parseInt(stats[0]?.failed_repos || '0'),
|
||||
neverSynced: parseInt(stats[0]?.never_synced || '0'),
|
||||
totalCommits: parseInt(stats[0]?.total_commits || '0')
|
||||
}
|
||||
}
|
||||
})
|
||||
63
backend/api/admin/vcs/sync-all.post.ts
Normal file
63
backend/api/admin/vcs/sync-all.post.ts
Normal file
@@ -0,0 +1,63 @@
|
||||
import { query } from '../../../utils/db'
|
||||
import { requireAuth } from '../../../utils/session'
|
||||
import { syncGitRepository } from '../../../utils/git-sync'
|
||||
import { syncSvnRepository } from '../../../utils/svn-sync'
|
||||
|
||||
/**
|
||||
* 전체 VCS 저장소 동기화 (관리자용)
|
||||
* POST /api/admin/vcs/sync-all
|
||||
*/
|
||||
export default defineEventHandler(async (event) => {
|
||||
await requireAuth(event)
|
||||
|
||||
// 모든 활성 저장소 조회
|
||||
const repos = await query(`
|
||||
SELECT r.repo_id, r.repo_name, s.server_type
|
||||
FROM wr_repository r
|
||||
JOIN wr_vcs_server s ON r.server_id = s.server_id
|
||||
WHERE r.is_active = true AND s.is_active = true
|
||||
ORDER BY r.repo_name
|
||||
`)
|
||||
|
||||
const results: any[] = []
|
||||
|
||||
for (const repo of repos) {
|
||||
try {
|
||||
let result
|
||||
if (repo.server_type === 'GIT') {
|
||||
result = await syncGitRepository(repo.repo_id)
|
||||
} else if (repo.server_type === 'SVN') {
|
||||
result = await syncSvnRepository(repo.repo_id)
|
||||
} else {
|
||||
result = { success: false, message: '지원하지 않는 서버 타입' }
|
||||
}
|
||||
|
||||
results.push({
|
||||
repoId: repo.repo_id,
|
||||
repoName: repo.repo_name,
|
||||
serverType: repo.server_type,
|
||||
...result
|
||||
})
|
||||
} catch (e: any) {
|
||||
results.push({
|
||||
repoId: repo.repo_id,
|
||||
repoName: repo.repo_name,
|
||||
serverType: repo.server_type,
|
||||
success: false,
|
||||
message: e.message
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
const successCount = results.filter(r => r.success).length
|
||||
const failCount = results.filter(r => !r.success).length
|
||||
|
||||
return {
|
||||
success: failCount === 0,
|
||||
message: `동기화 완료: 성공 ${successCount}개, 실패 ${failCount}개`,
|
||||
totalRepos: repos.length,
|
||||
successCount,
|
||||
failCount,
|
||||
results
|
||||
}
|
||||
})
|
||||
Reference in New Issue
Block a user