csa-backend-test/app/controllers/app.controller.js

130 lines
3.3 KiB
JavaScript

// ENVIRONMENT
require('dotenv').config();
// DATABASE
const { PrismaClient : CMSClient } = require("../../prisma/clients/cms");
const prisma = new CMSClient();
// CONSTANTS
const { badRequestResponse }= require("../res/responses.js");
const { successResponse } = require("../res/responses.js");
const { localTime } = require("../services/time.services.js");
// CONTROLLER
exports.test = async (req, res) => {
try {
return successResponse(res, "API Connected!", null);
} catch (err) {
return badRequestResponse(res, "Error connecting to API", err);
}
}
exports.testSecure = async (req, res) => {
try {
const apiKey = req.headers['x-api-key'];
if (!apiKey) {
return badRequestResponse(res, "API key is required", "Missing api-key header");
}
const validCredential = await prisma.appCredential.findUniqueOrThrow({
where: {
TokenCredential_AC: apiKey
}
});
return successResponse(res, "Secure API Connected!", {
message: "Authentication successful",
credentialId: validCredential.UUID_AC
});
} catch (err) {
return badRequestResponse(res, "Invalid API key", "Unauthorized access");
}
}
exports.testToken = async (req, res) => {
try {
const user = req.locals.user;
return successResponse(res, "Token API Connected!", {
userID: user
});
} catch (err) {
return badRequestResponse(res, "Error validating token", err);
}
}
exports.createToken = async (req, res) => {
try {
const apiKey = req.headers['target-x-api-key'];
const token = apiKey || require('crypto').randomBytes(32).toString('hex');
const newCredential = await prisma.appCredential.create({
data: {
TokenCredential_AC: token,
CreatedAt_AC: localTime(new Date())
}
});
return successResponse(res, "API key created successfully!", {
apiKey: newCredential.TokenCredential_AC,
credentialId: newCredential.UUID_AC,
createdAt: newCredential.CreatedAt_AC
});
} catch (err) {
return badRequestResponse(res, "API key already exists", "Duplicate token");
}
}
exports.deleteToken = async (req, res) => {
try {
const apiKey = req.headers['target-x-api-key'];
if (!apiKey) {
return badRequestResponse(res, "API key is required", "Missing x-api-key header");
}
const deletedCredential = await prisma.appCredential.delete({
where: {
TokenCredential_AC: apiKey
}
});
return successResponse(res, "API key deleted successfully!", {
apiKey: deletedCredential.TokenCredential_AC,
credentialId: deletedCredential.UUID_AC,
deletedAt: new Date().toISOString()
});
} catch (err) {
if (err.code === 'P2025') {
return badRequestResponse(res, "API key not found", "No matching token to delete");
}
return badRequestResponse(res, "Error deleting API key", err);
}
}
exports.getAllTokens = async (req, res) => {
try {
const tokens = await prisma.appCredential.findMany({
orderBy: {
CreatedAt_AC: 'desc'
}
});
return successResponse(res, "API tokens retrieved successfully!", {
total: tokens.length,
tokens: tokens
});
} catch (err) {
return badRequestResponse(res, "Error retrieving API tokens", err);
}
}