mirror of
https://github.com/johndoe6345789/metabuilder.git
synced 2026-04-25 06:14:59 +00:00
code: route,nextjs,frontends (3 files)
This commit is contained in:
@@ -18,27 +18,30 @@ namespace session {
|
||||
*/
|
||||
inline Result<Session> create(InMemoryStore& store, const CreateSessionInput& input) {
|
||||
if (input.user_id.empty()) {
|
||||
return Error::validationError("User ID is required");
|
||||
return Error::validationError("user_id is required");
|
||||
}
|
||||
if (input.token.empty()) {
|
||||
return Error::validationError("token is required");
|
||||
}
|
||||
|
||||
if (store.users.find(input.user_id) == store.users.end()) {
|
||||
return Error::notFound("User not found: " + input.user_id);
|
||||
return Error::validationError("User not found: " + input.user_id);
|
||||
}
|
||||
if (input.ttl_seconds <= 0) {
|
||||
return Error::validationError("TTL must be positive");
|
||||
if (store.session_tokens.find(input.token) != store.session_tokens.end()) {
|
||||
return Error::conflict("Session token already exists: " + input.token);
|
||||
}
|
||||
|
||||
|
||||
Session session;
|
||||
session.id = store.generateId("session", ++store.session_counter);
|
||||
session.user_id = input.user_id;
|
||||
session.token = store.generateToken();
|
||||
session.expires_at = std::chrono::system_clock::now() + std::chrono::seconds(input.ttl_seconds);
|
||||
session.ip_address = input.ip_address;
|
||||
session.user_agent = input.user_agent;
|
||||
session.token = input.token;
|
||||
session.expires_at = input.expires_at;
|
||||
session.created_at = std::chrono::system_clock::now();
|
||||
|
||||
session.last_activity = session.created_at;
|
||||
|
||||
store.sessions[session.id] = session;
|
||||
store.session_tokens[session.token] = session.id;
|
||||
|
||||
|
||||
return Result<Session>(session);
|
||||
}
|
||||
|
||||
|
||||
14
frontends/nextjs/src/app/api/levels/metrics/route.test.tsx
Normal file
14
frontends/nextjs/src/app/api/levels/metrics/route.test.tsx
Normal file
@@ -0,0 +1,14 @@
|
||||
import { describe, expect, it } from 'vitest'
|
||||
|
||||
import { GET } from './route'
|
||||
|
||||
describe('GET /api/levels/metrics', () => {
|
||||
it('returns a summary for every permission level', async () => {
|
||||
const response = await GET(new Request('http://example.com/api/levels/metrics'))
|
||||
const payload = await response.json()
|
||||
|
||||
expect(payload.totalLevels).toBeGreaterThan(0)
|
||||
expect(Array.isArray(payload.summary)).toBe(true)
|
||||
expect(payload.summary.every((entry: any) => typeof entry.capabilityCount === 'number')).toBe(true)
|
||||
})
|
||||
})
|
||||
17
frontends/nextjs/src/app/api/levels/metrics/route.ts
Normal file
17
frontends/nextjs/src/app/api/levels/metrics/route.ts
Normal file
@@ -0,0 +1,17 @@
|
||||
import { NextResponse } from 'next/server'
|
||||
|
||||
import { PERMISSION_LEVELS } from '@/app/levels/levels-data'
|
||||
|
||||
export async function GET() {
|
||||
const summary = PERMISSION_LEVELS.map((level) => ({
|
||||
key: level.key,
|
||||
title: level.title,
|
||||
capabilityCount: level.capabilities.length,
|
||||
taglineLength: level.tagline.length,
|
||||
}))
|
||||
|
||||
return NextResponse.json({
|
||||
totalLevels: PERMISSION_LEVELS.length,
|
||||
summary,
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user