octane-website/src/routes/users.js

64 lines
1.6 KiB
JavaScript
Raw Normal View History

2026-07-08 11:05:21 +02:00
const express = require('express');
2026-07-08 14:24:23 +02:00
const usersRepo = require('../repositories/usersRepo');
const config = require('../config');
2026-07-08 11:05:21 +02:00
const asyncHandler = require('../lib/asyncHandler');
const router = express.Router();
function authentikAccountUrl() {
if (!config.authentikPublicUrl) return null;
return new URL('/if/user/', config.authentikPublicUrl).href;
}
2026-07-08 11:05:21 +02:00
router.get(
'/me',
asyncHandler(async (req, res) => {
const { id, name, display_name, username, email, avatar_url, is_admin } = req.user;
res.json({
id,
name,
hasCustomName: !!display_name,
username,
email,
avatarUrl: avatar_url,
isAdmin: is_admin,
authentikAccountUrl: authentikAccountUrl(),
});
2026-07-08 14:24:23 +02:00
})
);
router.get(
'/me/profile',
asyncHandler(async (req, res) => {
const { id, name, display_name, username, email, avatar_url, groups, is_admin, created_at } = req.user;
2026-07-08 14:24:23 +02:00
const stats = await usersRepo.getActivityStats(id);
res.json({
id,
name,
hasCustomName: !!display_name,
2026-07-08 14:24:23 +02:00
username,
email,
avatarUrl: avatar_url,
groups,
isAdmin: is_admin,
createdAt: created_at,
stats,
authentikAccountUrl: authentikAccountUrl(),
2026-07-08 14:24:23 +02:00
});
2026-07-08 11:05:21 +02:00
})
);
router.patch(
'/me/display-name',
asyncHandler(async (req, res) => {
const { displayName } = req.body || {};
if (displayName && displayName.trim().length > 60) {
return res.status(400).json({ error: 'display_name_too_long' });
}
const user = await usersRepo.updateDisplayName(req.user.id, displayName || '');
res.json({ name: user.name, hasCustomName: !!user.display_name });
})
);
2026-07-08 11:05:21 +02:00
module.exports = router;