AeThex-OS/server/community-routes.ts

370 lines
9.7 KiB
TypeScript

import express from 'express';
const app = express.Router();
// Mock data for now - will connect to Supabase later
const mockEvents = [
{
id: '1',
title: 'AeThex Developer Workshop',
description: 'Learn advanced game development techniques with AeThex APIs',
category: 'workshop',
date: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString(),
location: 'Virtual',
price: 0,
attendees: 45,
capacity: 100,
featured: true
},
{
id: '2',
title: 'Web3 Gaming Summit',
description: 'Join industry leaders discussing the future of blockchain gaming',
category: 'conference',
date: new Date(Date.now() + 14 * 24 * 60 * 60 * 1000).toISOString(),
location: 'San Francisco, CA',
price: 299,
attendees: 234,
capacity: 500,
featured: true
},
{
id: '3',
title: 'Monthly Game Dev Meetup',
description: 'Casual meetup for game developers to network and share projects',
category: 'meetup',
date: new Date(Date.now() + 3 * 24 * 60 * 60 * 1000).toISOString(),
location: 'New York, NY',
price: 0,
attendees: 67,
capacity: 80,
featured: false
},
{
id: '4',
title: '48-Hour Game Jam',
description: 'Build a game from scratch in 48 hours with your team',
category: 'hackathon',
date: new Date(Date.now() + 21 * 24 * 60 * 60 * 1000).toISOString(),
location: 'Online',
price: 25,
attendees: 156,
capacity: 200,
featured: true
}
];
const mockOpportunities = [
{
id: '1',
title: 'Senior Game Developer',
company: 'AeThex Studios',
arm: 'codex',
type: 'full-time',
location: 'Remote',
description: 'Build next-generation metaverse experiences using AeThex platform',
requirements: ['5+ years game dev experience', 'Unity/Unreal expertise', 'Multiplayer networking'],
salary_min: 120000,
salary_max: 180000,
posted: new Date(Date.now() - 2 * 24 * 60 * 60 * 1000).toISOString(),
applicants: 23
},
{
id: '2',
title: 'Security Engineer',
company: 'AeThex Corporation',
arm: 'aegis',
type: 'full-time',
location: 'Hybrid - Austin, TX',
description: 'Protect our ecosystem with cutting-edge security solutions',
requirements: ['Security certifications', 'Penetration testing', 'Cloud security'],
salary_min: 150000,
salary_max: 200000,
posted: new Date(Date.now() - 5 * 24 * 60 * 60 * 1000).toISOString(),
applicants: 15
},
{
id: '3',
title: 'Community Manager',
company: 'AeThex Network',
arm: 'axiom',
type: 'full-time',
location: 'Remote',
description: 'Build and nurture our growing community of developers and creators',
requirements: ['3+ years community management', 'Gaming industry experience', 'Content creation'],
salary_min: 70000,
salary_max: 95000,
posted: new Date(Date.now() - 1 * 24 * 60 * 60 * 1000).toISOString(),
applicants: 45
},
{
id: '4',
title: 'Blockchain Developer',
company: 'AeThex Labs',
arm: 'codex',
type: 'contract',
location: 'Remote',
description: 'Develop Web3 integrations for gaming platforms',
requirements: ['Solidity/Rust', 'Smart contracts', 'DeFi experience'],
salary_min: 100000,
salary_max: 150000,
posted: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString(),
applicants: 31
}
];
const mockMessages = [
{
id: '1',
sender_id: 'user_123',
sender_name: 'Alex Chen',
content: 'Hey, saw your mod workshop submission. Really impressive work!',
timestamp: new Date(Date.now() - 2 * 60 * 60 * 1000).toISOString(),
read: false,
avatar: null
},
{
id: '2',
sender_id: 'user_456',
sender_name: 'Jordan Smith',
content: 'Are you attending the developer workshop next week?',
timestamp: new Date(Date.now() - 5 * 60 * 60 * 1000).toISOString(),
read: true,
avatar: null
},
{
id: '3',
sender_id: 'admin_001',
sender_name: 'AeThex Team',
content: 'Your marketplace listing has been approved! It\'s now live.',
timestamp: new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString(),
read: true,
avatar: null
}
];
// ==================== EVENTS ROUTES ====================
// GET /api/events - List all events
app.get('/events', async (req, res) => {
try {
const { category, featured } = req.query;
let filtered = [...mockEvents];
if (category) {
filtered = filtered.filter(e => e.category === category);
}
if (featured === 'true') {
filtered = filtered.filter(e => e.featured);
}
// Sort by date (upcoming first)
filtered.sort((a, b) => new Date(a.date).getTime() - new Date(b.date).getTime());
res.json(filtered);
} catch (error: any) {
res.status(500).json({ error: error.message });
}
});
// GET /api/events/:id - Get single event
app.get('/events/:id', async (req, res) => {
try {
const event = mockEvents.find(e => e.id === req.params.id);
if (!event) {
return res.status(404).json({ error: 'Event not found' });
}
res.json(event);
} catch (error: any) {
res.status(500).json({ error: error.message });
}
});
// POST /api/events/:id/register - Register for event
app.post('/events/:id/register', async (req, res) => {
try {
const event = mockEvents.find(e => e.id === req.params.id);
if (!event) {
return res.status(404).json({ error: 'Event not found' });
}
if (event.attendees >= event.capacity) {
return res.status(400).json({ error: 'Event is full' });
}
// Mock registration
event.attendees += 1;
res.json({
success: true,
message: 'Successfully registered for event',
event
});
} catch (error: any) {
res.status(500).json({ error: error.message });
}
});
// ==================== OPPORTUNITIES ROUTES ====================
// GET /api/opportunities - List all job opportunities
app.get('/opportunities', async (req, res) => {
try {
const { arm, type } = req.query;
let filtered = [...mockOpportunities];
if (arm) {
filtered = filtered.filter(o => o.arm === arm);
}
if (type) {
filtered = filtered.filter(o => o.type === type);
}
// Sort by posted date (newest first)
filtered.sort((a, b) => new Date(b.posted).getTime() - new Date(a.posted).getTime());
res.json(filtered);
} catch (error: any) {
res.status(500).json({ error: error.message });
}
});
// GET /api/opportunities/:id - Get single opportunity
app.get('/opportunities/:id', async (req, res) => {
try {
const opportunity = mockOpportunities.find(o => o.id === req.params.id);
if (!opportunity) {
return res.status(404).json({ error: 'Opportunity not found' });
}
res.json(opportunity);
} catch (error: any) {
res.status(500).json({ error: error.message });
}
});
// POST /api/opportunities/:id/apply - Apply to job
app.post('/opportunities/:id/apply', async (req, res) => {
try {
const opportunity = mockOpportunities.find(o => o.id === req.params.id);
if (!opportunity) {
return res.status(404).json({ error: 'Opportunity not found' });
}
const { resume, cover_letter } = req.body;
if (!resume) {
return res.status(400).json({ error: 'Resume is required' });
}
// Mock application
opportunity.applicants += 1;
res.json({
success: true,
message: 'Application submitted successfully',
opportunity
});
} catch (error: any) {
res.status(500).json({ error: error.message });
}
});
// ==================== MESSAGES ROUTES ====================
// GET /api/messages - List all messages
app.get('/messages', async (req, res) => {
try {
const { unread_only } = req.query;
let filtered = [...mockMessages];
if (unread_only === 'true') {
filtered = filtered.filter(m => !m.read);
}
// Sort by timestamp (newest first)
filtered.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());
res.json(filtered);
} catch (error: any) {
res.status(500).json({ error: error.message });
}
});
// GET /api/messages/:id - Get single message
app.get('/messages/:id', async (req, res) => {
try {
const message = mockMessages.find(m => m.id === req.params.id);
if (!message) {
return res.status(404).json({ error: 'Message not found' });
}
// Mark as read
message.read = true;
res.json(message);
} catch (error: any) {
res.status(500).json({ error: error.message });
}
});
// POST /api/messages - Send new message
app.post('/messages', async (req, res) => {
try {
const { recipient_id, content } = req.body;
if (!recipient_id || !content) {
return res.status(400).json({ error: 'Recipient and content are required' });
}
const newMessage = {
id: String(mockMessages.length + 1),
sender_id: 'current_user',
sender_name: 'You',
content,
timestamp: new Date().toISOString(),
read: false,
avatar: null
};
mockMessages.unshift(newMessage);
res.json({
success: true,
message: 'Message sent',
data: newMessage
});
} catch (error: any) {
res.status(500).json({ error: error.message });
}
});
// PUT /api/messages/:id/read - Mark message as read
app.put('/messages/:id/read', async (req, res) => {
try {
const message = mockMessages.find(m => m.id === req.params.id);
if (!message) {
return res.status(404).json({ error: 'Message not found' });
}
message.read = true;
res.json({ success: true, message });
} catch (error: any) {
res.status(500).json({ error: error.message });
}
});
export default app;