Compare commits

...

4 commits

Author SHA1 Message Date
smfahim25
75ad9eeceb Merge branch 'canvas_updated_be' 2025-03-19 12:51:45 +06:00
b071602b7b Delete .env 2025-03-01 07:16:35 +00:00
Saimon8420
363edc548a all requirement updated, and integrated with dev version of canvas 2025-03-01 13:15:32 +06:00
Saimon8420
c76b18346a all requirement updated, and integrated with dev version of canvas 2025-03-01 13:13:47 +06:00
8 changed files with 126 additions and 18 deletions

21
env.example Normal file
View file

@ -0,0 +1,21 @@
SERVER_URL=
SERVER_PORT=
DATABASE_URL=
MINIO_ACCESS_KEY=
MINIO_SECRET_KEY=
MINIO_ENDPOINT=
MINIO_PORT=
CLERK_SECRET_KEY=
JWT_ACCESS_TOKEN_SECRET=
JWT_REFRESH_TOKEN_SECRET=
# developer canvas server url
CANVAS_SERVER_URL_DEV=
PEXELS_URL=
PEXELS_ACCESS_KEY=

View file

@ -0,0 +1,18 @@
import { ENV } from "../../config/env";
export const getAllDesign = async (token: string) => {
try {
const response = await fetch(`${ENV.CANVAS_SERVER_URL_DEV}/design`, {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
}
});
const data = await response.json();
return data;
} catch (error: any) {
console.log(error);
return { status: 500, message: error.message, token };
}
}

View file

@ -0,0 +1,24 @@
import Elysia from "elysia";
import { verifyAuth } from "../../middlewares/auth.middlewares";
import { getAllDesign } from "./design.controller";
export const designRoute = new Elysia({
prefix: "/design",
tags: ["Design"],
detail: {
description: "Routes for managing designs",
}
}).derive(async ({ cookie }) => {
const authData = await verifyAuth(cookie);
return { authData }; // Inject into context
})
designRoute.get("/", async ({ authData }) => {
if (authData.status !== 200)
return authData;
else {
const token = authData.token;
const response = await getAllDesign(token);
return response;
}
})

View file

