Files
Plugin-Directory/src/server.js

87 lines
2.3 KiB
JavaScript

import express from 'express';
import { WebhookHandler } from './WebhookHandler.js';
import { readFile } from 'fs/promises';
const app = express();
const port = process.env.PORT || 3000;
const webhookSecret = process.env.WEBHOOK_SECRET || '';
app.use(express.json());
const handler = new WebhookHandler({
giteaUrl: process.env.GITEA_URL || 'http://synbox.ruv.wtf:8418',
giteaToken: process.env.GITEA_TOKEN || '',
webhookSecret,
repoOwner: 'litruv',
repoName: 'Plugin-Directory'
});
/**
* Health check endpoint
*/
app.get('/health', (req, res) => {
res.json({ status: 'ok', timestamp: new Date().toISOString() });
});
/**
* List all plugins endpoint
*/
app.get('/plugins', async (req, res) => {
try {
const plugins = await handler.listPlugins();
res.json({ plugins, count: plugins.length });
} catch (error) {
console.error('Error listing plugins:', error);
res.status(500).json({ error: 'Failed to list plugins' });
}
});
/**
* Get specific plugin endpoint
*/
app.get('/plugins/:pluginId', async (req, res) => {
try {
const plugin = await handler.getPlugin(req.params.pluginId);
if (plugin) {
res.json(plugin);
} else {
res.status(404).json({ error: 'Plugin not found' });
}
} catch (error) {
console.error('Error getting plugin:', error);
res.status(500).json({ error: 'Failed to get plugin' });
}
});
/**
* Webhook endpoint for Gitea PR events
*/
app.post('/webhook', async (req, res) => {
try {
const signature = req.headers['x-gitea-signature'];
const event = req.headers['x-gitea-event'];
if (!handler.verifySignature(req.body, signature)) {
console.warn('Invalid webhook signature');
return res.status(401).json({ error: 'Invalid signature' });
}
console.log(`Received webhook event: ${event}`);
if (event === 'pull_request') {
await handler.handlePullRequest(req.body);
}
res.json({ status: 'processed' });
} catch (error) {
console.error('Webhook error:', error);
res.status(500).json({ error: 'Webhook processing failed' });
}
});
app.listen(port, () => {
console.log(`Plugin Directory server running on port ${port}`);
console.log(`Webhook endpoint: http://litruv-sub:${port}/webhook`);
console.log(`Plugin list: http://litruv-sub:${port}/plugins`);
});