File size: 5,935 Bytes
3bc8a85 ee76c0c 4a0287c 60d1a19 ee76c0c 60d1a19 ee76c0c 60d1a19 14b551c 60d1a19 398b28a 60d1a19 398b28a 60d1a19 398b28a 60d1a19 398b28a 14b551c 398b28a 14b551c 398b28a 14b551c 398b28a 14b551c 398b28a 14b551c 398b28a ee76c0c |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 |
import express from 'express';
import axios from 'axios';
import { authenticateApiKey, apiLimiter } from '../middleware/midware.js';
import { Federation } from '../models.js';
const FedsRoutes = express.Router();
/**
* @swagger
* /api/v2/federation/newfed:
* post:
* summary: Create a new federation
* tags: [Federation]
* description: Creates a new federation with a unique name and owner.
* security:
* - apiKeyAuth: []
* requestBody:
* required: true
* content:
* application/json:
* schema:
* type: object
* properties:
* name:
* type: string
* description: The unique name of the federation.
* owner:
* type: integer
* description: The user ID of the federation owner.
* parameters:
* - in: header
* name: x-api-key
* required: true
* description: API key for authentication.
* schema:
* type: string
* responses:
* 200:
* description: Federation created successfully.
* content:
* application/json:
* schema:
* type: object
* properties:
* message:
* type: string
* example: Federation created successfully
* federation:
* type: object
* properties:
* name:
* type: string
* owner:
* type: integer
* banned_users:
* type: array
* items:
* type: integer
* sub_federations:
* type: array
* items:
* type: string
* 400:
* description: Federation already exists or missing parameters.
* 500:
* description: Internal server error.
*/
FedsRoutes.post("/api/v2/federation/newfed", authenticateApiKey, apiLimiter, async (req, res) => {
try {
const { name, owner } = req.body;
const existing = await Federation.findOne({ name });
if (existing) return res.status(400).json({ error: "Federation already exists" });
const federation = new Federation({ name, owner, banned_users: [], sub_federations: [] });
await federation.save();
res.json({ message: "Federation created successfully", federation });
} catch (err) {
res.status(500).json({ error: err.message });
}
});
FedsRoutes.post("/api/v2/federation/subfed", authenticateApiKey, apiLimiter, async (req, res) => {
try {
const { parent_uuid, child_uuid } = req.body;
const parent = await Federation.findOne({ uuid: parent_uuid });
const child = await Federation.findOne({ uuid: child_uuid });
if (!parent || !child) return res.status(404).json({ error: "Federation not found" });
if (!parent.sub_federations.includes(child.uuid)) {
parent.sub_federations.push(child.uuid);
await parent.save();
}
res.json({ message: `Federation ${child.name} is now a sub-federation of ${parent.name}` });
} catch (err) {
res.status(500).json({ error: err.message });
}
});
FedsRoutes.get("/api/v1/federation/getfed/:uuid", authenticateApiKey, apiLimiter, async (req, res) => {
try {
const federation = await Federation.findOne({ uuid: req.params.uuid });
if (!federation) return res.status(404).json({ error: "Federation not found" });
const subFeds = await Federation.find({ uuid: { $in: federation.sub_federations } });
res.json({ federation, sub_federations: subFeds });
} catch (err) {
res.status(500).json({ error: err.message });
}
});
FedsRoutes.post('/api/v2/federation/unban', authenticateApiKey, async (req, res) => {
try {
const { name, user_id } = req.body;
if (!name || !user_id || isNaN(user_id)) {
return res.status(400).json({ error: "Federation name and valid user ID required" });
}
const federation = await Federation.findOne({ name });
if (!federation) {
return res.status(404).json({ error: "Federation not found." });
}
federation.banned_users = federation.banned_users.filter(id => Number(id) !== Number(user_id));
await federation.save();
await Federation.updateMany(
{ uuid: { $in: federation.sub_federations } },
{ $pull: { banned_users: Number(user_id) } }
);
res.json({ success: true, message: `User ${user_id} unbanned from ${name} and its sub-federations.` });
} catch (error) {
res.status(500).json({ error: `Failed to unban user: ${error.message}` });
}
});
FedsRoutes.post("/api/v2/federation/ban", authenticateApiKey, apiLimiter, async (req, res) => {
try {
const { federation_uuid, user_id } = req.body;
if (!federation_uuid || !user_id || isNaN(user_id)) {
return res.status(400).json({ error: "Federation UUID and valid user ID required" });
}
const federation = await Federation.findOne({ uuid: federation_uuid });
if (!federation) return res.status(404).json({ error: "Federation not found" });
if (!federation.banned_users.includes(Number(user_id))) {
federation.banned_users.push(Number(user_id));
await federation.save();
}
await Federation.updateMany(
{ uuid: { $in: federation.sub_federations } },
{ $addToSet: { banned_users: Number(user_id) } }
);
res.json({ message: `User ${user_id} banned in ${federation.name} and all its sub-federations.` });
} catch (err) {
res.status(500).json({ error: err.message });
}
});
export { FedsRoutes }; |