diff --git a/astro.config.mjs b/astro.config.mjs index f95cddf..6201f94 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -64,11 +64,12 @@ export default defineConfig({ changeOrigin: true, rewrite: (path) => path.replace(/^\/api\/catalog-assets/, "") }, - "/images": { - target: "http://localhost:8080", - changeOrigin: true + "/api/packages": { + target: "http://localhost:8080/api/packages", + changeOrigin: true, + rewrite: (path) => path.replace(/^\/api\/packages/, "") }, - "/videos": { + "/packages": { target: "http://localhost:8080", changeOrigin: true }, @@ -82,14 +83,6 @@ export default defineConfig({ target: "http://localhost:8080", changeOrigin: true }, - "/api/packages": { - target: "http://localhost:8080", - changeOrigin: true - }, - "/api/catalog-pages": { - target: "http://localhost:8080", - changeOrigin: true - } } } }, diff --git a/package.json b/package.json index ba74479..2247e07 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,6 @@ "concurrently": "^8.2.2", "fastify": "^5.0.0", "form-data": "^4.0.1", - "formdata-node": "^6.0.3", "gradient-string": "^3.0.0", "libcurl.js-new": "npm:libcurl.js@^0.6.16", "nanostores": "^0.10.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9ae8ee6..80921fc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -83,9 +83,6 @@ importers: form-data: specifier: ^4.0.1 version: 4.0.1 - formdata-node: - specifier: ^6.0.3 - version: 6.0.3 gradient-string: specifier: ^3.0.0 version: 3.0.0 @@ -1937,10 +1934,6 @@ packages: resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} engines: {node: '>= 6'} - formdata-node@6.0.3: - resolution: {integrity: sha512-8e1++BCiTzUno9v5IZ2J6bv4RU+3UKDmqWUQD0MIMVCd9AdhWkO1gw57oo1mNEX1dMq2EGI+FbWz4B92pscSQg==} - engines: {node: '>= 18'} - forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} @@ -6094,8 +6087,6 @@ snapshots: combined-stream: 1.0.8 mime-types: 2.1.35 - formdata-node@6.0.3: {} - forwarded@0.2.0: {} fraction.js@4.3.7: {} diff --git a/server/dbSetup.ts b/server/dbSetup.ts index 7e5a08a..e095810 100644 --- a/server/dbSetup.ts +++ b/server/dbSetup.ts @@ -33,23 +33,23 @@ async function setupDB(db: ModelStatic) { { package_name: 'com.nebula.gruvbox', title: 'Gruvbox', - image: 'com.nebula.gruvbox.jpeg', + image: 'gruvbox.jpeg', author: 'Nebula Services', version: '1.0.0', description: 'The gruvbox theme', tags: ["Theme", "Simple"], - payload: "com.nebula.gruvbox.css", + payload: "gruvbox.css", type: 'theme' }, { package_name: 'com.nebula.oled', title: 'Oled theme', - image: 'com.nebula.oled.jpg', + image: 'oled.jpg', author: 'Nebula Services', version: '1.0.0', description: 'A sleek & simple Oled theme for Nebula', tags: ['Theme', 'Simple', 'Sleek'], - payload: 'com.nebula.oled.css', + payload: 'oled.css', type: 'theme' } ] diff --git a/server/server.ts b/server/server.ts index 8b301d7..06311be 100644 --- a/server/server.ts +++ b/server/server.ts @@ -13,6 +13,7 @@ import { DataTypes, InferAttributes, InferCreationAttributes, Model, Sequelize } import { pipeline } from "node:stream/promises"; import { createWriteStream } from "node:fs"; import { setupDB } from "./dbSetup.js"; +import { access, constants, mkdir } from "node:fs/promises"; const app = Fastify({ logger: parsedDoc.server.server.logging, ignoreDuplicateSlashes: true, ignoreTrailingSlash: true, serverFactory: serverFactory }); @@ -43,7 +44,7 @@ interface Catalog { interface CatalogModel extends Catalog, Model, InferCreationAttributes> {}; const catalogAssets = db.define("catalog_assets", { - package_name: { type: DataTypes.TEXT, unique: true }, + package_name: { type: DataTypes.STRING, unique: true }, title: { type: DataTypes.TEXT }, description: { type: DataTypes.TEXT }, author: { type: DataTypes.TEXT }, @@ -68,25 +69,10 @@ await app.register(fastifyStatic, { }); await app.register(fastifyStatic, { - root: fileURLToPath(new URL('../database_assets/image', import.meta.url)), - prefix: '/images/', + root: fileURLToPath(new URL('../database_assets', import.meta.url)), + prefix: '/packages/', decorateReply: false }); -await app.register(fastifyStatic, { - root: fileURLToPath(new URL('../database_assets/video', import.meta.url)), - prefix: '/videos/', - decorateReply: false -}); -await app.register(fastifyStatic, { - root: fileURLToPath(new URL('../database_assets/styles', import.meta.url)), - prefix: '/styles/', - decorateReply: false -}); -await app.register(fastifyStatic, { - root: fileURLToPath(new URL('../database_assets/scripts', import.meta.url)), - prefix: '/scripts/', - decorateReply: false -}); await app.register(fastifyMiddie); @@ -155,75 +141,65 @@ app.get("/api/packages/:package", async (request: PackageReq, reply) => { } }); -type UploadReq = FastifyRequest<{Headers: { psk: string }}>; -type CreateReq = FastifyRequest<{Headers: { psk: string}, Body: { uuid: string, title: string, image: string, author: string, version: string, description: string, tags: object | any, payload: string, background_video: string, background_image: string, type: string }}>; -async function verifyReq(request: UploadReq | CreateReq, reply: FastifyReply, upload: Boolean, data: any) { - return new Promise((resolve, reject) => { - if (parsedDoc.marketplace.enabled === false) { - reply.status(500).send({ error: 'Marketplace is disabled!' }); - reject(); - } - else if (request.headers.psk !== parsedDoc.marketplace.psk) { - reply.status(403).send({ error: 'PSK not correct!' }); - reject(); - } - else if (upload && !data) { - reply.status(400).send({ error: 'No file uploaded!' }); - reject(); - } - else { resolve(); } - }); +type UploadReq = FastifyRequest<{Headers: { psk: string, packagename: string }}>; +type CreateReq = FastifyRequest<{Headers: { psk: string }, + Body: { + uuid: string, + title: string, + image: string, + author: string, + version: string, + description: string, + tags: object | any, + payload: string, + background_video: string, + background_image: string, + type: CatalogType +}}>; +interface VerifyStatus { + status: number; + error?: Error; +} +async function verifyReq(request: UploadReq | CreateReq, upload: Boolean, data: any): Promise { + if (parsedDoc.marketplace.enabled === false) { + return {status: 500, error: new Error('Marketplace Is disabled!')}; + } + else if (request.headers.psk !== parsedDoc.marketplace.psk) { + return {status: 403, error: new Error("PSK isn't correct!")}; + } + else if(upload && !request.headers.packagename) { + return {status: 500, error: new Error('No packagename defined!')}; + } + else if (upload && !data) { + return {status: 400, error: new Error('No file uploaded!')}; + } + else { return {status: 200 }; } } -app.post("/api/upload-image", async (request: UploadReq, reply) => { +app.post("/api/upload-asset", async (request: UploadReq, reply) => { const data = await request.file(); - verifyReq(request, reply, true, data) - .then(async () => { - await pipeline(data.file, createWriteStream(fileURLToPath(new URL(`../database_assets/image/${data.filename}`, import.meta.url)))); - reply.send({ message: 'File uploaded successfully!', filename: data.filename }); - }) - .catch(() => { - if (parsedDoc.server.server.logging) { console.error(chalk.yellow.bold('Caught error from verify function. \n Error caused while uploading image')) }; - }); -}); -app.post("/api/upload-video", async (request: UploadReq, reply) => { - const data = await request.file(); - verifyReq(request, reply, true, data) - .then(async () => { - await pipeline(data.file, createWriteStream(fileURLToPath(new URL(`../database_assets/video/${data.filename}`, import.meta.url)))); - reply.send({ message: 'File uploaded successfully!', filename: data.filename }); - }) - .catch(() => { - if (parsedDoc.server.server.logging) { console.error(chalk.yellow.bold('Caught error from verify function. \n Error caused while uploading video')) }; - }); -}); -app.post("/api/upload-style", async (request: UploadReq, reply) => { - const data = await request.file(); - verifyReq(request, reply, true, data) - .then(async () => { - await pipeline(data.file, createWriteStream(fileURLToPath(new URL(`../database_assets/styles/${data.filename}`, import.meta.url)))); - reply.send({ message: 'File uploaded successfully!', filename: data.filename }); - }) - .catch(() => { - if (parsedDoc.server.server.logging) { console.error(chalk.yellow.bold('Caught error from verify function. \n Error caused while uploading style')) }; - }); -}); -app.post("/api/upload-script", async (request: UploadReq, reply) => { - const data = await request.file(); - verifyReq(request, reply, true, data) - .then(async () => { - await pipeline(data.file, createWriteStream(fileURLToPath(new URL(`../database_assets/video/${data.filename}`, import.meta.url)))); - reply.send({ message: 'File uploaded successfully!', filename: data.filename }); - }) - .catch(() => { - if (parsedDoc.server.server.logging) { console.error(chalk.yellow.bold('Caught error from verify function. \n Error caused while uploading script')) }; - }); + const verify: VerifyStatus = await verifyReq(request, true, data); + if (verify.error !== undefined) { + reply.status(verify.status).send({ status: verify.error.message }); + } + else { + try { + await pipeline(data.file, createWriteStream(fileURLToPath(new URL(`../database_assets/${request.headers.packagename}/${data.filename}`, import.meta.url)))); + } + catch (error) { + return reply.status(500).send({ status: `File couldn't be uploaded! (Package most likely doesn't exist)` }); + } + return reply.status(verify.status).send({ status: 'File uploaded successfully!' }); + } }); app.post("/api/create-package", async (request: CreateReq, reply) => { - verifyReq(request, reply, false, undefined) - .then(async () => { - await catalogAssets.create({ + const verify: VerifyStatus = await verifyReq(request, false, undefined); + if (verify.error !== undefined) { + reply.status(verify.status).send({ status: verify.error.message }); + } + else { + const body: Catalog = { package_name: request.body.uuid, title: request.body.title, image: request.body.image, @@ -235,11 +211,30 @@ app.post("/api/create-package", async (request: CreateReq, reply) => { background_video: request.body.background_video, background_image: request.body.background_image, type: request.body.type as CatalogType + } + await catalogAssets.create({ + package_name: body.package_name, + title: body.title, + image: body.image, + author: body.author, + version: body.version, + description: body.description, + tags: body.tags, + payload: body.payload, + background_video: body.background_video, + background_image: body.background_image, + type: body.type }); - }) - .catch(async () => { - if (parsedDoc.server.server.logging) { console.error(chalk.yellow.bold('Caught error from verify function. \n Error caused while creating package')) }; - }); + const assets = fileURLToPath(new URL('../database_assets', import.meta.url)); + try { + await access(`${assets}/${body.package_name}/`, constants.F_OK); + return reply.status(500).send({ status: 'Package already exists!' }); + } + catch (err) { + await mkdir(`${assets}/${body.package_name}/`); + return reply.status(verify.status).send({ status: 'Package created successfully!' }); + } + } }); app.use(ssrHandler); diff --git a/src/components/catalog/CatalogCard.svelte b/src/components/catalog/CatalogCard.svelte index faaee00..c874497 100644 --- a/src/components/catalog/CatalogCard.svelte +++ b/src/components/catalog/CatalogCard.svelte @@ -21,7 +21,7 @@ const assets = getAssets(); {#each Object.entries(data) as [key, asset]}
- {asset.title} + {asset.title}

{asset.title}

{asset.description}

diff --git a/src/components/catalog/InstalledThemes.svelte b/src/components/catalog/InstalledThemes.svelte index d53ab41..ef15493 100644 --- a/src/components/catalog/InstalledThemes.svelte +++ b/src/components/catalog/InstalledThemes.svelte @@ -39,8 +39,8 @@ let compRef = []; {#each Object.entries(data) as [key, asset]}
-
{settings.marketPlaceSettings.changeTheme(false, asset.payload, asset.background_video, asset.background_image)}}> - theme +
{settings.marketPlaceSettings.changeTheme(false, asset.payload, asset.background_video, asset.background_image, asset.package_name)}}> + theme
{asset.title}
@@ -50,7 +50,7 @@ let compRef = [];
-
+ diff --git a/src/pages/catalog/package/[...packageName].astro b/src/pages/catalog/package/[...packageName].astro index 4d89d6d..828fec8 100644 --- a/src/pages/catalog/package/[...packageName].astro +++ b/src/pages/catalog/package/[...packageName].astro @@ -11,14 +11,14 @@ const assetsJson = await response.json(); {!assetsJson.error &&
{assetsJson.background_video && -