feat: Create layerController.ts with layer management functions
This commit is contained in:
@@ -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' });
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user