@ -3,6 +3,8 @@ import { projectRoutes } from "./project/project.route";
import { uploadRoutes } from "./upload/upload.route"; import { uploadRoutes } from "./upload/upload.route";
import { authRoute } from "./auth/auth.route"; import { authRoute } from "./auth/auth.route";
import { downloadRoute } from "./downloadCount/download.count.route"; import { downloadRoute } from "./downloadCount/download.count.route";
// import { photoLibraryRoutes } from "./photoLibrary/photo.library.route";
import { designRoute } from "./design/design.route";
export const api = new Elysia({ prefix: "" }) export const api = new Elysia({ prefix: "" })
.get("/", () => { .get("/", () => {
@ -13,6 +15,8 @@ export const api = new Elysia({ prefix: "" })
.use(projectRoutes) .use(projectRoutes)
.use(uploadRoutes) .use(uploadRoutes)
.use(downloadRoute) .use(downloadRoute)
// .use(photoLibraryRoutes)
.use(designRoute)
.onError(({ code, error, set }) => { .onError(({ code, error, set }) => {
console.error(`API Error: ${code}`, error); console.error(`API Error: ${code}`, error);
if (code === "NOT_FOUND") { if (code === "NOT_FOUND") {

View file

@ -86,10 +86,10 @@ export const createProject = async (userId: string, token: string) => {
} }
}; };
export const updateProject = async (id: string, body: any, token: string) => { export const updateProject = async (id: string, body: any, token: string, user_id: string) => {
try { try {
// 1. Validate if project exists // 1. Validate if project exists
const existingProject = await db.select().from(projects).where(eq(projects.id, id)).limit(1); const existingProject = await db.select().from(projects).where(eq(projects.id, id));
if (existingProject.length === 0) { if (existingProject.length === 0) {
return { status: 404, message: "Project not found", token }; return { status: 404, message: "Project not found", token };
} }
@ -101,7 +101,8 @@ export const updateProject = async (id: string, body: any, token: string) => {
object, object,
name, name,
description, description,
preview_url preview_url,
userId: user_id,
}).where(eq(projects.id, id)).returning({ }).where(eq(projects.id, id)).returning({
id: projects.id, id: projects.id,
object: projects.object, object: projects.object,

View file

@ -54,7 +54,9 @@ projectRoutes.put("/update/:project_id", async ({ body, params: { project_id },
return authData; return authData;
else { else {
const token = authData.token; const token = authData.token;
const response = await updateProject(project_id, body, token); const user_id = authData?.userId;
// sending user_id to the controller to update the project with the user_id, when user tried to design a existing project from the design project panel
const response = await updateProject(project_id, body, token, user_id as string);
return response; return response;
} }
}, { }, {

View file

@ -4,15 +4,21 @@ import cors from "@elysiajs/cors";
import { ENV } from "./config/env"; import { ENV } from "./config/env";
import { api } from "./api"; import { api } from "./api";
const app = new Elysia() const allowedOrigins = [
"http://localhost:5175",
"http://localhost:5174",
"http://localhost:5173",
"https://dashboard.planpostai.com",
"https://canvas.planpostai.com",
];
const app = new Elysia({
prefix: "",
tags: ["Default"],
})
.use( .use(
cors({ cors({
origin: [ origin: allowedOrigins,
"http://localhost:5175",
"http://localhost:5173",
"https://dashboard.planpostai.com",
"https://canvas.planpostai.com",
],
methods: ["GET", "POST", "PUT", "DELETE", "PATCH", "HEAD", "OPTIONS"], methods: ["GET", "POST", "PUT", "DELETE", "PATCH", "HEAD", "OPTIONS"],
allowedHeaders: [ allowedHeaders: [
"Content-Type", "Content-Type",
@ -25,22 +31,37 @@ const app = new Elysia()
credentials: true, credentials: true,
}) })
) )
.get("/test", () => "Hello World", {})
.use(api)
.use( .use(
swagger({ swagger({
path: "/swagger", path: "/api/docs",
documentation: { documentation: {
openapi: "3.1.0",
info: { info: {
title: "Canvas API", title: "Canvas API",
version: "1.0.0", version: "1.0.0",
description: "Canvas API Documentation", description: "Canvas API Documentation",
}, },
tags: [
{
name: "Projects",
description: "All APIs related to Projects",
},
{
name: "Uploads",
description: "All APIs related to Uploads",
},
],
}, },
}) })
) )
.listen(ENV.SERVER_PORT); .onError(({ code, error }) => {
if (code === "NOT_FOUND") return "Not Found :(";
console.log("hello from app.ts under error");
console.error(error);
});
console.log(`🦊 Elysia is running at ${ENV.SERVER_URL}`); // all routes here
console.log(`Swagger docs available at ${ENV.SERVER_URL}/swagger`); app.use(api);
app.listen(ENV.SERVER_PORT, () => {
console.log(`🦊 Elysia is running at ${ENV.SERVER_URL}:${ENV.SERVER_PORT}`);
});

View file

@ -1,6 +1,7 @@
import "dotenv/config"; import "dotenv/config";
export const ENV = { export const ENV = {
<<<<<<< HEAD
SERVER_URL: process.env.SERVER_URL, SERVER_URL: process.env.SERVER_URL,
SERVER_PORT: process.env.SERVER_PORT || 5000, SERVER_PORT: process.env.SERVER_PORT || 5000,
DATABASE_URL: process.env.DATABASE_URL, DATABASE_URL: process.env.DATABASE_URL,
@ -12,3 +13,19 @@ export const ENV = {
JWT_ACCESS_TOKEN_SECRET: process.env.JWT_ACCESS_TOKEN_SECRET, JWT_ACCESS_TOKEN_SECRET: process.env.JWT_ACCESS_TOKEN_SECRET,
JWT_REFRESH_TOKEN_SECRET: process.env.JWT_REFRESH_TOKEN_SECRET, JWT_REFRESH_TOKEN_SECRET: process.env.JWT_REFRESH_TOKEN_SECRET,
}; };
=======
SERVER_URL: process.env.SERVER_URL,
SERVER_PORT: process.env.SERVER_PORT || 5000,
CANVAS_SERVER_URL_DEV: process.env.CANVAS_SERVER_URL_DEV,
DATABASE_URL: process.env.DATABASE_URL,
MINIO_ACCESS_KEY: process.env.MINIO_ACCESS_KEY,
MINIO_SECRET_KEY: process.env.MINIO_SECRET_KEY,
MINIO_ENDPOINT: process.env.MINIO_ENDPOINT,
MINIO_PORT: process.env.MINIO_PORT,
CLERK_SECRET_KEY: process.env.CLERK_SECRET_KEY,
JWT_ACCESS_TOKEN_SECRET: process.env.JWT_ACCESS_TOKEN_SECRET,
JWT_REFRESH_TOKEN_SECRET: process.env.JWT_REFRESH_TOKEN_SECRET,
PEXELS_URL: process.env.PEXELS_URL,
PEXELS_ACCESS_KEY: process.env.PEXELS_ACCESS_KEY,
}
>>>>>>> canvas_updated_be