From a0b25520e381a735e1ab92696378f01f1924136d Mon Sep 17 00:00:00 2001 From: Lanskikh Date: Tue, 17 Jun 2025 12:27:20 +0500 Subject: [PATCH] upd --- bun.lock | 80 ++++++++++++++++- package.json | 4 +- src/controllers/clientsController.ts | 2 +- src/controllers/filesController.ts | 88 +++++++++++++++++++ src/controllers/serversController.ts | 24 ++--- src/controllers/sessionsController.ts | 30 ++++--- src/db/schema/actions.ts | 25 ------ src/db/schema/apps.ts | 4 +- src/db/schema/clients.ts | 4 +- src/db/schema/comments.ts | 4 +- src/db/schema/companies.ts | 1 - src/db/schema/index.ts | 1 - src/db/schema/servers.ts | 59 ++++++++----- src/db/schema/sessions.ts | 10 +-- src/db/schema/users.ts | 3 +- src/index.ts | 2 + src/middlewares/auth.ts | 17 ++-- src/services/apps/create.ts | 11 ++- src/services/apps/getByCompanyId.ts | 8 +- src/services/auth/login.ts | 10 +-- src/services/auth/logout.ts | 8 +- src/services/auth/me.ts | 7 +- .../clients/{create.ts => createClient.ts} | 7 +- src/services/comments/createComment.ts | 9 +- src/services/comments/getComments.ts | 8 +- src/services/servers/create.ts | 41 --------- src/services/servers/createServer.ts | 35 ++++++++ .../servers/{get.ts => getServers.ts} | 8 +- .../servers/{update.ts => updateServer.ts} | 15 ++-- .../sessions/{create.ts => createSession.ts} | 10 +-- .../{getCount.ts => getCountSessions.ts} | 20 ++--- src/services/sessions/getSessions.ts | 17 ++-- .../sessions/{update.ts => updateSession.ts} | 10 +-- src/services/users/getManagers.ts | 8 +- 34 files changed, 372 insertions(+), 218 deletions(-) create mode 100644 src/controllers/filesController.ts delete mode 100644 src/db/schema/actions.ts rename src/services/clients/{create.ts => createClient.ts} (84%) delete mode 100644 src/services/servers/create.ts create mode 100644 src/services/servers/createServer.ts rename src/services/servers/{get.ts => getServers.ts} (91%) rename src/services/servers/{update.ts => updateServer.ts} (62%) rename src/services/sessions/{create.ts => createSession.ts} (80%) rename src/services/sessions/{getCount.ts => getCountSessions.ts} (71%) rename src/services/sessions/{update.ts => updateSession.ts} (62%) diff --git a/bun.lock b/bun.lock index b842c97..a434e5f 100644 --- a/bun.lock +++ b/bun.lock @@ -8,7 +8,9 @@ "@elysiajs/swagger": "1.2.2", "date-fns": "^4.1.0", "drizzle-orm": "^0.40.0", - "elysia": "latest", + "drizzle-typebox": "^0.3.3", + "elysia": "^1.3.5", + "got": "^14.4.7", "jose": "^6.0.10", "node-cron": "^4.1.0", "postgres": "^3.4.5", @@ -90,10 +92,22 @@ "@scalar/types": ["@scalar/types@0.0.12", "", { "dependencies": { "@scalar/openapi-types": "0.1.1", "@unhead/schema": "^1.9.5" } }, "sha512-XYZ36lSEx87i4gDqopQlGCOkdIITHHEvgkuJFrXFATQs9zHARop0PN0g4RZYWj+ZpCUclOcaOjbCt8JGe22mnQ=="], - "@sinclair/typebox": ["@sinclair/typebox@0.34.30", "", {}, "sha512-gFB3BiqjDxEoadW0zn+xyMVb7cLxPCoblVn2C/BKpI41WPYi2d6fwHAlynPNZ5O/Q4WEiujdnJzVtvG/Jc2CBQ=="], + "@sec-ant/readable-stream": ["@sec-ant/readable-stream@0.4.1", "", {}, "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg=="], + + "@sinclair/typebox": ["@sinclair/typebox@0.34.35", "", {}, "sha512-C6ypdODf2VZkgRT6sFM8E1F8vR+HcffniX0Kp8MsU8PIfrlXbNCBz0jzj17GjdmjTx1OtZzdH8+iALL21UjF5A=="], + + "@sindresorhus/is": ["@sindresorhus/is@7.0.2", "", {}, "sha512-d9xRovfKNz1SKieM0qJdO+PQonjnnIfSNWfHYnBSJ9hkjm0ZPw6HlxscDXYstp3z+7V2GOFHc+J0CYrYTjqCJw=="], + + "@szmarczak/http-timer": ["@szmarczak/http-timer@5.0.1", "", { "dependencies": { "defer-to-connect": "^2.0.1" } }, "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw=="], + + "@tokenizer/inflate": ["@tokenizer/inflate@0.2.7", "", { "dependencies": { "debug": "^4.4.0", "fflate": "^0.8.2", "token-types": "^6.0.0" } }, "sha512-MADQgmZT1eKjp06jpI2yozxaU9uVs4GzzgSL+uEq7bVcJ9V1ZXQkeGNql1fsSI0gMy1vhvNTNbUqrx+pZfJVmg=="], + + "@tokenizer/token": ["@tokenizer/token@0.3.0", "", {}, "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A=="], "@types/bun": ["@types/bun@1.2.5", "", { "dependencies": { "bun-types": "1.2.5" } }, "sha512-w2OZTzrZTVtbnJew1pdFmgV99H0/L+Pvw+z1P67HaR18MHOzYnTYOi6qzErhK8HyT+DB782ADVPPE92Xu2/Opg=="], + "@types/http-cache-semantics": ["@types/http-cache-semantics@4.0.4", "", {}, "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA=="], + "@types/node": ["@types/node@22.13.10", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw=="], "@types/pg": ["@types/pg@8.11.11", "", { "dependencies": { "@types/node": "*", "pg-protocol": "*", "pg-types": "^4.0.1" } }, "sha512-kGT1qKM8wJQ5qlawUrEkXgvMSXoV213KfMGXcwfDwUIfUHXqXYXOfS1nE1LINRJVVVx5wCm70XnFlMHaIcQAfw=="], @@ -106,17 +120,27 @@ "bun-types": ["bun-types@1.2.5", "", { "dependencies": { "@types/node": "*", "@types/ws": "~8.5.10" } }, "sha512-3oO6LVGGRRKI4kHINx5PIdIgnLRb7l/SprhzqXapmoYkFl5m4j6EvALvbDVuuBFaamB46Ap6HCUxIXNLCGy+tg=="], + "cacheable-lookup": ["cacheable-lookup@7.0.0", "", {}, "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w=="], + + "cacheable-request": ["cacheable-request@12.0.1", "", { "dependencies": { "@types/http-cache-semantics": "^4.0.4", "get-stream": "^9.0.1", "http-cache-semantics": "^4.1.1", "keyv": "^4.5.4", "mimic-response": "^4.0.0", "normalize-url": "^8.0.1", "responselike": "^3.0.0" } }, "sha512-Yo9wGIQUaAfIbk+qY0X4cDQgCosecfBe3V9NSyeY4qPC2SAkbCS4Xj79VP8WOzitpJUZKc/wsRCYF5ariDIwkg=="], + "cookie": ["cookie@1.0.2", "", {}, "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA=="], "date-fns": ["date-fns@4.1.0", "", {}, "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg=="], "debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="], + "decompress-response": ["decompress-response@6.0.0", "", { "dependencies": { "mimic-response": "^3.1.0" } }, "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ=="], + + "defer-to-connect": ["defer-to-connect@2.0.1", "", {}, "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg=="], + "drizzle-kit": ["drizzle-kit@0.30.5", "", { "dependencies": { "@drizzle-team/brocli": "^0.10.2", "@esbuild-kit/esm-loader": "^2.5.5", "esbuild": "^0.19.7", "esbuild-register": "^3.5.0", "gel": "^2.0.0" }, "bin": { "drizzle-kit": "bin.cjs" } }, "sha512-l6dMSE100u7sDaTbLczibrQZjA35jLsHNqIV+jmhNVO3O8jzM6kywMOmV9uOz9ZVSCMPQhAZEFjL/qDPVrqpUA=="], "drizzle-orm": ["drizzle-orm@0.40.0", "", { "peerDependencies": { "@aws-sdk/client-rds-data": ">=3", "@cloudflare/workers-types": ">=4", "@electric-sql/pglite": ">=0.2.0", "@libsql/client": ">=0.10.0", "@libsql/client-wasm": ">=0.10.0", "@neondatabase/serverless": ">=0.10.0", "@op-engineering/op-sqlite": ">=2", "@opentelemetry/api": "^1.4.1", "@planetscale/database": ">=1", "@prisma/client": "*", "@tidbcloud/serverless": "*", "@types/better-sqlite3": "*", "@types/pg": "*", "@types/sql.js": "*", "@vercel/postgres": ">=0.8.0", "@xata.io/client": "*", "better-sqlite3": ">=7", "bun-types": "*", "expo-sqlite": ">=14.0.0", "gel": ">=2", "knex": "*", "kysely": "*", "mysql2": ">=2", "pg": ">=8", "postgres": ">=3", "sql.js": ">=1", "sqlite3": ">=5" }, "optionalPeers": ["@aws-sdk/client-rds-data", "@cloudflare/workers-types", "@electric-sql/pglite", "@libsql/client", "@libsql/client-wasm", "@neondatabase/serverless", "@op-engineering/op-sqlite", "@opentelemetry/api", "@planetscale/database", "@prisma/client", "@tidbcloud/serverless", "@types/better-sqlite3", "@types/pg", "@types/sql.js", "@vercel/postgres", "@xata.io/client", "better-sqlite3", "bun-types", "expo-sqlite", "gel", "knex", "kysely", "mysql2", "pg", "postgres", "sql.js", "sqlite3"] }, "sha512-7ptk/HQiMSrEZHnAsSlBESXWj52VwgMmyTEfoNmpNN2ZXpcz13LwHfXTIghsAEud7Z5UJhDOp8U07ujcqme7wg=="], - "elysia": ["elysia@1.2.25", "", { "dependencies": { "@sinclair/typebox": "^0.34.27", "cookie": "^1.0.2", "memoirist": "^0.3.0", "openapi-types": "^12.1.3" }, "peerDependencies": { "typescript": ">= 5.0.0" }, "optionalPeers": ["typescript"] }, "sha512-WsdQpORJvb4uszzeqYT0lg97knw1iBW1NTzJ1Jm57tiHg+DfAotlWXYbjmvQ039ssV0fYELDHinLLoUazZkEHg=="], + "drizzle-typebox": ["drizzle-typebox@0.3.3", "", { "peerDependencies": { "@sinclair/typebox": ">=0.34.8", "drizzle-orm": ">=0.36.0" } }, "sha512-iJpW9K+BaP8+s/ImHxOFVjoZk9G5N/KXFTOpWcFdz9SugAOWv2fyGaH7FmqgdPo+bVNYQW0OOI3U9dkFIVY41w=="], + + "elysia": ["elysia@1.3.5", "", { "dependencies": { "cookie": "^1.0.2", "exact-mirror": "0.1.2", "fast-decode-uri-component": "^1.0.1" }, "optionalDependencies": { "@sinclair/typebox": "^0.34.33", "openapi-types": "^12.1.3" }, "peerDependencies": { "file-type": ">= 20.0.0", "typescript": ">= 5.0.0" } }, "sha512-XVIKXlKFwUT7Sta8GY+wO5reD9I0rqAEtaz1Z71UgJb61csYt8Q3W9al8rtL5RgumuRR8e3DNdzlUN9GkC4KDw=="], "env-paths": ["env-paths@3.0.0", "", {}, "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A=="], @@ -124,19 +148,47 @@ "esbuild-register": ["esbuild-register@3.6.0", "", { "dependencies": { "debug": "^4.3.4" }, "peerDependencies": { "esbuild": ">=0.12 <1" } }, "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg=="], + "exact-mirror": ["exact-mirror@0.1.2", "", { "peerDependencies": { "@sinclair/typebox": "^0.34.15" }, "optionalPeers": ["@sinclair/typebox"] }, "sha512-wFCPCDLmHbKGUb8TOi/IS7jLsgR8WVDGtDK3CzcB4Guf/weq7G+I+DkXiRSZfbemBFOxOINKpraM6ml78vo8Zw=="], + + "fast-decode-uri-component": ["fast-decode-uri-component@1.0.1", "", {}, "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg=="], + + "fflate": ["fflate@0.8.2", "", {}, "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A=="], + + "file-type": ["file-type@21.0.0", "", { "dependencies": { "@tokenizer/inflate": "^0.2.7", "strtok3": "^10.2.2", "token-types": "^6.0.0", "uint8array-extras": "^1.4.0" } }, "sha512-ek5xNX2YBYlXhiUXui3D/BXa3LdqPmoLJ7rqEx2bKJ7EAUEfmXgW0Das7Dc6Nr9MvqaOnIqiPV0mZk/r/UpNAg=="], + + "form-data-encoder": ["form-data-encoder@4.1.0", "", {}, "sha512-G6NsmEW15s0Uw9XnCg+33H3ViYRyiM0hMrMhhqQOR8NFc5GhYrI+6I3u7OTw7b91J2g8rtvMBZJDbcGb2YUniw=="], + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], "gel": ["gel@2.0.1", "", { "dependencies": { "@petamoriken/float16": "^3.8.7", "debug": "^4.3.4", "env-paths": "^3.0.0", "semver": "^7.6.2", "shell-quote": "^1.8.1", "which": "^4.0.0" }, "bin": { "gel": "dist/cli.mjs" } }, "sha512-gfem3IGvqKqXwEq7XseBogyaRwGsQGuE7Cw/yQsjLGdgiyqX92G1xENPCE0ltunPGcsJIa6XBOTx/PK169mOqw=="], + "get-stream": ["get-stream@9.0.1", "", { "dependencies": { "@sec-ant/readable-stream": "^0.4.1", "is-stream": "^4.0.1" } }, "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA=="], + "get-tsconfig": ["get-tsconfig@4.10.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A=="], + "got": ["got@14.4.7", "", { "dependencies": { "@sindresorhus/is": "^7.0.1", "@szmarczak/http-timer": "^5.0.1", "cacheable-lookup": "^7.0.0", "cacheable-request": "^12.0.1", "decompress-response": "^6.0.0", "form-data-encoder": "^4.0.2", "http2-wrapper": "^2.2.1", "lowercase-keys": "^3.0.0", "p-cancelable": "^4.0.1", "responselike": "^3.0.0", "type-fest": "^4.26.1" } }, "sha512-DI8zV1231tqiGzOiOzQWDhsBmncFW7oQDH6Zgy6pDPrqJuVZMtoSgPLLsBZQj8Jg4JFfwoOsDA8NGtLQLnIx2g=="], + "hookable": ["hookable@5.5.3", "", {}, "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ=="], + "http-cache-semantics": ["http-cache-semantics@4.2.0", "", {}, "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ=="], + + "http2-wrapper": ["http2-wrapper@2.2.1", "", { "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.2.0" } }, "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ=="], + + "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], + + "is-stream": ["is-stream@4.0.1", "", {}, "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A=="], + "isexe": ["isexe@3.1.1", "", {}, "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ=="], "jose": ["jose@6.0.10", "", {}, "sha512-skIAxZqcMkOrSwjJvplIPYrlXGpxTPnro2/QWTDCxAdWQrSTV5/KqspMWmi5WAx5+ULswASJiZ0a+1B/Lxt9cw=="], - "memoirist": ["memoirist@0.3.0", "", {}, "sha512-wR+4chMgVPq+T6OOsk40u9Wlpw1Pjx66NMNiYxCQQ4EUJ7jDs3D9kTCeKdBOkvAiqXlHLVJlvYL01PvIJ1MPNg=="], + "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], + + "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], + + "lowercase-keys": ["lowercase-keys@3.0.0", "", {}, "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ=="], + + "mimic-response": ["mimic-response@4.0.0", "", {}, "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg=="], "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], @@ -144,10 +196,14 @@ "node-cron": ["node-cron@4.1.0", "", {}, "sha512-OS+3ORu+h03/haS6Di8Qr7CrVs4YaKZZOynZwQpyPZDnR3tqRbwJmuP2gVR16JfhLgyNlloAV1VTrrWlRogCFA=="], + "normalize-url": ["normalize-url@8.0.2", "", {}, "sha512-Ee/R3SyN4BuynXcnTaekmaVdbDAEiNrHqjQIA37mHU8G9pf7aaAD4ZX3XjBLo6rsdcxA/gtkcNYZLt30ACgynw=="], + "obuf": ["obuf@1.1.2", "", {}, "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg=="], "openapi-types": ["openapi-types@12.1.3", "", {}, "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw=="], + "p-cancelable": ["p-cancelable@4.0.1", "", {}, "sha512-wBowNApzd45EIKdO1LaU+LrMBwAcjfPaYtVzV3lmfM3gf8Z4CHZsiIqlM8TZZ8okYvh5A1cP6gTfCRQtwUpaUg=="], + "pathe": ["pathe@1.1.2", "", {}, "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="], "pg": ["pg@8.14.0", "", { "dependencies": { "pg-connection-string": "^2.7.0", "pg-pool": "^3.8.0", "pg-protocol": "^1.8.0", "pg-types": "^2.1.0", "pgpass": "1.x" }, "optionalDependencies": { "pg-cloudflare": "^1.1.1" }, "peerDependencies": { "pg-native": ">=3.0.1" }, "optionalPeers": ["pg-native"] }, "sha512-nXbVpyoaXVmdqlKEzToFf37qzyeeh7mbiXsnoWvstSqohj88yaa/I/Rq/HEVn2QPSZEuLIJa/jSpRDyzjEx4FQ=="], @@ -180,8 +236,14 @@ "postgres-range": ["postgres-range@1.1.4", "", {}, "sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w=="], + "quick-lru": ["quick-lru@5.1.1", "", {}, "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA=="], + + "resolve-alpn": ["resolve-alpn@1.2.1", "", {}, "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g=="], + "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], + "responselike": ["responselike@3.0.0", "", { "dependencies": { "lowercase-keys": "^3.0.0" } }, "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg=="], + "semver": ["semver@7.7.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="], "shell-quote": ["shell-quote@1.8.2", "", {}, "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA=="], @@ -192,10 +254,18 @@ "split2": ["split2@4.2.0", "", {}, "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg=="], + "strtok3": ["strtok3@10.3.1", "", { "dependencies": { "@tokenizer/token": "^0.3.0" } }, "sha512-3JWEZM6mfix/GCJBBUrkA8p2Id2pBkyTkVCJKto55w080QBKZ+8R171fGrbiSp+yMO/u6F8/yUh7K4V9K+YCnw=="], + + "token-types": ["token-types@6.0.0", "", { "dependencies": { "@tokenizer/token": "^0.3.0", "ieee754": "^1.2.1" } }, "sha512-lbDrTLVsHhOMljPscd0yitpozq7Ga2M5Cvez5AjGg8GASBjtt6iERCAJ93yommPmz62fb45oFIXHEZ3u9bfJEA=="], + "tsx": ["tsx@4.19.3", "", { "dependencies": { "esbuild": "~0.25.0", "get-tsconfig": "^4.7.5" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "bin": { "tsx": "dist/cli.mjs" } }, "sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ=="], "type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], + "typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="], + + "uint8array-extras": ["uint8array-extras@1.4.0", "", {}, "sha512-ZPtzy0hu4cZjv3z5NW9gfKnNLjoz4y6uv4HlelAjDK7sY/xOkKZv9xK/WQpcsBB3jEybChz9DPC2U/+cusjJVQ=="], + "undici-types": ["undici-types@6.20.0", "", {}, "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg=="], "which": ["which@4.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg=="], @@ -210,6 +280,8 @@ "@scalar/themes/@scalar/types": ["@scalar/types@0.1.7", "", { "dependencies": { "@scalar/openapi-types": "0.2.0", "@unhead/schema": "^1.11.11", "nanoid": "^5.1.5", "type-fest": "^4.20.0", "zod": "^3.23.8" } }, "sha512-irIDYzTQG2KLvFbuTI8k2Pz/R4JR+zUUSykVTbEMatkzMmVFnn1VzNSMlODbadycwZunbnL2tA27AXed9URVjw=="], + "decompress-response/mimic-response": ["mimic-response@3.1.0", "", {}, "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="], + "pg/pg-types": ["pg-types@2.2.0", "", { "dependencies": { "pg-int8": "1.0.1", "postgres-array": "~2.0.0", "postgres-bytea": "~1.0.0", "postgres-date": "~1.0.4", "postgres-interval": "^1.1.0" } }, "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA=="], "tsx/esbuild": ["esbuild@0.25.1", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.1", "@esbuild/android-arm": "0.25.1", "@esbuild/android-arm64": "0.25.1", "@esbuild/android-x64": "0.25.1", "@esbuild/darwin-arm64": "0.25.1", "@esbuild/darwin-x64": "0.25.1", "@esbuild/freebsd-arm64": "0.25.1", "@esbuild/freebsd-x64": "0.25.1", "@esbuild/linux-arm": "0.25.1", "@esbuild/linux-arm64": "0.25.1", "@esbuild/linux-ia32": "0.25.1", "@esbuild/linux-loong64": "0.25.1", "@esbuild/linux-mips64el": "0.25.1", "@esbuild/linux-ppc64": "0.25.1", "@esbuild/linux-riscv64": "0.25.1", "@esbuild/linux-s390x": "0.25.1", "@esbuild/linux-x64": "0.25.1", "@esbuild/netbsd-arm64": "0.25.1", "@esbuild/netbsd-x64": "0.25.1", "@esbuild/openbsd-arm64": "0.25.1", "@esbuild/openbsd-x64": "0.25.1", "@esbuild/sunos-x64": "0.25.1", "@esbuild/win32-arm64": "0.25.1", "@esbuild/win32-ia32": "0.25.1", "@esbuild/win32-x64": "0.25.1" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ=="], diff --git a/package.json b/package.json index f56ab6f..17e2dd0 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,9 @@ "@elysiajs/swagger": "1.2.2", "date-fns": "^4.1.0", "drizzle-orm": "^0.40.0", - "elysia": "latest", + "drizzle-typebox": "^0.3.3", + "elysia": "^1.3.5", + "got": "^14.4.7", "jose": "^6.0.10", "node-cron": "^4.1.0", "postgres": "^3.4.5" diff --git a/src/controllers/clientsController.ts b/src/controllers/clientsController.ts index 4fbb63b..0543f38 100644 --- a/src/controllers/clientsController.ts +++ b/src/controllers/clientsController.ts @@ -1,6 +1,6 @@ import Elysia, { t } from "elysia"; import authMiddleware from "../middlewares/auth"; -import createClient from "../services/clients/create"; +import createClient from "../services/clients/createClient"; export const clientsController = new Elysia({ prefix: "/clients" }) .use(authMiddleware) diff --git a/src/controllers/filesController.ts b/src/controllers/filesController.ts new file mode 100644 index 0000000..bdb2890 --- /dev/null +++ b/src/controllers/filesController.ts @@ -0,0 +1,88 @@ +import Elysia, { status, t } from "elysia"; +import got from "got"; +import db from "../db"; +import { eq } from "drizzle-orm"; +import { sessionsTable } from "../db/schema"; +import authMiddleware from "../middlewares/auth"; + +export const filesController = new Elysia({ prefix: "/files" }) + .use(authMiddleware) + .get( + "/", + async ({ query: { sessionId } }) => { + try { + const session = await db.query.sessionsTable.findFirst({ + where: eq(sessionsTable.id, sessionId), + with: { + app: true, + server: true, + }, + }); + + if (!session) return status(404, "Not Found"); + + const { + app, + server: { ipAddress }, + createdAt, + } = session; + + if (!ipAddress) return status(404, "Not Found"); + + return await got + .get( + `http://${ipAddress}:3001/files/${app.fileName}/${new Date( + createdAt + ).getTime()}` + ) + .json(); + } catch (error) { + console.log((error as Error).message); + return status(500, "Internal Server Error"); + } + }, + { + query: t.Object({ + sessionId: t.String({ format: "uuid" }), + }), + } + ) + .get( + "/:fileName", + async ({ params: { fileName }, query: { sessionId } }) => { + try { + const session = await db.query.sessionsTable.findFirst({ + where: eq(sessionsTable.id, sessionId), + with: { + app: true, + server: true, + }, + }); + + if (!session) return status(404, "Not Found"); + + const { + app, + server: { ipAddress }, + createdAt, + } = session; + + return await got + .get( + `http://${ipAddress}:3001/files/${app.fileName}/${new Date( + createdAt + ).getTime()}/${fileName}` + ) + .buffer(); + } catch (error) { + console.log((error as Error).message); + return status(500, "Internal Server Error"); + } + }, + { + query: t.Object({ + sessionId: t.String({ format: "uuid" }), + }), + params: t.Object({ fileName: t.String() }), + } + ); diff --git a/src/controllers/serversController.ts b/src/controllers/serversController.ts index 5b4696f..e3829ce 100644 --- a/src/controllers/serversController.ts +++ b/src/controllers/serversController.ts @@ -1,19 +1,23 @@ import Elysia, { t } from "elysia"; -import getServers from "../services/servers/get"; +import getServers from "../services/servers/getServers"; import authMiddleware from "../middlewares/auth"; -import createServer from "../services/servers/create"; -import updateServer from "../services/servers/update"; +import createServer from "../services/servers/createServer"; +import updateServer from "../services/servers/updateServer"; +import { createInsertSchema } from "drizzle-typebox"; +import { serversTable } from "../db/schema"; + +const upsertServerSchema = createInsertSchema(serversTable); const serversController = new Elysia({ prefix: "/servers" }) .use(authMiddleware) .get("/", async ({ auth, query }) => await getServers(auth, query)) .post("/", async ({ auth, body }) => await createServer(auth, body), { - body: t.Object({ - hostname: t.String(), - name: t.String(), - location: t.String(), - companyId: t.String(), - }), + body: t.Omit(upsertServerSchema, [ + "id", + "createdAt", + "updatedAt", + "status", + ]), }) .put( "/:id", @@ -21,7 +25,7 @@ const serversController = new Elysia({ prefix: "/servers" }) { body: t.Object({ name: t.String(), - location: t.String(), + description: t.String(), }), params: t.Object({ id: t.String(), diff --git a/src/controllers/sessionsController.ts b/src/controllers/sessionsController.ts index 6600d4f..0001107 100644 --- a/src/controllers/sessionsController.ts +++ b/src/controllers/sessionsController.ts @@ -1,12 +1,12 @@ -import Elysia, { error, t } from "elysia"; +import Elysia, { status, t } from "elysia"; import authMiddleware from "../middlewares/auth"; -import createSession from "../services/sessions/create"; +import createSession from "../services/sessions/createSession"; import getSessions from "../services/sessions/getSessions"; -import updateSession from "../services/sessions/update"; +import updateSession from "../services/sessions/updateSession"; import db from "../db"; import { eq } from "drizzle-orm"; import { sessionsTable } from "../db/schema/sessions"; -import getCount from "../services/sessions/getCount"; +import getCount from "../services/sessions/getCountSessions"; const sessionsController = new Elysia({ prefix: "/sessions" }) .use(authMiddleware) @@ -22,8 +22,8 @@ const sessionsController = new Elysia({ prefix: "/sessions" }) t.Literal("ended"), ]), clientSearch: t.String(), - appId: t.String(), - ownerId: t.String(), + appIds: t.Array(t.String()), + ownerIds: t.Array(t.String()), }) ), }) @@ -31,11 +31,13 @@ const sessionsController = new Elysia({ prefix: "/sessions" }) "/count", ({ query, auth: { companyId } }) => getCount({ ...query, companyId }), { - query: t.Object({ - ownerId: t.Optional(t.String()), - appId: t.Optional(t.String()), - clientSearch: t.Optional(t.String()), - }), + query: t.Partial( + t.Object({ + ownerIds: t.ArrayString(), + appIds: t.ArrayString(), + clientSearch: t.String(), + }) + ), } ) .get("/:id", async ({ params }) => { @@ -55,9 +57,9 @@ const sessionsController = new Elysia({ prefix: "/sessions" }) }, }); return session; - } catch (err) { - console.log((err as Error).message); - return error(404, "Session not found"); + } catch (error) { + console.log((error as Error).message); + return status(404, "Session not found"); } }) .post("/", ({ body, auth }) => createSession(auth, body), { diff --git a/src/db/schema/actions.ts b/src/db/schema/actions.ts deleted file mode 100644 index f2d9525..0000000 --- a/src/db/schema/actions.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { pgTable, timestamp, uuid, varchar } from "drizzle-orm/pg-core"; -import { serversTable } from "./servers"; -import { relations } from "drizzle-orm"; - -export const actionsTable = pgTable("actions", { - id: uuid("id").defaultRandom().primaryKey(), - name: varchar("name").notNull(), - serverId: uuid("server_id") - .notNull() - .references(() => serversTable.id), - createdAt: timestamp("created_at", { withTimezone: true }) - .notNull() - .defaultNow(), - updatedAt: timestamp("updated_at", { withTimezone: true }) - .notNull() - .defaultNow() - .$onUpdate(() => new Date()), -}); - -export const actionsRelations = relations(actionsTable, ({ one }) => ({ - server: one(serversTable, { - fields: [actionsTable.serverId], - references: [serversTable.id], - }), -})); diff --git a/src/db/schema/apps.ts b/src/db/schema/apps.ts index 5429c68..86d78d5 100644 --- a/src/db/schema/apps.ts +++ b/src/db/schema/apps.ts @@ -17,10 +17,10 @@ export const appsTable = pgTable( fileName: varchar("filename").notNull(), serverId: uuid("server_id") .notNull() - .references(() => serversTable.id), + .references(() => serversTable.id, { onDelete: "cascade" }), companyId: uuid("company_id") .notNull() - .references(() => companiesTable.id), + .references(() => companiesTable.id, { onDelete: "cascade" }), createdAt: timestamp("created_at", { withTimezone: true }) .notNull() .defaultNow(), diff --git a/src/db/schema/clients.ts b/src/db/schema/clients.ts index 98662a9..59a82da 100644 --- a/src/db/schema/clients.ts +++ b/src/db/schema/clients.ts @@ -11,10 +11,10 @@ export const clientsTable = pgTable("clients", { email: varchar("email"), ownerId: uuid("owner_id") .notNull() - .references(() => usersTable.id), + .references(() => usersTable.id, { onDelete: "cascade" }), companyId: uuid("company_id") .notNull() - .references(() => companiesTable.id), + .references(() => companiesTable.id, { onDelete: "cascade" }), createdAt: timestamp("created_at", { withTimezone: true }) .notNull() .defaultNow(), diff --git a/src/db/schema/comments.ts b/src/db/schema/comments.ts index a35ba0f..b2ce13f 100644 --- a/src/db/schema/comments.ts +++ b/src/db/schema/comments.ts @@ -10,10 +10,10 @@ export const commentsTable = pgTable("comments", { updatedAt: timestamp("updated_at").notNull().defaultNow(), ownerId: uuid("owner_id") .notNull() - .references(() => usersTable.id), + .references(() => usersTable.id, { onDelete: "cascade" }), sessionId: uuid("session_id") .notNull() - .references(() => sessionsTable.id), + .references(() => sessionsTable.id, { onDelete: "cascade" }), }); export const commentsRelations = relations(commentsTable, ({ one }) => ({ diff --git a/src/db/schema/companies.ts b/src/db/schema/companies.ts index b475dac..10b7840 100644 --- a/src/db/schema/companies.ts +++ b/src/db/schema/companies.ts @@ -20,5 +20,4 @@ export const companiesRelations = relations(companiesTable, ({ many }) => ({ users: many(usersTable), servers: many(serversTable), apps: many(appsTable), - // actions: many(actionsTable), })); diff --git a/src/db/schema/index.ts b/src/db/schema/index.ts index 84efe89..44967f9 100644 --- a/src/db/schema/index.ts +++ b/src/db/schema/index.ts @@ -5,5 +5,4 @@ export * from "./servers"; export * from "./sessions"; export * from "./clients"; export * from "./apps"; -export * from "./actions"; export * from "./comments"; diff --git a/src/db/schema/servers.ts b/src/db/schema/servers.ts index 0e776ed..8410b73 100644 --- a/src/db/schema/servers.ts +++ b/src/db/schema/servers.ts @@ -1,28 +1,47 @@ -import { pgTable, timestamp, uuid, varchar } from "drizzle-orm/pg-core"; +import { + pgTable, + timestamp, + uuid, + varchar, + inet, + uniqueIndex, +} from "drizzle-orm/pg-core"; import { companiesTable } from "./companies"; import { relations } from "drizzle-orm"; import { sessionsTable } from "./sessions"; import { appsTable } from "./apps"; -export const serversTable = pgTable("servers", { - id: uuid("id").primaryKey().defaultRandom(), - hostname: varchar("hostname", { length: 15 }).unique().notNull(), - name: varchar("name").notNull(), - location: varchar("location").notNull(), - companyId: uuid("company_id") - .notNull() - .references(() => companiesTable.id), - createdAt: timestamp("created_at", { withTimezone: true }) - .notNull() - .defaultNow(), - updatedAt: timestamp("updated_at", { withTimezone: true }) - .notNull() - .defaultNow() - .$onUpdate(() => new Date()), - status: varchar("status", { enum: ["online", "offline"] }) - .notNull() - .default("online"), -}); +export const serversTable = pgTable( + "servers", + { + id: uuid("id").primaryKey().defaultRandom(), + hostname: varchar("hostname", { length: 15 }).notNull(), + name: varchar("name").notNull().default("Новый стол"), + description: varchar("description").notNull(), + companyId: uuid("company_id") + .notNull() + .references(() => companiesTable.id, { + onDelete: "cascade", + }), + createdAt: timestamp("created_at", { withTimezone: true }) + .notNull() + .defaultNow(), + updatedAt: timestamp("updated_at", { withTimezone: true }) + .notNull() + .defaultNow() + .$onUpdate(() => new Date()), + status: varchar("status", { enum: ["online", "offline"] }).default( + "online" + ), + ipAddress: inet("ip_address").notNull(), + }, + (t) => ({ + uniqueHostnameCompanyId: uniqueIndex("unique_hostname_company_id").on( + t.hostname, + t.companyId + ), + }) +); export const serversRelations = relations(serversTable, ({ one, many }) => ({ company: one(companiesTable, { diff --git a/src/db/schema/sessions.ts b/src/db/schema/sessions.ts index 07a4ae9..8d9f06f 100644 --- a/src/db/schema/sessions.ts +++ b/src/db/schema/sessions.ts @@ -27,19 +27,19 @@ export const sessionsTable = pgTable( pid: integer("pid"), appId: uuid("app_id") .notNull() - .references(() => appsTable.id), + .references(() => appsTable.id, { onDelete: "cascade" }), ownerId: uuid("owner_id") .notNull() - .references(() => usersTable.id), + .references(() => usersTable.id, { onDelete: "cascade" }), serverId: uuid("server_id") .notNull() - .references(() => serversTable.id), + .references(() => serversTable.id, { onDelete: "cascade" }), clientId: uuid("client_id") .notNull() - .references(() => clientsTable.id), + .references(() => clientsTable.id, { onDelete: "cascade" }), companyId: uuid("company_id") .notNull() - .references(() => companiesTable.id), + .references(() => companiesTable.id, { onDelete: "cascade" }), createdAt: timestamp("created_at", { withTimezone: true }) .notNull() .defaultNow(), diff --git a/src/db/schema/users.ts b/src/db/schema/users.ts index dc69a77..456499d 100644 --- a/src/db/schema/users.ts +++ b/src/db/schema/users.ts @@ -9,10 +9,9 @@ export const usersTable = pgTable("users", { fullname: text("fullname"), email: varchar("email").unique().notNull(), password: varchar("password", { length: 72 }).notNull(), - // roles: text("roles").array().notNull(), companyId: uuid("company_id") .notNull() - .references(() => companiesTable.id), + .references(() => companiesTable.id, { onDelete: "cascade" }), createdAt: timestamp("created_at", { withTimezone: true }) .notNull() .defaultNow(), diff --git a/src/index.ts b/src/index.ts index af78df1..5f395e5 100644 --- a/src/index.ts +++ b/src/index.ts @@ -13,6 +13,7 @@ import { eq } from "drizzle-orm"; import cron from "node-cron"; import { commentsController } from "./controllers/commentsController"; import { swagger } from "@elysiajs/swagger"; +import { filesController } from "./controllers/filesController"; const app = new Elysia(); @@ -28,6 +29,7 @@ app.use(sessionsController); app.use(appsController); app.use(clientsController); app.use(commentsController); +app.use(filesController); app.use(swagger()).listen(3000); diff --git a/src/middlewares/auth.ts b/src/middlewares/auth.ts index 7772682..e19e795 100644 --- a/src/middlewares/auth.ts +++ b/src/middlewares/auth.ts @@ -1,5 +1,5 @@ import { eq } from "drizzle-orm"; -import Elysia, { error } from "elysia"; +import Elysia, { status } from "elysia"; import { jwtVerify } from "jose"; import { createHmac } from "crypto"; import db from "../db"; @@ -18,7 +18,7 @@ const authMiddleware = new Elysia() const accessToken = headers["authorization"]?.split(" ")[1]; if (!accessToken) { - return error(401); + return status(401); } const secret = new TextEncoder().encode(process.env.JWT_SECRET); @@ -33,7 +33,7 @@ const authMiddleware = new Elysia() }); if (!user) { - return error(401); + return status(401); } return { @@ -42,14 +42,15 @@ const authMiddleware = new Elysia() companyId: user.companyId, }, }; - } catch (err) { - return error(401); + } catch (error) { + console.log((error as Error).message); + return status(500); } } else if (type === "Hmac") { const signature = headers["authorization"]?.split(" ")[1]; if (!signature) { - return error(401); + return status(401); } const verified = createHmac("sha256", process.env.HMAC_SECRET) @@ -57,7 +58,7 @@ const authMiddleware = new Elysia() .digest("base64"); if (verified !== signature) { - return error(401); + return status(401); } return { @@ -67,7 +68,7 @@ const authMiddleware = new Elysia() }, }; } else { - return error(401); + return status(401); } }) .onError({ as: "scoped" }, ({ error, set }) => { diff --git a/src/services/apps/create.ts b/src/services/apps/create.ts index 92cf542..5513b81 100644 --- a/src/services/apps/create.ts +++ b/src/services/apps/create.ts @@ -1,4 +1,4 @@ -import { error } from "elysia"; +import { status } from "elysia"; import db from "../../db"; import { appsTable } from "../../db/schema"; import { sql } from "drizzle-orm"; @@ -12,9 +12,8 @@ export default async function createApp( companyId: string; } ) { - console.log(auth); if (auth.userId !== "hmac-user") { - return error(403, { + return status(403, { error: "Forbidden", }); } @@ -42,8 +41,8 @@ export default async function createApp( }); return apps; - } catch (err) { - console.log((err as Error).message); - return error(500, "Internal Server Error"); + } catch (error) { + console.log((error as Error).message); + return status(500, "Internal Server Error"); } } diff --git a/src/services/apps/getByCompanyId.ts b/src/services/apps/getByCompanyId.ts index 261cc94..beef4c1 100644 --- a/src/services/apps/getByCompanyId.ts +++ b/src/services/apps/getByCompanyId.ts @@ -2,16 +2,16 @@ import db from "../../db"; import { appsTable } from "../../db/schema"; import type { AuthContext } from "../../middlewares/auth"; import { eq } from "drizzle-orm"; -import { error } from "elysia"; +import { status } from "elysia"; async function getByCompanyId(auth: AuthContext) { try { return await db.query.appsTable.findMany({ where: eq(appsTable.companyId, auth.companyId), }); - } catch (err) { - console.log((err as Error).message); - return error(500, "Internal Server Error"); + } catch (error) { + console.log((error as Error).message); + return status(500, "Internal Server Error"); } } diff --git a/src/services/auth/login.ts b/src/services/auth/login.ts index 06ab67c..e65671a 100644 --- a/src/services/auth/login.ts +++ b/src/services/auth/login.ts @@ -1,7 +1,7 @@ import { eq } from "drizzle-orm"; import db from "../../db"; import { tokensTable, usersTable } from "../../db/schema"; -import { error } from "elysia"; +import { status } from "elysia"; import { generateToken } from "../../utils/generateToken"; export default async function login({ @@ -17,7 +17,7 @@ export default async function login({ }); if (!user || !Bun.password.verifySync(password, user.password)) - return error(401, { error: "Wrong credentials" }); + return status(401, { error: "Wrong credentials" }); const token = await generateToken(user.id); @@ -29,8 +29,8 @@ export default async function login({ return { token, }; - } catch (err) { - console.log((err as Error).message); - return error(500, "Internal Server Error"); + } catch (error) { + console.log((error as Error).message); + return status(500, "Internal Server Error"); } } diff --git a/src/services/auth/logout.ts b/src/services/auth/logout.ts index 653d800..4c14f4b 100644 --- a/src/services/auth/logout.ts +++ b/src/services/auth/logout.ts @@ -1,4 +1,4 @@ -import { error } from "elysia"; +import { status } from "elysia"; import { eq } from "drizzle-orm"; import db from "../../db"; import { tokensTable } from "../../db/schema"; @@ -6,8 +6,8 @@ import { tokensTable } from "../../db/schema"; export default async function logout(token: string) { try { await db.delete(tokensTable).where(eq(tokensTable.token, token)); - } catch (err) { - console.log((err as Error).message); - return error(500, "Internal Server Error"); + } catch (error) { + console.log((error as Error).message); + return status(500, "Internal Server Error"); } } diff --git a/src/services/auth/me.ts b/src/services/auth/me.ts index a4c2927..1cc303d 100644 --- a/src/services/auth/me.ts +++ b/src/services/auth/me.ts @@ -1,7 +1,7 @@ import { eq } from "drizzle-orm"; import db from "../../db"; import { usersTable } from "../../db/schema"; -import { error } from "elysia"; +import { status } from "elysia"; import type { AuthContext } from "../../middlewares/auth"; export default async function me(auth: AuthContext) { @@ -16,7 +16,8 @@ export default async function me(auth: AuthContext) { }); return user; - } catch (err) { - return error(500, "Internal Server Error"); + } catch (error) { + console.log((error as Error).message); + return status(500, "Internal Server Error"); } } diff --git a/src/services/clients/create.ts b/src/services/clients/createClient.ts similarity index 84% rename from src/services/clients/create.ts rename to src/services/clients/createClient.ts index 4f36bc4..a1541f9 100644 --- a/src/services/clients/create.ts +++ b/src/services/clients/createClient.ts @@ -1,7 +1,7 @@ import { eq } from "drizzle-orm"; import db from "../../db"; import { clientsTable } from "../../db/schema"; -import { error } from "elysia"; +import { status } from "elysia"; async function createClient( auth: { @@ -36,8 +36,9 @@ async function createClient( .returning(); return newClient; - } catch (err) { - return error(500, "Internal Server Error"); + } catch (error) { + console.log((error as Error).message); + return status(500, "Internal Server Error"); } } diff --git a/src/services/comments/createComment.ts b/src/services/comments/createComment.ts index 1d5d1ca..32770a1 100644 --- a/src/services/comments/createComment.ts +++ b/src/services/comments/createComment.ts @@ -1,4 +1,4 @@ -import { error } from "elysia"; +import { status } from "elysia"; import db from "../../db"; import { commentsTable } from "../../db/schema"; @@ -12,7 +12,6 @@ export async function createComment({ text: string; }) { try { - console.log(sessionId, userId, text); const comment = await db .insert(commentsTable) .values({ @@ -22,8 +21,8 @@ export async function createComment({ }) .returning(); return comment; - } catch (err) { - console.log((err as Error).message); - return error(500, "Internal Server Error"); + } catch (error) { + console.log((error as Error).message); + return status(500, "Internal Server Error"); } } diff --git a/src/services/comments/getComments.ts b/src/services/comments/getComments.ts index 1bd1a06..ce85758 100644 --- a/src/services/comments/getComments.ts +++ b/src/services/comments/getComments.ts @@ -1,4 +1,4 @@ -import { error } from "elysia"; +import { status } from "elysia"; import { and, desc, eq } from "drizzle-orm"; import db from "../../db"; import { commentsTable } from "../../db/schema"; @@ -21,9 +21,9 @@ export async function getComments(sessionId: string, userId: string) { orderBy: desc(commentsTable.createdAt), }); return comments; - } catch (err) { - console.log((err as Error).message); - return error(500, "Internal Server Error"); + } catch (error) { + console.log((error as Error).message); + return status(500, "Internal Server Error"); } } diff --git a/src/services/servers/create.ts b/src/services/servers/create.ts deleted file mode 100644 index 0ce9f2f..0000000 --- a/src/services/servers/create.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { error } from "elysia"; -import db from "../../db"; -import { serversTable } from "../../db/schema"; -import { eq } from "drizzle-orm"; -import type { AuthContext } from "./../../middlewares/auth"; - -export default async function createServer( - auth: AuthContext, - body: { - hostname: string; - name: string; - location: string; - companyId: string; - } -) { - if (auth.userId !== "hmac-user") { - return error(403, "Forbidden"); - } - - try { - const existingServer = await db.query.serversTable.findFirst({ - where: eq(serversTable.hostname, body.hostname), - }); - - if (existingServer) { - return error(400, "Server with this hostname already exists"); - } - - const server = await db - .insert(serversTable) - .values({ - ...body, - }) - .returning(); - - return server; - } catch (err) { - console.log((err as Error).message); - return error(500, "Internal Server Error"); - } -} diff --git a/src/services/servers/createServer.ts b/src/services/servers/createServer.ts new file mode 100644 index 0000000..dc401f3 --- /dev/null +++ b/src/services/servers/createServer.ts @@ -0,0 +1,35 @@ +import db from "../../db"; +import { status } from "elysia"; +import { serversTable } from "../../db/schema"; +import type { AuthContext } from "../../middlewares/auth"; + +export default async function createServer( + auth: AuthContext, + body: { + name?: string; + hostname: string; + description: string; + ipAddress: string; + companyId: string; + } +) { + if (auth.userId !== "hmac-user") return status(403, "Forbidden"); + + try { + const server = await db + .insert(serversTable) + .values({ + ...body, + }) + .onConflictDoUpdate({ + target: [serversTable.hostname, serversTable.companyId], + set: body, + }) + .returning(); + + return server; + } catch (error) { + console.log((error as Error).message); + return status(500, "Internal Server Error"); + } +} diff --git a/src/services/servers/get.ts b/src/services/servers/getServers.ts similarity index 91% rename from src/services/servers/get.ts rename to src/services/servers/getServers.ts index 65c3562..559f9ae 100644 --- a/src/services/servers/get.ts +++ b/src/services/servers/getServers.ts @@ -1,4 +1,4 @@ -import { error } from "elysia"; +import { status } from "elysia"; import db from "../../db"; import { desc, eq } from "drizzle-orm"; import { serversTable, sessionsTable } from "../../db/schema"; @@ -59,8 +59,8 @@ export default async function getServers( }); return servers; - } catch (err) { - console.log((err as Error).message); - return error(500, "Internal Server Error"); + } catch (error) { + console.log((error as Error).message); + return status(500, "Internal Server Error"); } } diff --git a/src/services/servers/update.ts b/src/services/servers/updateServer.ts similarity index 62% rename from src/services/servers/update.ts rename to src/services/servers/updateServer.ts index 212772a..552a99a 100644 --- a/src/services/servers/update.ts +++ b/src/services/servers/updateServer.ts @@ -1,4 +1,4 @@ -import { error } from "elysia"; +import { status } from "elysia"; import { eq } from "drizzle-orm"; import db from "../../db"; import { serversTable } from "../../db/schema/servers"; @@ -9,7 +9,7 @@ async function updateServer({ }: { body: { name: string; - location: string; + description: string; }; params: { id: string; @@ -19,16 +19,13 @@ async function updateServer({ return ( await db .update(serversTable) - .set({ - name: body.name, - location: body.location, - }) + .set(body) .where(eq(serversTable.id, params.id)) .returning() )[0]; - } catch (err) { - console.log((err as Error).message); - return error(500, "Internal Server Error"); + } catch (error) { + console.log((error as Error).message); + return status(500, "Internal Server Error"); } } diff --git a/src/services/sessions/create.ts b/src/services/sessions/createSession.ts similarity index 80% rename from src/services/sessions/create.ts rename to src/services/sessions/createSession.ts index f159712..acc43ea 100644 --- a/src/services/sessions/create.ts +++ b/src/services/sessions/createSession.ts @@ -1,7 +1,7 @@ import { and, eq, or } from "drizzle-orm"; import db from "../../db"; import { sessionsTable } from "../../db/schema"; -import { error } from "elysia"; +import { status } from "elysia"; async function createSession( auth: { @@ -15,7 +15,6 @@ async function createSession( } ) { try { - // Check for existing session const [existingSession] = await db .select() .from(sessionsTable) @@ -30,10 +29,9 @@ async function createSession( ); if (existingSession) { - return error(409, "Session already exists"); + return status(409, "Session already exists"); } - // Create new session const [newSession] = await db .insert(sessionsTable) .values({ @@ -44,8 +42,8 @@ async function createSession( .returning(); return newSession; - } catch (err) { - return error(500, "Internal Server Error"); + } catch (error) { + return status(500, "Internal Server Error"); } } diff --git a/src/services/sessions/getCount.ts b/src/services/sessions/getCountSessions.ts similarity index 71% rename from src/services/sessions/getCount.ts rename to src/services/sessions/getCountSessions.ts index c946694..7828761 100644 --- a/src/services/sessions/getCount.ts +++ b/src/services/sessions/getCountSessions.ts @@ -1,16 +1,16 @@ -import { error } from "elysia"; +import { status } from "elysia"; import db from "../../db"; import { and, count, eq, ilike, inArray } from "drizzle-orm"; import { clientsTable, sessionsTable } from "../../db/schema"; async function getCount({ - ownerId, - appId, + ownerIds, + appIds, clientSearch, companyId, }: { - ownerId?: string; - appId?: string; + ownerIds?: string[]; + appIds?: string[]; clientSearch?: string; companyId: string; }) { @@ -21,8 +21,8 @@ async function getCount({ .where( and( eq(sessionsTable.companyId, companyId), - ownerId ? eq(sessionsTable.ownerId, ownerId) : undefined, - appId ? eq(sessionsTable.appId, appId) : undefined, + ownerIds ? inArray(sessionsTable.ownerId, ownerIds) : undefined, + appIds ? inArray(sessionsTable.appId, appIds) : undefined, clientSearch ? inArray( sessionsTable.clientId, @@ -36,9 +36,9 @@ async function getCount({ ) ); return countSessions; - } catch (err) { - console.log((err as Error).message); - return error(500, "Internal Server Error"); + } catch (error) { + console.log((error as Error).message); + return status(500, "Internal Server Error"); } } diff --git a/src/services/sessions/getSessions.ts b/src/services/sessions/getSessions.ts index 0dca51c..c3beedf 100644 --- a/src/services/sessions/getSessions.ts +++ b/src/services/sessions/getSessions.ts @@ -1,5 +1,5 @@ import db from "../../db"; -import { error } from "elysia"; +import { status } from "elysia"; import { and, desc, eq, ilike, inArray } from "drizzle-orm"; import { clientsTable, sessionsTable } from "../../db/schema"; import type { AuthContext } from "../../middlewares/auth"; @@ -10,8 +10,8 @@ async function getSessions( limit?: number; status?: "starting" | "started" | "restarting" | "ending" | "ended"; clientSearch?: string; - appId?: string; - ownerId?: string; + appIds?: string[]; + ownerIds?: string[]; } ) { try { @@ -29,8 +29,10 @@ async function getSessions( ).map((client) => client.id) ) : undefined, - query.appId ? eq(sessionsTable.appId, query.appId) : undefined, - query.ownerId ? eq(sessionsTable.ownerId, query.ownerId) : undefined + query.appIds ? inArray(sessionsTable.appId, query.appIds) : undefined, + query.ownerIds + ? inArray(sessionsTable.ownerId, query.ownerIds) + : undefined ), with: { client: true, @@ -57,8 +59,9 @@ async function getSessions( }); return sessions; - } catch (err) { - return error(500, "Internal Server Error"); + } catch (error) { + console.log((error as Error).message); + return status(500, "Internal Server Error"); } } diff --git a/src/services/sessions/update.ts b/src/services/sessions/updateSession.ts similarity index 62% rename from src/services/sessions/update.ts rename to src/services/sessions/updateSession.ts index 497da99..d392691 100644 --- a/src/services/sessions/update.ts +++ b/src/services/sessions/updateSession.ts @@ -1,22 +1,22 @@ import { eq } from "drizzle-orm"; import db from "../../db"; import { sessionsTable } from "../../db/schema"; -import { error } from "elysia"; +import { status } from "elysia"; async function updateSession( sessionId: string, - status: "starting" | "started" | "restarting" | "ending" | "ended" + sessionStatus: "starting" | "started" | "restarting" | "ending" | "ended" ) { try { const session = await db .update(sessionsTable) - .set({ status }) + .set({ status: sessionStatus }) .where(eq(sessionsTable.id, sessionId)) .returning(); return session; - } catch (err) { - return error(500, "Internal Server Error"); + } catch (error) { + return status(500, "Internal Server Error"); } } diff --git a/src/services/users/getManagers.ts b/src/services/users/getManagers.ts index aa56ea8..3495821 100644 --- a/src/services/users/getManagers.ts +++ b/src/services/users/getManagers.ts @@ -2,7 +2,7 @@ import db from "../../db"; import type { AuthContext } from "../../middlewares/auth"; import { eq } from "drizzle-orm"; import { usersTable } from "../../db/schema"; -import { error } from "elysia"; +import { status } from "elysia"; async function getManagers(auth: AuthContext) { try { @@ -14,9 +14,9 @@ async function getManagers(auth: AuthContext) { email: true, }, }); - } catch (err) { - console.log((err as Error).message); - return error(500, "Internal Server Error"); + } catch (error) { + console.log((error as Error).message); + return status(500, "Internal Server Error"); } }