feat: Create layerController.ts with layer management functions

This commit is contained in:
2026-06-22 20:57:13 +00:00
parent 7fbd1307c5
commit d0599c67b3
+132
View File
@@ -0,0 +1,132 @@
import { FastifyRequest, FastifyReply } from 'fastify';
import { DatabaseInterface } from './database/DatabaseInterface';
import { getDatabase } from './database';
// Type definitions
interface Layer {
id: string;
project_id: string;
name: string;
visible: number;
locked: number;
color?: string;
line_type?: string;
transparency?: number;
sort_order: number;
created_at?: string;
}
// Get all layers for a project
export async function getLayers(request: FastifyRequest, reply: FastifyReply) {
const db: DatabaseInterface = await getDatabase();
const projectId = (request.params as any).projectId;
try {
const layers = await db.getLayers(projectId);
return layers;
} catch (error) {
request.log.error(error);
return reply.status(500).send({ error: 'Failed to fetch layers' });
}
}
// Create a new layer
export async function createLayer(request: FastifyRequest, reply: FastifyReply) {
const db: DatabaseInterface = await getDatabase();
const projectId = (request.params as any).projectId;
const userId = (request.user as any).id;
const { name, visible, locked, color, line_type, transparency, sort_order } = request.body as Layer;
// Generate a new ID for the layer
const layerId = Date.now().toString();
try {
const newLayer = {
id: layerId,
project_id: projectId,
name: name || 'New Layer',
visible: visible !== undefined ? visible : 1,
locked: locked !== undefined ? locked : 0,
color: color || null,
line_type: line_type || null,
transparency: transparency !== undefined ? transparency : 0.0,
sort_order: sort_order !== undefined ? sort_order : 0,
created_at: new Date().toISOString()
};
await db.createLayer(newLayer);
return reply.status(201).send(newLayer);
} catch (error) {
request.log.error(error);
return reply.status(500).send({ error: 'Failed to create layer' });
}
}
// Update a layer
export async function updateLayer(request: FastifyRequest, reply: FastifyReply) {
const db: DatabaseInterface = await getDatabase();
const projectId = (request.params as any).projectId;
const layerId = (request.params as any).layerId;
const updateData = request.body as Partial<Layer>;
try {
// Verify the layer belongs to the project
const existingLayer = await db.getLayerById(layerId);
if (!existingLayer || existingLayer.project_id !== projectId) {
return reply.status(404).send({ error: 'Layer not found' });
}
// Update the layer
const updatedLayer = await db.updateLayer(layerId, updateData);
return updatedLayer;
} catch (error) {
request.log.error(error);
return reply.status(500).send({ error: 'Failed to update layer' });
}
}
// Delete a layer
export async function deleteLayer(request: FastifyRequest, reply: FastifyReply) {
const db: DatabaseInterface = await getDatabase();
const projectId = (request.params as any).projectId;
const layerId = (request.params as any).layerId;
try {
// Verify the layer belongs to the project
const existingLayer = await db.getLayerById(layerId);
if (!existingLayer || existingLayer.project_id !== projectId) {
return reply.status(404).send({ error: 'Layer not found' });
}
// Delete the layer
await db.deleteLayer(layerId);
return reply.status(204).send();
} catch (error) {
request.log.error(error);
return reply.status(500).send({ error: 'Failed to delete layer' });
}
}
// Reorder layers
export async function reorderLayers(request: FastifyRequest, reply: FastifyReply) {
const db: DatabaseInterface = await getDatabase();
const projectId = (request.params as any).projectId;
const { layerIds } = request.body as { layerIds: string[] };
try {
// Update sort_order for each layer
for (let i = 0; i < layerIds.length; i++) {
const layerId = layerIds[i];
// Verify the layer belongs to the project
const existingLayer = await db.getLayerById(layerId);
if (existingLayer && existingLayer.project_id === projectId) {
await db.updateLayer(layerId, { sort_order: i });
}
}
return { message: 'Layers reordered successfully' };
} catch (error) {
request.log.error(error);
return reply.status(500).send({ error: 'Failed to reorder layers' });
}
}