This commit is contained in:
2025-06-17 12:27:20 +05:00
parent f41a15f4c8
commit a0b25520e3
34 changed files with 372 additions and 218 deletions
+76 -4
View File
@@ -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=="],
+3 -1
View File
@@ -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"
+1 -1
View File
@@ -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)
+88
View File
@@ -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() }),
}
);
+14 -10
View File
@@ -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(),
+16 -14
View File
@@ -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), {
-25
View File
@@ -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],
}),
}));
+2 -2
View File
@@ -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(),
+2 -2
View File
@@ -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(),
+2 -2
View File
@@ -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 }) => ({
-1
View File
@@ -20,5 +20,4 @@ export const companiesRelations = relations(companiesTable, ({ many }) => ({
users: many(usersTable),
servers: many(serversTable),
apps: many(appsTable),
// actions: many(actionsTable),
}));
-1
View File
@@ -5,5 +5,4 @@ export * from "./servers";
export * from "./sessions";
export * from "./clients";
export * from "./apps";
export * from "./actions";
export * from "./comments";
+39 -20
View File
@@ -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, {
+5 -5
View File
@@ -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(),
+1 -2
View File
@@ -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(),
+2
View File
@@ -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);
+9 -8
View File
@@ -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 }) => {
+5 -6
View File
@@ -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");
}
}
+4 -4
View File
@@ -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");
}
}
+5 -5
View File
@@ -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");
}
}
+4 -4
View File
@@ -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");
}
}
+4 -3
View File
@@ -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");
}
}
@@ -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");
}
}
+4 -5
View File
@@ -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");
}
}
+4 -4
View File
@@ -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");
}
}
-41
View File
@@ -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");
}
}
+35
View File
@@ -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");
}
}
@@ -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");
}
}
@@ -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");
}
}
@@ -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");
}
}
@@ -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");
}
}
+10 -7
View File
@@ -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");
}
}
@@ -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");
}
}
+4 -4
View File
@@ -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");
}
}