mirror of
https://github.com/AeThex-Corporation/AeThex-OS.git
synced 2026-04-18 14:27:20 +00:00
370 lines
9.7 KiB
TypeScript
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;
|