diff --git a/.gitea/workflows/ci-dev.yml b/.gitea/workflows/ci-dev.yml new file mode 100755 index 0000000..77039c8 --- /dev/null +++ b/.gitea/workflows/ci-dev.yml @@ -0,0 +1,30 @@ +version: "1" +name: Publish Development Docker Image +on: + push: + tags: + - "v[0-9]+\\.[0-9]+\\.[0-9]+-dev" + +jobs: + build: + name: Publish Development Docker Image + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v1 + + - name: Login to Registry + run: echo "${{ secrets.ACCESS_TOKEN }}" | docker login git.altaiar.dev -u "${{ secrets.USERNAME }}" --password-stdin + + - name: Build & Tag Image + run: | + docker build --build-arg APP_VERSION=${{ gitea.ref_name }} -t git.altaiar.dev/${{ gitea.repository }}:${{ gitea.ref_name }} . + docker tag git.altaiar.dev/${{ gitea.repository }}:${{ gitea.ref_name }} git.altaiar.dev/${{ gitea.repository }}:dev + + - name: Push Images + run: | + docker push git.altaiar.dev/${{ gitea.repository }}:${{ gitea.ref_name }} + docker push git.altaiar.dev/${{ gitea.repository }}:dev diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index b6d0171..e8d0692 100755 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -1,10 +1,9 @@ version: "1" name: Publish Docker Image - on: push: tags: - - "*" + - "v[0-9]+\\.[0-9]+\\.[0-9]+" jobs: build: diff --git a/api/package.json b/api/package.json index 02c0e84..a49de70 100755 --- a/api/package.json +++ b/api/package.json @@ -9,8 +9,8 @@ "@redwoodjs/api-server": "8.4.0", "@redwoodjs/auth-dbauth-api": "8.4.0", "@redwoodjs/graphql-server": "8.4.0", - "@tus/file-store": "^1.4.0", - "@tus/server": "^1.7.0", + "@tus/file-store": "^2.0.0", + "@tus/server": "^2.0.0", "countries-list": "^3.1.1", "graphql-scalars": "^1.23.0", "nodemailer": "^6.9.14" diff --git a/api/src/lib/tus.ts b/api/src/lib/tus.ts index b13b648..1ee8332 100755 --- a/api/src/lib/tus.ts +++ b/api/src/lib/tus.ts @@ -19,7 +19,7 @@ interface User { resetTokenExpiresAt: Date | null } -export const handleTusUpload = ( +export const handleTusUpload = async ( req: FastifyRequest, res: FastifyReply, tusHandler: Server, @@ -28,7 +28,7 @@ export const handleTusUpload = ( if (isProduction) { if (req.method === 'OPTIONS') handleOptionsRequest(res) else if (isPublicEndpoint && req.method === 'GET') - tusHandler.handle(req.raw, res.raw) + await tusHandler.handle(req.raw, res.raw) else if (['GET', 'POST', 'HEAD', 'PATCH'].includes(req.method)) { if (req.headers.cookie) handleAuthenticatedRequest(req, res, tusHandler) else { @@ -41,7 +41,7 @@ export const handleTusUpload = ( } } else { setCorsHeaders(res) - tusHandler.handle(req.raw, res.raw) + await tusHandler.handle(req.raw, res.raw) } } diff --git a/api/src/server.ts b/api/src/server.ts index e32f66a..2f6383f 100755 --- a/api/src/server.ts +++ b/api/src/server.ts @@ -1,8 +1,6 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import Cors from '@fastify/cors' import RateLimit from '@fastify/rate-limit' -import { FileStore } from '@tus/file-store' -import { Server } from '@tus/server' import { isProduction } from '@redwoodjs/api/logger' import { createServer } from '@redwoodjs/api-server' @@ -17,6 +15,8 @@ enum Theme { ;(async () => { const { countries } = await import('countries-list') + const { FileStore } = await import('@tus/file-store') + const { Server } = await import('@tus/server') if (!Object.keys(countries).includes(process.env.COUNTRY)) throw new Error( @@ -52,7 +52,10 @@ enum Theme { datastore: new FileStore({ directory: `./files_${isProduction ? 'prod' : 'dev'}`, }), - onResponseError: (_req, res, _err) => logger.error(res), + onResponseError(_, err) { + logger.error(err) + return { status_code: 500, body: 'Internal Server Error' } + }, }) server.addContentTypeParser( diff --git a/api/tsconfig.json b/api/tsconfig.json index dc27187..69d43dd 100755 --- a/api/tsconfig.json +++ b/api/tsconfig.json @@ -4,8 +4,8 @@ "allowJs": true, "esModuleInterop": true, "target": "ES2023", - "module": "Node16", - "moduleResolution": "Node16", + "module": "NodeNext", + "moduleResolution": "nodenext", "skipLibCheck": false, "rootDirs": [ "./src", diff --git a/web/src/components/PDF/PDF.tsx b/web/src/components/PDF/PDF.tsx index a081a3e..ebb55eb 100755 --- a/web/src/components/PDF/PDF.tsx +++ b/web/src/components/PDF/PDF.tsx @@ -28,13 +28,9 @@ const PDF = ({ url, form = false }: PDFProps) => { width: 'calc(100vw - 1rem)', height: `calc(100vh - ${form ? '8.5rem' : '6rem'})`, }} - allowFullScreen className="rounded-xl" onError={() => setError(true)} onLoad={() => setError(false)} - sandbox="allow-same-origin allow-scripts allow-forms allow-popups" - referrerPolicy="no-referrer-when-downgrade" - loading="lazy" /> ) } diff --git a/web/src/components/Uploader/Uploader.tsx b/web/src/components/Uploader/Uploader.tsx index 4ad1560..4ee54af 100755 --- a/web/src/components/Uploader/Uploader.tsx +++ b/web/src/components/Uploader/Uploader.tsx @@ -53,7 +53,7 @@ const Uploader = ({ onBeforeUpload: (files) => { for (const [key, file] of Object.entries(files)) { instance.setFileMeta(key, { - name: new Date().getTime().toString(), + name: `${new Date().getTime().toString()}.${file.extension}`, type: file.type, contentType: file.type, }) @@ -68,7 +68,7 @@ const Uploader = ({ removeFingerprintOnSuccess: true, }) .use(Compressor, { - mimeType: 'image/webp', + mimeType: type === 'image' ? 'image/webp' : 'application/pdf', }) if (type === 'image') diff --git a/yarn.lock b/yarn.lock index 9bd6b8b..ae7e958 100755 --- a/yarn.lock +++ b/yarn.lock @@ -3625,6 +3625,13 @@ __metadata: languageName: node linkType: hard +"@ioredis/commands@npm:^1.1.1": + version: 1.2.0 + resolution: "@ioredis/commands@npm:1.2.0" + checksum: 10c0/a5d3c29dd84d8a28b7c67a441ac1715cbd7337a7b88649c0f17c345d89aa218578d2b360760017c48149ef8a70f44b051af9ac0921a0622c2b479614c4f65b36 + languageName: node + linkType: hard + "@isaacs/cliui@npm:^8.0.2": version: 8.0.2 resolution: "@isaacs/cliui@npm:8.0.2" @@ -4549,7 +4556,7 @@ __metadata: languageName: node linkType: hard -"@redis/client@npm:^1.5.13": +"@redis/client@npm:^1.6.0": version: 1.6.0 resolution: "@redis/client@npm:1.6.0" dependencies: @@ -6069,39 +6076,43 @@ __metadata: languageName: node linkType: hard -"@tus/file-store@npm:^1.4.0": - version: 1.4.0 - resolution: "@tus/file-store@npm:1.4.0" +"@tus/file-store@npm:^2.0.0": + version: 2.0.0 + resolution: "@tus/file-store@npm:2.0.0" dependencies: - "@redis/client": "npm:^1.5.13" - "@tus/utils": "npm:^0.3.0" + "@redis/client": "npm:^1.6.0" + "@tus/utils": "npm:^0.6.0" debug: "npm:^4.3.4" dependenciesMeta: "@redis/client": optional: true - checksum: 10c0/28ca244dc9acd9ff62fd58c7b4af7c91b71eac12b357899ccc65fb7f583b93832674d7c3716da92293e54ab9d5227585d7d844be3bc2e4aa4015e1af818a6ec6 + checksum: 10c0/428373995bf84b3beda59da2ac77434cd4d3ff6f508ad3cf7226e7acd54c2625388d967fae511cf62cc74f93110c59a5ae3918003d0d80d327ae0429661dc8fa languageName: node linkType: hard -"@tus/server@npm:^1.7.0": - version: 1.7.0 - resolution: "@tus/server@npm:1.7.0" +"@tus/server@npm:^2.0.0": + version: 2.0.0 + resolution: "@tus/server@npm:2.0.0" dependencies: - "@redis/client": "npm:^1.5.13" - "@tus/utils": "npm:^0.3.0" + "@redis/client": "npm:^1.6.0" + "@tus/utils": "npm:^0.6.0" debug: "npm:^4.3.4" + ioredis: "npm:^5.4.1" lodash.throttle: "npm:^4.1.1" + set-cookie-parser: "npm:^2.7.1" dependenciesMeta: "@redis/client": optional: true - checksum: 10c0/64c06dbd4af16a6ac380acd702a125b69cf04a33e38485ef0e92e128a2f814b28202d83bcf89de180181ba45b30741675464f74688dc7e3c3f38462662ea8f23 + ioredis: + optional: true + checksum: 10c0/9263cb6a1a5cf11d3aa2b7ab911417c740b24ddd9dec118a7a1c776d9ca4eb3e25d5bd142853559c86ff327d0d539f6484511d2c366f37e8ed8f3e7c876f8a8e languageName: node linkType: hard -"@tus/utils@npm:^0.3.0": - version: 0.3.0 - resolution: "@tus/utils@npm:0.3.0" - checksum: 10c0/65b357c80022018067b53640b984e79531e5335d04467eff24f256ae175bbf7055293e169e1589fd2064221fc1ffcc8032080c31f9b56655d1a17f4f3698b43a +"@tus/utils@npm:^0.6.0": + version: 0.6.0 + resolution: "@tus/utils@npm:0.6.0" + checksum: 10c0/d4e16864679539fe39234935869f3f75ba84ef05b6879e48d4bc0227f2db33ba5d2d3560e123bb6c4c04e897318e2435a95db6b1ac7b1ebccb7cb8efccc00661 languageName: node linkType: hard @@ -7333,8 +7344,8 @@ __metadata: "@redwoodjs/api-server": "npm:8.4.0" "@redwoodjs/auth-dbauth-api": "npm:8.4.0" "@redwoodjs/graphql-server": "npm:8.4.0" - "@tus/file-store": "npm:^1.4.0" - "@tus/server": "npm:^1.7.0" + "@tus/file-store": "npm:^2.0.0" + "@tus/server": "npm:^2.0.0" "@types/nodemailer": "npm:^6.4.15" countries-list: "npm:^3.1.1" graphql-scalars: "npm:^1.23.0" @@ -8736,7 +8747,7 @@ __metadata: languageName: node linkType: hard -"cluster-key-slot@npm:1.1.2": +"cluster-key-slot@npm:1.1.2, cluster-key-slot@npm:^1.1.0": version: 1.1.2 resolution: "cluster-key-slot@npm:1.1.2" checksum: 10c0/d7d39ca28a8786e9e801eeb8c770e3c3236a566625d7299a47bb71113fb2298ce1039596acb82590e598c52dbc9b1f088c8f587803e697cb58e1867a95ff94d3 @@ -9593,6 +9604,13 @@ __metadata: languageName: node linkType: hard +"denque@npm:^2.1.0": + version: 2.1.0 + resolution: "denque@npm:2.1.0" + checksum: 10c0/f9ef81aa0af9c6c614a727cb3bd13c5d7db2af1abf9e6352045b86e85873e629690f6222f4edd49d10e4ccf8f078bbeec0794fafaf61b659c0589d0c511ec363 + languageName: node + linkType: hard + "depd@npm:2.0.0": version: 2.0.0 resolution: "depd@npm:2.0.0" @@ -12283,6 +12301,23 @@ __metadata: languageName: node linkType: hard +"ioredis@npm:^5.4.1": + version: 5.6.0 + resolution: "ioredis@npm:5.6.0" + dependencies: + "@ioredis/commands": "npm:^1.1.1" + cluster-key-slot: "npm:^1.1.0" + debug: "npm:^4.3.4" + denque: "npm:^2.1.0" + lodash.defaults: "npm:^4.2.0" + lodash.isarguments: "npm:^3.1.0" + redis-errors: "npm:^1.2.0" + redis-parser: "npm:^3.0.0" + standard-as-callback: "npm:^2.1.0" + checksum: 10c0/a885e5146640fc448706871290ef424ffa39af561f7ee3cf1590085209a509f85e99082bdaaf3cd32fa66758aea3fc2055d1109648ddca96fac4944bf2092c30 + languageName: node + linkType: hard + "ip-address@npm:^9.0.5": version: 9.0.5 resolution: "ip-address@npm:9.0.5" @@ -14028,6 +14063,13 @@ __metadata: languageName: node linkType: hard +"lodash.defaults@npm:^4.2.0": + version: 4.2.0 + resolution: "lodash.defaults@npm:4.2.0" + checksum: 10c0/d5b77aeb702caa69b17be1358faece33a84497bcca814897383c58b28a2f8dfc381b1d9edbec239f8b425126a3bbe4916223da2a576bb0411c2cefd67df80707 + languageName: node + linkType: hard + "lodash.includes@npm:^4.3.0": version: 4.3.0 resolution: "lodash.includes@npm:4.3.0" @@ -14035,6 +14077,13 @@ __metadata: languageName: node linkType: hard +"lodash.isarguments@npm:^3.1.0": + version: 3.1.0 + resolution: "lodash.isarguments@npm:3.1.0" + checksum: 10c0/5e8f95ba10975900a3920fb039a3f89a5a79359a1b5565e4e5b4310ed6ebe64011e31d402e34f577eca983a1fc01ff86c926e3cbe602e1ddfc858fdd353e62d8 + languageName: node + linkType: hard + "lodash.isboolean@npm:^3.0.3": version: 3.0.3 resolution: "lodash.isboolean@npm:3.0.3" @@ -16708,6 +16757,22 @@ __metadata: languageName: node linkType: hard +"redis-errors@npm:^1.0.0, redis-errors@npm:^1.2.0": + version: 1.2.0 + resolution: "redis-errors@npm:1.2.0" + checksum: 10c0/5b316736e9f532d91a35bff631335137a4f974927bb2fb42bf8c2f18879173a211787db8ac4c3fde8f75ed6233eb0888e55d52510b5620e30d69d7d719c8b8a7 + languageName: node + linkType: hard + +"redis-parser@npm:^3.0.0": + version: 3.0.0 + resolution: "redis-parser@npm:3.0.0" + dependencies: + redis-errors: "npm:^1.0.0" + checksum: 10c0/ee16ac4c7b2a60b1f42a2cdaee22b005bd4453eb2d0588b8a4939718997ae269da717434da5d570fe0b05030466eeb3f902a58cf2e8e1ca058bf6c9c596f632f + languageName: node + linkType: hard + "reflect.getprototypeof@npm:^1.0.4": version: 1.0.6 resolution: "reflect.getprototypeof@npm:1.0.6" @@ -17386,6 +17451,13 @@ __metadata: languageName: node linkType: hard +"set-cookie-parser@npm:^2.7.1": + version: 2.7.1 + resolution: "set-cookie-parser@npm:2.7.1" + checksum: 10c0/060c198c4c92547ac15988256f445eae523f57f2ceefeccf52d30d75dedf6bff22b9c26f756bd44e8e560d44ff4ab2130b178bd2e52ef5571bf7be3bd7632d9a + languageName: node + linkType: hard + "set-function-length@npm:^1.2.1": version: 1.2.2 resolution: "set-function-length@npm:1.2.2" @@ -17753,6 +17825,13 @@ __metadata: languageName: node linkType: hard +"standard-as-callback@npm:^2.1.0": + version: 2.1.0 + resolution: "standard-as-callback@npm:2.1.0" + checksum: 10c0/012677236e3d3fdc5689d29e64ea8a599331c4babe86956bf92fc5e127d53f85411c5536ee0079c52c43beb0026b5ce7aa1d834dd35dd026e82a15d1bcaead1f + languageName: node + linkType: hard + "statuses@npm:2.0.1": version: 2.0.1 resolution: "statuses@npm:2.0.1"