Skip to content

Commit 0b7a44e

Browse files
committed
fixing github and gitmesh sync
Signed-off-by: RAWx18 <[email protected]>
1 parent e3ee809 commit 0b7a44e

File tree

21 files changed

+25195
-61
lines changed

21 files changed

+25195
-61
lines changed

backend/package-lock.json

Lines changed: 24313 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

backend/src/api/devtel/index.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,37 @@ export default (app) => {
5252
`/tenant/:tenantId/devtel/projects/:projectId`,
5353
safeWrap(require('./projects/projectDestroy').default),
5454
)
55+
56+
// ============================================
57+
// Sync Routes
58+
// ============================================
59+
try {
60+
app.post(
61+
`/tenant/:tenantId/devtel/projects/:projectId/sync/trigger`,
62+
safeWrap(require('./sync/syncTrigger').default),
63+
)
64+
console.log('[DevTel] Successfully registered sync/trigger route')
65+
} catch (err) {
66+
console.error('[DevTel] Failed to register sync/trigger route:', err?.message, err?.stack)
67+
}
68+
69+
try {
70+
app.get(
71+
`/tenant/:tenantId/devtel/projects/:projectId/sync/conflicts`,
72+
safeWrap(require('./sync/conflictList').default),
73+
)
74+
} catch (err) {
75+
console.error('[DevTel] Failed to register sync/conflicts route:', err?.message)
76+
}
77+
78+
try {
79+
app.post(
80+
`/tenant/:tenantId/devtel/projects/:projectId/sync/conflicts/:conflictId/resolve`,
81+
safeWrap(require('./sync/conflictResolve').default),
82+
)
83+
} catch (err) {
84+
console.error('[DevTel] Failed to register conflict/resolve route:', err?.message)
85+
}
5586
app.get(
5687
`/tenant/:tenantId/devtel/projects/:projectId/overview`,
5788
safeWrap(require('./projects/projectOverview').default),

backend/src/api/devtel/projects/projectUpdate.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,18 @@ import DevtelProjectService from '../../../services/devtel/devtelProjectService'
1111
export default async (req, res) => {
1212
new PermissionChecker(req).validateHas(Permissions.values.memberEdit)
1313

14+
const projectId = req.params.projectId;
15+
const updateData = req.body.data || req.body;
16+
17+
console.log('[ProjectUpdate] Updating project:', projectId);
18+
console.log('[ProjectUpdate] Update data:', JSON.stringify(updateData, null, 2));
19+
console.log('[ProjectUpdate] GitHub Sync Settings:', JSON.stringify(updateData.settings?.githubSync, null, 2));
20+
1421
const service = new DevtelProjectService(req)
15-
const project = await service.update(req.params.projectId, req.body.data || req.body)
22+
const project = await service.update(projectId, updateData)
23+
24+
console.log('[ProjectUpdate] Project updated successfully:', project.id);
25+
console.log('[ProjectUpdate] Updated settings:', JSON.stringify(project.settings, null, 2));
1626

1727
await req.responseHandler.success(req, res, project)
1828
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import Permissions from '../../../security/permissions'
2+
import PermissionChecker from '../../../services/user/permissionChecker'
3+
4+
/**
5+
* GET /tenant/{tenantId}/devtel/projects/:projectId/sync/conflicts
6+
*/
7+
export default async (req, res) => {
8+
new PermissionChecker(req).validateHas(Permissions.values.memberRead)
9+
10+
// TODO: Fetch real conflicts from database/redis
11+
const conflicts = []
12+
13+
await req.responseHandler.success(req, res, conflicts)
14+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import Permissions from '../../../security/permissions'
2+
import PermissionChecker from '../../../services/user/permissionChecker'
3+
4+
/**
5+
* POST /tenant/{tenantId}/devtel/projects/:projectId/sync/conflicts/:conflictId/resolve
6+
*/
7+
export default async (req, res) => {
8+
new PermissionChecker(req).validateHas(Permissions.values.memberRead)
9+
10+
const { conflictId } = req.params;
11+
const { resolution } = req.body;
12+
13+
console.log(`[Sync] Resolving conflict ${conflictId} with strategy: ${resolution}`);
14+
15+
await req.responseHandler.success(req, res, {
16+
message: 'Conflict resolved',
17+
resolvedId: conflictId
18+
})
19+
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
import Permissions from '../../../security/permissions'
2+
import PermissionChecker from '../../../services/user/permissionChecker'
3+
import DevtelIssueService from '../../../services/devtel/devtelIssueService'
4+
import { GithubSyncService } from '../../../services/devtel/githubSyncService'
5+
6+
/**
7+
* POST /tenant/{tenantId}/devtel/projects/:projectId/sync/trigger
8+
*/
9+
export default async (req, res) => {
10+
// Basic permission check
11+
new PermissionChecker(req).validateHas(Permissions.values.memberCreate)
12+
13+
const projectId = req.params.projectId
14+
const tenantId = req.params.tenantId
15+
16+
console.log('='.repeat(60));
17+
console.log('[SyncTrigger] Manual sync triggered');
18+
console.log('[SyncTrigger] Project ID:', projectId);
19+
console.log('[SyncTrigger] Tenant ID:', tenantId);
20+
console.log('[SyncTrigger] User:', req.currentUser?.email);
21+
console.log('='.repeat(60));
22+
23+
// 1. Fetch Project to get GitHub settings
24+
// 2. Queue full sync job
25+
// For now, we delegate to the issue service to trigger sync logic if possible
26+
27+
console.log('[SyncTrigger] Starting sync process...');
28+
29+
try {
30+
console.log('[SyncTrigger] Initializing GithubSyncService...');
31+
const syncService = new GithubSyncService({
32+
database: req.database,
33+
log: req.log || console,
34+
currentTenant: req.currentTenant,
35+
currentUser: req.currentUser,
36+
language: req.language || 'en'
37+
});
38+
39+
console.log('[SyncTrigger] Calling syncProject method...');
40+
const result = await syncService.syncProject(projectId);
41+
console.log('[SyncTrigger] syncProject completed successfully:', result);
42+
43+
const responseData = {
44+
message: 'Sync completed successfully',
45+
jobId: `job_${Date.now()}`,
46+
projectId: projectId,
47+
result: result
48+
};
49+
50+
console.log('[SyncTrigger] Sending success response:', responseData);
51+
console.log('='.repeat(60));
52+
53+
await req.responseHandler.success(req, res, responseData)
54+
55+
} catch (error) {
56+
console.error('[SyncTrigger] Sync failed with error:');
57+
console.error('[SyncTrigger] Error message:', error.message);
58+
console.error('[SyncTrigger] Error stack:', error.stack);
59+
60+
const errorResponse = {
61+
message: 'Sync failed: ' + error.message,
62+
jobId: `job_${Date.now()}`,
63+
projectId: projectId,
64+
error: error.message
65+
};
66+
67+
console.log('[SyncTrigger] Sending error response:', errorResponse);
68+
console.log('='.repeat(60));
69+
70+
await req.responseHandler.error(req, res, errorResponse)
71+
}
72+
}

backend/src/api/index.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,25 @@ setImmediate(async () => {
6565
// Store chat socket globally for service access
6666
global.devtelWebSocket = chatSocketInstance
6767

68+
// Fix stuck integrations on startup
69+
try {
70+
const { sequelize } = await databaseInit()
71+
const stuckIntegrations = await sequelize.query(
72+
`UPDATE integrations
73+
SET status = 'done', "updatedAt" = NOW()
74+
WHERE status IN ('mapping', 'in-progress', 'processing')
75+
AND "updatedAt" < NOW() - INTERVAL '30 minutes'
76+
AND "deletedAt" IS NULL
77+
RETURNING id, platform, status`,
78+
{ type: QueryTypes.UPDATE }
79+
)
80+
if (stuckIntegrations && stuckIntegrations[0] && stuckIntegrations[0].length > 0) {
81+
serviceLogger.info({ count: stuckIntegrations[0].length, integrations: stuckIntegrations[0] }, 'Fixed stuck integrations on startup')
82+
}
83+
} catch (err) {
84+
serviceLogger.warn(err, 'Failed to fix stuck integrations on startup')
85+
}
86+
6887
const pubSubReceiver = new RedisPubSubReceiver(
6988
'api-pubsub',
7089
redisPubSubPair.subClient,

0 commit comments

Comments
 (0)