Fix production environment variables
- Remove old Confluence variables - Add NEXT_PUBLIC_API_URL for API access 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
232
lambda/filaments/index.js
Normal file
232
lambda/filaments/index.js
Normal file
@@ -0,0 +1,232 @@
|
||||
const AWS = require('aws-sdk');
|
||||
const dynamodb = new AWS.DynamoDB.DocumentClient();
|
||||
const { v4: uuidv4 } = require('uuid');
|
||||
|
||||
const TABLE_NAME = process.env.TABLE_NAME;
|
||||
|
||||
// CORS headers
|
||||
const headers = {
|
||||
'Content-Type': 'application/json',
|
||||
'Access-Control-Allow-Origin': process.env.CORS_ORIGIN || '*',
|
||||
'Access-Control-Allow-Headers': 'Content-Type,Authorization',
|
||||
'Access-Control-Allow-Methods': 'GET,POST,PUT,DELETE,OPTIONS'
|
||||
};
|
||||
|
||||
// Helper function to create response
|
||||
const createResponse = (statusCode, body) => ({
|
||||
statusCode,
|
||||
headers,
|
||||
body: JSON.stringify(body)
|
||||
});
|
||||
|
||||
// GET all filaments or filter by query params
|
||||
const getFilaments = async (event) => {
|
||||
try {
|
||||
const queryParams = event.queryStringParameters || {};
|
||||
|
||||
let params = {
|
||||
TableName: TABLE_NAME
|
||||
};
|
||||
|
||||
// If filtering by brand, type, or status, use the appropriate index
|
||||
if (queryParams.brand) {
|
||||
params = {
|
||||
...params,
|
||||
IndexName: 'brand-index',
|
||||
KeyConditionExpression: 'brand = :brand',
|
||||
ExpressionAttributeValues: {
|
||||
':brand': queryParams.brand
|
||||
}
|
||||
};
|
||||
const result = await dynamodb.query(params).promise();
|
||||
return createResponse(200, result.Items);
|
||||
} else if (queryParams.tip) {
|
||||
params = {
|
||||
...params,
|
||||
IndexName: 'tip-index',
|
||||
KeyConditionExpression: 'tip = :tip',
|
||||
ExpressionAttributeValues: {
|
||||
':tip': queryParams.tip
|
||||
}
|
||||
};
|
||||
const result = await dynamodb.query(params).promise();
|
||||
return createResponse(200, result.Items);
|
||||
} else if (queryParams.status) {
|
||||
params = {
|
||||
...params,
|
||||
IndexName: 'status-index',
|
||||
KeyConditionExpression: 'status = :status',
|
||||
ExpressionAttributeValues: {
|
||||
':status': queryParams.status
|
||||
}
|
||||
};
|
||||
const result = await dynamodb.query(params).promise();
|
||||
return createResponse(200, result.Items);
|
||||
}
|
||||
|
||||
// Get all items
|
||||
const result = await dynamodb.scan(params).promise();
|
||||
return createResponse(200, result.Items);
|
||||
} catch (error) {
|
||||
console.error('Error getting filaments:', error);
|
||||
return createResponse(500, { error: 'Failed to fetch filaments' });
|
||||
}
|
||||
};
|
||||
|
||||
// GET single filament by ID
|
||||
const getFilament = async (event) => {
|
||||
try {
|
||||
const { id } = event.pathParameters;
|
||||
|
||||
const params = {
|
||||
TableName: TABLE_NAME,
|
||||
Key: { id }
|
||||
};
|
||||
|
||||
const result = await dynamodb.get(params).promise();
|
||||
|
||||
if (!result.Item) {
|
||||
return createResponse(404, { error: 'Filament not found' });
|
||||
}
|
||||
|
||||
return createResponse(200, result.Item);
|
||||
} catch (error) {
|
||||
console.error('Error getting filament:', error);
|
||||
return createResponse(500, { error: 'Failed to fetch filament' });
|
||||
}
|
||||
};
|
||||
|
||||
// POST - Create new filament
|
||||
const createFilament = async (event) => {
|
||||
try {
|
||||
const body = JSON.parse(event.body);
|
||||
const timestamp = new Date().toISOString();
|
||||
|
||||
// Determine status based on vakum and otvoreno fields
|
||||
let status = 'new';
|
||||
if (body.otvoreno && body.otvoreno.toLowerCase().includes('otvorena')) {
|
||||
status = 'opened';
|
||||
} else if (body.refill && body.refill.toLowerCase() === 'da') {
|
||||
status = 'refill';
|
||||
}
|
||||
|
||||
const item = {
|
||||
id: uuidv4(),
|
||||
...body,
|
||||
status,
|
||||
createdAt: timestamp,
|
||||
updatedAt: timestamp
|
||||
};
|
||||
|
||||
const params = {
|
||||
TableName: TABLE_NAME,
|
||||
Item: item
|
||||
};
|
||||
|
||||
await dynamodb.put(params).promise();
|
||||
return createResponse(201, item);
|
||||
} catch (error) {
|
||||
console.error('Error creating filament:', error);
|
||||
return createResponse(500, { error: 'Failed to create filament' });
|
||||
}
|
||||
};
|
||||
|
||||
// PUT - Update filament
|
||||
const updateFilament = async (event) => {
|
||||
try {
|
||||
const { id } = event.pathParameters;
|
||||
const body = JSON.parse(event.body);
|
||||
const timestamp = new Date().toISOString();
|
||||
|
||||
// Determine status based on vakum and otvoreno fields
|
||||
let status = 'new';
|
||||
if (body.otvoreno && body.otvoreno.toLowerCase().includes('otvorena')) {
|
||||
status = 'opened';
|
||||
} else if (body.refill && body.refill.toLowerCase() === 'da') {
|
||||
status = 'refill';
|
||||
}
|
||||
|
||||
const params = {
|
||||
TableName: TABLE_NAME,
|
||||
Key: { id },
|
||||
UpdateExpression: `SET
|
||||
brand = :brand,
|
||||
tip = :tip,
|
||||
finish = :finish,
|
||||
boja = :boja,
|
||||
refill = :refill,
|
||||
vakum = :vakum,
|
||||
otvoreno = :otvoreno,
|
||||
kolicina = :kolicina,
|
||||
cena = :cena,
|
||||
#status = :status,
|
||||
updatedAt = :updatedAt`,
|
||||
ExpressionAttributeNames: {
|
||||
'#status': 'status'
|
||||
},
|
||||
ExpressionAttributeValues: {
|
||||
':brand': body.brand,
|
||||
':tip': body.tip,
|
||||
':finish': body.finish,
|
||||
':boja': body.boja,
|
||||
':refill': body.refill,
|
||||
':vakum': body.vakum,
|
||||
':otvoreno': body.otvoreno,
|
||||
':kolicina': body.kolicina,
|
||||
':cena': body.cena,
|
||||
':status': status,
|
||||
':updatedAt': timestamp
|
||||
},
|
||||
ReturnValues: 'ALL_NEW'
|
||||
};
|
||||
|
||||
const result = await dynamodb.update(params).promise();
|
||||
return createResponse(200, result.Attributes);
|
||||
} catch (error) {
|
||||
console.error('Error updating filament:', error);
|
||||
return createResponse(500, { error: 'Failed to update filament' });
|
||||
}
|
||||
};
|
||||
|
||||
// DELETE filament
|
||||
const deleteFilament = async (event) => {
|
||||
try {
|
||||
const { id } = event.pathParameters;
|
||||
|
||||
const params = {
|
||||
TableName: TABLE_NAME,
|
||||
Key: { id }
|
||||
};
|
||||
|
||||
await dynamodb.delete(params).promise();
|
||||
return createResponse(200, { message: 'Filament deleted successfully' });
|
||||
} catch (error) {
|
||||
console.error('Error deleting filament:', error);
|
||||
return createResponse(500, { error: 'Failed to delete filament' });
|
||||
}
|
||||
};
|
||||
|
||||
// Main handler
|
||||
exports.handler = async (event) => {
|
||||
const { httpMethod, resource } = event;
|
||||
|
||||
// Handle CORS preflight
|
||||
if (httpMethod === 'OPTIONS') {
|
||||
return createResponse(200, {});
|
||||
}
|
||||
|
||||
// Route requests
|
||||
if (resource === '/filaments' && httpMethod === 'GET') {
|
||||
return getFilaments(event);
|
||||
} else if (resource === '/filaments' && httpMethod === 'POST') {
|
||||
return createFilament(event);
|
||||
} else if (resource === '/filaments/{id}' && httpMethod === 'GET') {
|
||||
return getFilament(event);
|
||||
} else if (resource === '/filaments/{id}' && httpMethod === 'PUT') {
|
||||
return updateFilament(event);
|
||||
} else if (resource === '/filaments/{id}' && httpMethod === 'DELETE') {
|
||||
return deleteFilament(event);
|
||||
}
|
||||
|
||||
return createResponse(404, { error: 'Not found' });
|
||||
};
|
||||
Reference in New Issue
Block a user