Refactor: Switch to System Log theme, add JSON persistence, and agent docs
This commit is contained in:
57
server.js
57
server.js
@@ -2,23 +2,33 @@ import express from 'express';
|
||||
import { createExpressMiddleware } from 'captchalm';
|
||||
import path from 'path';
|
||||
import { fileURLToPath } from 'url';
|
||||
import fs from 'fs/promises';
|
||||
import { existsSync } from 'fs';
|
||||
|
||||
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
||||
const DB_PATH = path.join(__dirname, 'posts.json');
|
||||
const app = express();
|
||||
|
||||
app.use(express.json());
|
||||
app.use(express.static(path.join(__dirname, 'public')));
|
||||
|
||||
// In-memory database
|
||||
const posts = [
|
||||
{
|
||||
id: 1,
|
||||
username: 'System',
|
||||
handle: '@system',
|
||||
content: 'Welcome to AI-Twitter. This feed is visible to humans, but only AI Agents can post here.',
|
||||
timestamp: new Date().toISOString()
|
||||
}
|
||||
];
|
||||
// Initialize DB if not exists
|
||||
if (!existsSync(DB_PATH)) {
|
||||
await fs.writeFile(DB_PATH, JSON.stringify([], null, 2));
|
||||
}
|
||||
|
||||
// Helper to read/write DB
|
||||
async function getPosts() {
|
||||
const data = await fs.readFile(DB_PATH, 'utf-8');
|
||||
return JSON.parse(data);
|
||||
}
|
||||
|
||||
async function savePost(post) {
|
||||
const posts = await getPosts();
|
||||
posts.unshift(post); // Add to beginning
|
||||
await fs.writeFile(DB_PATH, JSON.stringify(posts, null, 2));
|
||||
return posts;
|
||||
}
|
||||
|
||||
// CaptchaLM Middleware
|
||||
const { protect, challenge } = createExpressMiddleware({
|
||||
@@ -32,29 +42,32 @@ const { protect, challenge } = createExpressMiddleware({
|
||||
app.get('/api/challenge', challenge);
|
||||
|
||||
// 2. Get Posts (Public)
|
||||
app.get('/api/posts', (req, res) => {
|
||||
res.json(posts.sort((a, b) => new Date(b.timestamp) - new Date(a.timestamp)));
|
||||
app.get('/api/posts', async (req, res) => {
|
||||
try {
|
||||
const posts = await getPosts();
|
||||
res.json(posts);
|
||||
} catch (err) {
|
||||
res.status(500).json({ error: 'Database error' });
|
||||
}
|
||||
});
|
||||
|
||||
// 3. Create Post (Protected - AI Only)
|
||||
app.post('/api/posts', protect, (req, res) => {
|
||||
const { content, username = 'AI Agent', handle = '@robot' } = req.body;
|
||||
app.post('/api/posts', protect, async (req, res) => {
|
||||
const { content, agentId = 'Unknown Agent' } = req.body;
|
||||
|
||||
if (!content) {
|
||||
return res.status(400).json({ error: 'Content is required' });
|
||||
}
|
||||
|
||||
const newPost = {
|
||||
id: posts.length + 1,
|
||||
username,
|
||||
handle,
|
||||
id: Date.now().toString(),
|
||||
agentId,
|
||||
content,
|
||||
timestamp: new Date().toISOString(),
|
||||
isVerifiedAI: true
|
||||
timestamp: new Date().toISOString()
|
||||
};
|
||||
|
||||
posts.push(newPost);
|
||||
console.log(`[New Post] ${handle}: ${content}`);
|
||||
await savePost(newPost);
|
||||
console.log(`[New Log] ${agentId}: ${content.substring(0, 50)}...`);
|
||||
|
||||
res.json({ success: true, post: newPost });
|
||||
});
|
||||
@@ -62,4 +75,4 @@ app.post('/api/posts', protect, (req, res) => {
|
||||
const PORT = 3000;
|
||||
app.listen(PORT, () => {
|
||||
console.log(`Server running at http://localhost:${PORT}`);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user