diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..84e935f --- /dev/null +++ b/.dockerignore @@ -0,0 +1,7 @@ +node_modules +dist +.git +.gitignore +Dockerfile* +docker-compose* +README.md \ No newline at end of file diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..7449640 --- /dev/null +++ b/.env.example @@ -0,0 +1,36 @@ +APP_NAME=NounozCommunity +APP_ENV=development +PORT=3200 +API_KEY=nahidaa +ALLOWED_ORIGINS=www.nounoz.com,nounoz.com,localhost + +SALT_ROUNDS= +JWT_SECRET= +SESSION_EXPIRE= + +R2_ACCOUNT_ID= +R2_TOKEN_VALUE_ID= +R2_ACCESS_KEY_ID= +R2_SECRET_ACCESS_KEY= +R2_BUCKET_NAME= +R2_REGION= +R2_ENDPOINT= + +MAL_CLIENT_ID= +MAL_CLIENT_SECRET= + +SMTP_HOST= +SMTP_PORT= +SMTP_SECURE= +SMTP_USER= +SMTP_PASS= +SMTP_FROM= + +REDIS_HOST=localhost +REDIS_PORT=6379 +REDIS_PASSWORD= + +DATABASE_URL= +MONGODB_URI= + +# CREATE USER astofo WITH PASSWORD 'Nahidamylover*123'; \ No newline at end of file diff --git a/.gitignore b/.gitignore index d0624e2..f8ff2fe 100644 --- a/.gitignore +++ b/.gitignore @@ -8,11 +8,8 @@ # testing /coverage -# next.js -/.next/ -/out/ - # production +/dist /build # misc @@ -48,6 +45,9 @@ package-lock.json .env.test .env.production +# local docker compose files +docker-compose.override.yml + # compiled output server server.exe \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..a355dee --- /dev/null +++ b/Dockerfile @@ -0,0 +1,24 @@ +# --- Stage 1: Build --- +FROM oven/bun:1.1 AS builder + +WORKDIR /app + +COPY bun.lockb package.json ./ +RUN bun install + +COPY . . +RUN bunx prisma generate +RUN bun run build + + +# --- Stage 2: Production Runner --- +FROM oven/bun:1.1 AS runner + +WORKDIR /app + +COPY --from=builder /app ./ + +RUN bunx prisma migrate deploy +EXPOSE 3000 + +CMD [ "sh", "-c", "PORT=3000 ./dist/server" ] \ No newline at end of file diff --git a/bun.lockb b/bun.lockb index 53faf6e..f73c7b5 100644 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..fac635c --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,28 @@ +services: + app: + build: + context: . + dockerfile: Dockerfile + ports: + - "3003:3000" + depends_on: + - db + - redis + restart: unless-stopped + + db: + image: postgres:16-alpine + environment: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: 868686 + POSTGRES_DB: nouzen + volumes: + - pgdata:/var/lib/postgresql/data + restart: unless-stopped + + redis: + image: redis:7.2-alpine + restart: unless-stopped + +volumes: + pgdata: diff --git a/package.json b/package.json index 3420871..c81d4df 100644 --- a/package.json +++ b/package.json @@ -3,19 +3,24 @@ "version": "1.0.50", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", - "build": "bun build ./src/app.ts --compile --target bun --minify-whitespace --minify-syntax --minify-identifiers --outfile server", - "dev": "bun run --watch src/index.ts" + "build": "bun build ./src/index.ts --compile --target bun --minify-whitespace --minify-syntax --minify-identifiers --outfile dist/server", + "dev": "bun run --watch src/index.ts", + "route:sync": "bun run ./scripts/sync-routes.ts", + "env:publish": "bun run ./scripts/create-example-env.ts" }, "dependencies": { "@prisma/client": "^6.7.0", "@types/bcrypt": "^5.0.2", "@types/jsonwebtoken": "^9.0.9", + "aws-sdk": "^2.1692.0", "bcrypt": "^5.1.1", "cookie": "^1.0.2", "elysia": "latest", "ioredis": "^5.6.1", "joi": "^17.13.3", "jsonwebtoken": "^9.0.2", + "mock-aws-s3": "^4.0.2", + "nock": "^14.0.4", "ua-parser-js": "^2.0.3" }, "devDependencies": { diff --git a/prisma/migrations/20250523071439_initial/migration.sql b/prisma/migrations/20250523071439_initial/migration.sql new file mode 100644 index 0000000..961e392 --- /dev/null +++ b/prisma/migrations/20250523071439_initial/migration.sql @@ -0,0 +1,758 @@ +-- CreateEnum +CREATE TYPE "AgeRating" AS ENUM ('G', 'PG', 'PG_13', 'R', 'R_plus', 'Rx'); + +-- CreateEnum +CREATE TYPE "MediaType" AS ENUM ('TV', 'ONA', 'OVA', 'Movie', 'Special', 'Music'); + +-- CreateEnum +CREATE TYPE "Source" AS ENUM ('original', 'manga', 'light_novel', 'game'); + +-- CreateEnum +CREATE TYPE "MediaOperation" AS ENUM ('create', 'update', 'delete'); + +-- CreateEnum +CREATE TYPE "UserGender" AS ENUM ('male', 'female'); + +-- CreateEnum +CREATE TYPE "AdultFiltering" AS ENUM ('hide', 'show', 'explicit'); + +-- CreateEnum +CREATE TYPE "AdultAlert" AS ENUM ('hide', 'show'); + +-- CreateEnum +CREATE TYPE "VideoQuality" AS ENUM ('Q2160', 'Q1440', 'Q1080', 'Q720', 'Q480', 'Q360', 'Q240', 'Q144'); + +-- CreateEnum +CREATE TYPE "UserNotificationState" AS ENUM ('info', 'warning', 'danger'); + +-- CreateEnum +CREATE TYPE "ReportStatus" AS ENUM ('pending', 'resolved', 'rejected'); + +-- CreateEnum +CREATE TYPE "ReportReason" AS ENUM ('sexualize', 'violent', 'explicit', 'hateful', 'political', 'racist', 'spam', 'other'); + +-- CreateEnum +CREATE TYPE "AccessStatus" AS ENUM ('private', 'selected', 'protected', 'public'); + +-- CreateEnum +CREATE TYPE "AccessScope" AS ENUM ('viewer', 'editor'); + +-- CreateEnum +CREATE TYPE "MediaReviewReaction" AS ENUM ('angry', 'sad', 'awesome', 'happy', 'sleepy', 'annoyed', 'disgusting', 'disappointed'); + +-- CreateEnum +CREATE TYPE "EmailPorpose" AS ENUM ('forgot_password', 'account_activation', 'account_notification', 'subscribtion'); + +-- CreateEnum +CREATE TYPE "TypeSystemNotification" AS ENUM ('component', 'popup', 'toast'); + +-- CreateTable +CREATE TABLE "medias" ( + "id" TEXT NOT NULL, + "title" TEXT NOT NULL, + "titleAlternative" JSONB NOT NULL, + "slug" TEXT NOT NULL, + "pictureMedium" TEXT NOT NULL, + "pictureLarge" TEXT NOT NULL, + "countryId" TEXT NOT NULL, + "isAiring" BOOLEAN NOT NULL DEFAULT false, + "isTba" BOOLEAN NOT NULL DEFAULT false, + "startAiring" TIMESTAMP(3) NOT NULL, + "endAiring" TIMESTAMP(3) NOT NULL, + "synopsis" TEXT NOT NULL, + "nfsw" BOOLEAN NOT NULL DEFAULT false, + "ageRating" "AgeRating" NOT NULL, + "mediaType" "MediaType" NOT NULL, + "source" "Source" NOT NULL, + "pendingUpload" BOOLEAN NOT NULL DEFAULT true, + "uploadedBy" TEXT NOT NULL, + "deletedAt" TIMESTAMP(3), + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "medias_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "media_logs" ( + "id" TEXT NOT NULL, + "status" "MediaOperation" NOT NULL, + "approval" BOOLEAN NOT NULL DEFAULT false, + "proposedBy" TEXT NOT NULL, + "approvedBy" TEXT NOT NULL, + "mediaId" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "media_logs_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "genres" ( + "id" TEXT NOT NULL, + "name" VARCHAR(255) NOT NULL, + "slug" VARCHAR(255) NOT NULL, + "malId" INTEGER NOT NULL, + "malUrl" VARCHAR(255) NOT NULL, + "createdBy" TEXT NOT NULL, + "deletedAt" TIMESTAMP(3), + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "genres_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "studios" ( + "id" TEXT NOT NULL, + "name" VARCHAR(255) NOT NULL, + "slug" VARCHAR(255) NOT NULL, + "logoUrl" TEXT NOT NULL, + "colorHex" VARCHAR(10) NOT NULL, + "createdBy" TEXT NOT NULL, + "deletedAt" TIMESTAMP(3), + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "studios_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "countries" ( + "id" TEXT NOT NULL, + "name" VARCHAR(255) NOT NULL, + "code" VARCHAR(5) NOT NULL, + "flag" VARCHAR(10) NOT NULL, + "createdBy" TEXT NOT NULL, + "deletedAt" TIMESTAMP(3), + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "countries_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "episodes" ( + "id" TEXT NOT NULL, + "mediaId" TEXT NOT NULL, + "episode" INTEGER NOT NULL, + "name" VARCHAR(255) NOT NULL, + "pictureThumbnail" TEXT NOT NULL, + "viewed" BIGINT NOT NULL DEFAULT 0, + "likes" BIGINT NOT NULL DEFAULT 0, + "dislikes" BIGINT NOT NULL DEFAULT 0, + "pendingUpload" BOOLEAN NOT NULL DEFAULT true, + "uploadedBy" TEXT NOT NULL, + "deletedAt" TIMESTAMP(3), + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "episodes_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "episode_likes" ( + "id" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "sessionId" TEXT NOT NULL, + "episodeId" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "episode_likes_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "videos" ( + "id" TEXT NOT NULL, + "episodeId" TEXT NOT NULL, + "serviceId" TEXT NOT NULL, + "code" VARCHAR(255) NOT NULL, + "pendingUpload" BOOLEAN NOT NULL DEFAULT true, + "uploadedBy" TEXT NOT NULL, + "deletedAt" TIMESTAMP(3), + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "videos_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "video_services" ( + "id" TEXT NOT NULL, + "name" VARCHAR(255) NOT NULL, + "domain" VARCHAR(255) NOT NULL, + "logo" TEXT, + "hexColor" VARCHAR(10) NOT NULL, + "endpointVideo" TEXT NOT NULL, + "endpointThumbnail" TEXT, + "createdBy" TEXT NOT NULL, + "deletedAt" TIMESTAMP(3), + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "video_services_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "users" ( + "id" TEXT NOT NULL, + "name" VARCHAR(255) NOT NULL, + "username" VARCHAR(255) NOT NULL, + "email" TEXT NOT NULL, + "password" TEXT NOT NULL, + "birthDate" DATE, + "gender" "UserGender", + "phoneCC" INTEGER, + "phoneNumber" INTEGER, + "bioProfile" TEXT, + "profilePicture" TEXT, + "commentPicture" TEXT, + "preferenceId" TEXT, + "verifiedAt" TIMESTAMP(3), + "disabledAt" TIMESTAMP(3), + "deletedAt" TIMESTAMP(3), + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "users_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "user_preferences" ( + "id" TEXT NOT NULL, + "langPreference" TEXT, + "adultFiltering" "AdultFiltering" NOT NULL DEFAULT 'hide', + "adultAlert" "AdultAlert" NOT NULL DEFAULT 'show', + "videoQuality" "VideoQuality" NOT NULL DEFAULT 'Q1080', + "serviceDefaultId" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "user_preferences_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "user_roles" ( + "id" TEXT NOT NULL, + "name" VARCHAR(255) NOT NULL, + "primaryColor" VARCHAR(10), + "secondaryColor" VARCHAR(10), + "pictureImage" TEXT, + "badgeImage" TEXT, + "isSuperadmin" BOOLEAN NOT NULL DEFAULT false, + "canEditMedia" BOOLEAN NOT NULL DEFAULT false, + "canManageMedia" BOOLEAN NOT NULL DEFAULT false, + "canEditEpisodes" BOOLEAN NOT NULL DEFAULT false, + "canManageEpisodes" BOOLEAN NOT NULL DEFAULT false, + "canEditComment" BOOLEAN NOT NULL DEFAULT false, + "canManageComment" BOOLEAN NOT NULL DEFAULT false, + "canEditUser" BOOLEAN NOT NULL DEFAULT false, + "canManageUser" BOOLEAN NOT NULL DEFAULT false, + "canEditSystem" BOOLEAN NOT NULL DEFAULT false, + "canManageSystem" BOOLEAN NOT NULL DEFAULT false, + "createdBy" TEXT NOT NULL, + "deletedAt" TIMESTAMP(3), + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "user_roles_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "user_notifications" ( + "id" TEXT NOT NULL, + "title" VARCHAR(255) NOT NULL, + "content" TEXT NOT NULL, + "picture" TEXT NOT NULL, + "state" "UserNotificationState" NOT NULL, + "ctaLink" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "isReaded" BOOLEAN NOT NULL DEFAULT false, + "deletedAt" TIMESTAMP(3), + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "user_notifications_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "user_sessions" ( + "id" TEXT NOT NULL, + "isAuthenticated" BOOLEAN NOT NULL DEFAULT false, + "userId" TEXT NOT NULL, + "deviceType" VARCHAR(255) NOT NULL, + "deviceOs" VARCHAR(255) NOT NULL, + "deviceIp" VARCHAR(255) NOT NULL, + "isOnline" BOOLEAN NOT NULL DEFAULT false, + "lastOnline" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "validUntil" TIMESTAMP(3) NOT NULL, + "deletedAt" TIMESTAMP(3), + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "user_sessions_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "user_logs" ( + "id" TEXT NOT NULL, + "title" VARCHAR(255) NOT NULL, + "notes" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "sessionId" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "user_logs_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "collections" ( + "id" TEXT NOT NULL, + "name" VARCHAR(255) NOT NULL, + "ownerId" TEXT NOT NULL, + "accessStatus" "AccessStatus" NOT NULL DEFAULT 'private', + "password" VARCHAR(255), + "accessScope" "AccessScope" NOT NULL DEFAULT 'viewer', + "deletedAt" TIMESTAMP(3), + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "collections_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "watch_histories" ( + "id" TEXT NOT NULL, + "episodeId" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "sessionId" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "watch_histories_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "movie_reviews" ( + "id" TEXT NOT NULL, + "mediaId" TEXT NOT NULL, + "rating" INTEGER NOT NULL, + "title" VARCHAR(255) NOT NULL, + "text" TEXT NOT NULL, + "reaction" "MediaReviewReaction" NOT NULL, + "createdBy" TEXT NOT NULL, + "deletedAt" TIMESTAMP(3), + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "movie_reviews_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "comments" ( + "id" TEXT NOT NULL, + "episodeId" TEXT NOT NULL, + "text" TEXT NOT NULL, + "isParent" BOOLEAN NOT NULL DEFAULT false, + "parentId" TEXT, + "userId" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "comments_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "comment_likes" ( + "id" TEXT NOT NULL, + "commentId" TEXT NOT NULL, + "userLiked" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "comment_likes_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "comment_reports" ( + "id" TEXT NOT NULL, + "userReporter" TEXT NOT NULL, + "commentReported" TEXT NOT NULL, + "isSupervisorReport" BOOLEAN NOT NULL DEFAULT false, + "reason" "ReportReason" NOT NULL, + "status" "ReportStatus" NOT NULL, + "description" VARCHAR(255) NOT NULL, + "approvedBy" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "comment_reports_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "languages" ( + "id" TEXT NOT NULL, + "name" VARCHAR(255) NOT NULL, + "code" VARCHAR(5) NOT NULL, + "countryFlag" VARCHAR(10) NOT NULL, + "fileLocation" TEXT NOT NULL, + "craetedBy" TEXT NOT NULL, + "deletedAt" TIMESTAMP(3), + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "languages_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "email_system_accounts" ( + "id" TEXT NOT NULL, + "name" TEXT NOT NULL, + "host" VARCHAR(255) NOT NULL, + "port" INTEGER NOT NULL, + "secure" BOOLEAN NOT NULL, + "email" VARCHAR(255) NOT NULL, + "username" VARCHAR(255) NOT NULL, + "password" VARCHAR(255) NOT NULL, + "purpose" "EmailPorpose" NOT NULL, + "createdBy" TEXT NOT NULL, + "deletedAt" TIMESTAMP(3), + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "email_system_accounts_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "email_system_histories" ( + "id" TEXT NOT NULL, + "purpose" "EmailPorpose" NOT NULL, + "fromEmail" TEXT NOT NULL, + "toEmail" TEXT NOT NULL, + "userRelated" TEXT NOT NULL, + "title" VARCHAR(255) NOT NULL, + "htmlContent" TEXT NOT NULL, + "deletedAt" TIMESTAMP(3), + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "email_system_histories_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "system_preferences" ( + "id" TEXT NOT NULL, + "key" VARCHAR(225) NOT NULL, + "value" VARCHAR(225) NOT NULL, + "description" TEXT NOT NULL, + "deletedAt" TIMESTAMP(3), + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "system_preferences_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "system_notifications" ( + "id" TEXT NOT NULL, + "type" "TypeSystemNotification" NOT NULL, + "componentName" VARCHAR(255), + "popupImage" TEXT, + "titleToast" VARCHAR(255), + "contentToast" TEXT, + "createdBy" TEXT NOT NULL, + "deletedAt" TIMESTAMP(3), + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "system_notifications_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "system_logs" ( + "id" TEXT NOT NULL, + "title" VARCHAR(255) NOT NULL, + "notes" TEXT NOT NULL, + "relatedUser" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "system_logs_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "_MediaStudios" ( + "A" TEXT NOT NULL, + "B" TEXT NOT NULL, + + CONSTRAINT "_MediaStudios_AB_pkey" PRIMARY KEY ("A","B") +); + +-- CreateTable +CREATE TABLE "_MediaGenres" ( + "A" TEXT NOT NULL, + "B" TEXT NOT NULL, + + CONSTRAINT "_MediaGenres_AB_pkey" PRIMARY KEY ("A","B") +); + +-- CreateTable +CREATE TABLE "_UserFavoriteGenres" ( + "A" TEXT NOT NULL, + "B" TEXT NOT NULL, + + CONSTRAINT "_UserFavoriteGenres_AB_pkey" PRIMARY KEY ("A","B") +); + +-- CreateTable +CREATE TABLE "_UserShowContries" ( + "A" TEXT NOT NULL, + "B" TEXT NOT NULL, + + CONSTRAINT "_UserShowContries_AB_pkey" PRIMARY KEY ("A","B") +); + +-- CreateTable +CREATE TABLE "_UserRoles" ( + "A" TEXT NOT NULL, + "B" TEXT NOT NULL, + + CONSTRAINT "_UserRoles_AB_pkey" PRIMARY KEY ("A","B") +); + +-- CreateTable +CREATE TABLE "_MediaCollections" ( + "A" TEXT NOT NULL, + "B" TEXT NOT NULL, + + CONSTRAINT "_MediaCollections_AB_pkey" PRIMARY KEY ("A","B") +); + +-- CreateTable +CREATE TABLE "_UserSelectedSharingCollention" ( + "A" TEXT NOT NULL, + "B" TEXT NOT NULL, + + CONSTRAINT "_UserSelectedSharingCollention_AB_pkey" PRIMARY KEY ("A","B") +); + +-- CreateIndex +CREATE UNIQUE INDEX "video_services_name_key" ON "video_services"("name"); + +-- CreateIndex +CREATE UNIQUE INDEX "users_username_key" ON "users"("username"); + +-- CreateIndex +CREATE UNIQUE INDEX "users_email_key" ON "users"("email"); + +-- CreateIndex +CREATE UNIQUE INDEX "users_preferenceId_key" ON "users"("preferenceId"); + +-- CreateIndex +CREATE UNIQUE INDEX "user_roles_name_key" ON "user_roles"("name"); + +-- CreateIndex +CREATE UNIQUE INDEX "languages_code_key" ON "languages"("code"); + +-- CreateIndex +CREATE UNIQUE INDEX "email_system_accounts_name_key" ON "email_system_accounts"("name"); + +-- CreateIndex +CREATE UNIQUE INDEX "email_system_accounts_email_key" ON "email_system_accounts"("email"); + +-- CreateIndex +CREATE UNIQUE INDEX "email_system_accounts_username_key" ON "email_system_accounts"("username"); + +-- CreateIndex +CREATE INDEX "_MediaStudios_B_index" ON "_MediaStudios"("B"); + +-- CreateIndex +CREATE INDEX "_MediaGenres_B_index" ON "_MediaGenres"("B"); + +-- CreateIndex +CREATE INDEX "_UserFavoriteGenres_B_index" ON "_UserFavoriteGenres"("B"); + +-- CreateIndex +CREATE INDEX "_UserShowContries_B_index" ON "_UserShowContries"("B"); + +-- CreateIndex +CREATE INDEX "_UserRoles_B_index" ON "_UserRoles"("B"); + +-- CreateIndex +CREATE INDEX "_MediaCollections_B_index" ON "_MediaCollections"("B"); + +-- CreateIndex +CREATE INDEX "_UserSelectedSharingCollention_B_index" ON "_UserSelectedSharingCollention"("B"); + +-- AddForeignKey +ALTER TABLE "medias" ADD CONSTRAINT "medias_countryId_fkey" FOREIGN KEY ("countryId") REFERENCES "countries"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "medias" ADD CONSTRAINT "medias_uploadedBy_fkey" FOREIGN KEY ("uploadedBy") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "media_logs" ADD CONSTRAINT "media_logs_proposedBy_fkey" FOREIGN KEY ("proposedBy") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "media_logs" ADD CONSTRAINT "media_logs_approvedBy_fkey" FOREIGN KEY ("approvedBy") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "media_logs" ADD CONSTRAINT "media_logs_mediaId_fkey" FOREIGN KEY ("mediaId") REFERENCES "medias"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "genres" ADD CONSTRAINT "genres_createdBy_fkey" FOREIGN KEY ("createdBy") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "studios" ADD CONSTRAINT "studios_createdBy_fkey" FOREIGN KEY ("createdBy") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "countries" ADD CONSTRAINT "countries_createdBy_fkey" FOREIGN KEY ("createdBy") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "episodes" ADD CONSTRAINT "episodes_mediaId_fkey" FOREIGN KEY ("mediaId") REFERENCES "medias"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "episodes" ADD CONSTRAINT "episodes_uploadedBy_fkey" FOREIGN KEY ("uploadedBy") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "episode_likes" ADD CONSTRAINT "episode_likes_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "episode_likes" ADD CONSTRAINT "episode_likes_sessionId_fkey" FOREIGN KEY ("sessionId") REFERENCES "user_sessions"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "episode_likes" ADD CONSTRAINT "episode_likes_episodeId_fkey" FOREIGN KEY ("episodeId") REFERENCES "episodes"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "videos" ADD CONSTRAINT "videos_episodeId_fkey" FOREIGN KEY ("episodeId") REFERENCES "episodes"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "videos" ADD CONSTRAINT "videos_serviceId_fkey" FOREIGN KEY ("serviceId") REFERENCES "video_services"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "videos" ADD CONSTRAINT "videos_uploadedBy_fkey" FOREIGN KEY ("uploadedBy") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "video_services" ADD CONSTRAINT "video_services_createdBy_fkey" FOREIGN KEY ("createdBy") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "users" ADD CONSTRAINT "users_preferenceId_fkey" FOREIGN KEY ("preferenceId") REFERENCES "user_preferences"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "user_preferences" ADD CONSTRAINT "user_preferences_langPreference_fkey" FOREIGN KEY ("langPreference") REFERENCES "languages"("code") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "user_preferences" ADD CONSTRAINT "user_preferences_serviceDefaultId_fkey" FOREIGN KEY ("serviceDefaultId") REFERENCES "video_services"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "user_roles" ADD CONSTRAINT "user_roles_createdBy_fkey" FOREIGN KEY ("createdBy") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "user_notifications" ADD CONSTRAINT "user_notifications_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "user_sessions" ADD CONSTRAINT "user_sessions_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "user_logs" ADD CONSTRAINT "user_logs_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "user_logs" ADD CONSTRAINT "user_logs_sessionId_fkey" FOREIGN KEY ("sessionId") REFERENCES "user_sessions"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "collections" ADD CONSTRAINT "collections_ownerId_fkey" FOREIGN KEY ("ownerId") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "watch_histories" ADD CONSTRAINT "watch_histories_id_fkey" FOREIGN KEY ("id") REFERENCES "episodes"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "watch_histories" ADD CONSTRAINT "watch_histories_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "watch_histories" ADD CONSTRAINT "watch_histories_sessionId_fkey" FOREIGN KEY ("sessionId") REFERENCES "user_sessions"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "movie_reviews" ADD CONSTRAINT "movie_reviews_mediaId_fkey" FOREIGN KEY ("mediaId") REFERENCES "medias"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "movie_reviews" ADD CONSTRAINT "movie_reviews_createdBy_fkey" FOREIGN KEY ("createdBy") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "comments" ADD CONSTRAINT "comments_episodeId_fkey" FOREIGN KEY ("episodeId") REFERENCES "episodes"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "comments" ADD CONSTRAINT "comments_parentId_fkey" FOREIGN KEY ("parentId") REFERENCES "comments"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "comments" ADD CONSTRAINT "comments_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "comment_likes" ADD CONSTRAINT "comment_likes_commentId_fkey" FOREIGN KEY ("commentId") REFERENCES "comments"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "comment_likes" ADD CONSTRAINT "comment_likes_userLiked_fkey" FOREIGN KEY ("userLiked") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "comment_reports" ADD CONSTRAINT "comment_reports_userReporter_fkey" FOREIGN KEY ("userReporter") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "comment_reports" ADD CONSTRAINT "comment_reports_approvedBy_fkey" FOREIGN KEY ("approvedBy") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "languages" ADD CONSTRAINT "languages_craetedBy_fkey" FOREIGN KEY ("craetedBy") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "email_system_accounts" ADD CONSTRAINT "email_system_accounts_createdBy_fkey" FOREIGN KEY ("createdBy") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "email_system_histories" ADD CONSTRAINT "email_system_histories_userRelated_fkey" FOREIGN KEY ("userRelated") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "system_notifications" ADD CONSTRAINT "system_notifications_createdBy_fkey" FOREIGN KEY ("createdBy") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "system_logs" ADD CONSTRAINT "system_logs_relatedUser_fkey" FOREIGN KEY ("relatedUser") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "_MediaStudios" ADD CONSTRAINT "_MediaStudios_A_fkey" FOREIGN KEY ("A") REFERENCES "medias"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "_MediaStudios" ADD CONSTRAINT "_MediaStudios_B_fkey" FOREIGN KEY ("B") REFERENCES "studios"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "_MediaGenres" ADD CONSTRAINT "_MediaGenres_A_fkey" FOREIGN KEY ("A") REFERENCES "genres"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "_MediaGenres" ADD CONSTRAINT "_MediaGenres_B_fkey" FOREIGN KEY ("B") REFERENCES "medias"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "_UserFavoriteGenres" ADD CONSTRAINT "_UserFavoriteGenres_A_fkey" FOREIGN KEY ("A") REFERENCES "genres"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "_UserFavoriteGenres" ADD CONSTRAINT "_UserFavoriteGenres_B_fkey" FOREIGN KEY ("B") REFERENCES "user_preferences"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "_UserShowContries" ADD CONSTRAINT "_UserShowContries_A_fkey" FOREIGN KEY ("A") REFERENCES "countries"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "_UserShowContries" ADD CONSTRAINT "_UserShowContries_B_fkey" FOREIGN KEY ("B") REFERENCES "user_preferences"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "_UserRoles" ADD CONSTRAINT "_UserRoles_A_fkey" FOREIGN KEY ("A") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "_UserRoles" ADD CONSTRAINT "_UserRoles_B_fkey" FOREIGN KEY ("B") REFERENCES "user_roles"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "_MediaCollections" ADD CONSTRAINT "_MediaCollections_A_fkey" FOREIGN KEY ("A") REFERENCES "collections"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "_MediaCollections" ADD CONSTRAINT "_MediaCollections_B_fkey" FOREIGN KEY ("B") REFERENCES "medias"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "_UserSelectedSharingCollention" ADD CONSTRAINT "_UserSelectedSharingCollention_A_fkey" FOREIGN KEY ("A") REFERENCES "collections"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "_UserSelectedSharingCollention" ADD CONSTRAINT "_UserSelectedSharingCollention_B_fkey" FOREIGN KEY ("B") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/migrations/migration_lock.toml b/prisma/migrations/migration_lock.toml new file mode 100644 index 0000000..044d57c --- /dev/null +++ b/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (e.g., Git) +provider = "postgresql" diff --git a/scripts/create-example-env.ts b/scripts/create-example-env.ts new file mode 100644 index 0000000..32e7423 --- /dev/null +++ b/scripts/create-example-env.ts @@ -0,0 +1,52 @@ +import fs from "fs"; +import path from "path"; + +const PRESERVED_KEYS = [ + "APP_NAME", + "APP_ENV", + "PORT", + "API_KEY", + "ALLOWED_ORIGINS", + "REDIS_HOST", + "REDIS_PORT", +]; + +try { + const envPath = path.join(process.cwd(), ".env"); + const envExamplePath = path.join(process.cwd(), ".env.example"); + + if (!fs.existsSync(envPath)) { + console.error(`.env file not found at ${envPath}`); + process.exit(1); + } + + const envContent = fs.readFileSync(envPath, "utf-8"); + + const lines = envContent.split("\n"); + const processedLines = lines.map((line) => { + const trimmedLine = line.trim(); + + if (trimmedLine.startsWith("#") || trimmedLine === "") { + return line; + } + + const delimeterIndex = line.indexOf("="); + if (delimeterIndex === -1) { + return line; + } + + const key = line.substring(0, delimeterIndex).trim(); + const value = line.substring(delimeterIndex + 1).trim(); + + if (PRESERVED_KEYS.includes(key)) { + return `${key}=${value}`; + } + return `${key}=`; + }); + + fs.writeFileSync(envExamplePath, processedLines.join("\n")); + console.log("File .env.example berhasil diperbarui!"); +} catch (error) { + console.error("Error while creating .env.example:", error); + process.exit(1); +} diff --git a/scripts/sync-routes.ts b/scripts/sync-routes.ts new file mode 100644 index 0000000..03aa674 --- /dev/null +++ b/scripts/sync-routes.ts @@ -0,0 +1,51 @@ +/** + * Dynamically aggregates Elysia sub-routes from modular directories into a central registry. + * + * @behavior + * 1. Scans `./src/modules` for valid Elysia modules + * 2. Generates imports and `.use()` calls for each module + * 3. Writes composed routes to `./src/routes.ts` + * + * @requirements + * - Module directories must contain an export named `[folderName]Module` + * (e.g., `userModule` for `/user` folder) + * - Modules must export an Elysia instance + * + * @outputfile ./src/routes.ts + * @examplegenerated + * ```ts + * import Elysia from "elysia"; + * import { userModule } from './modules/user'; + * import { authModule } from './modules/auth'; + * + * const routes = new Elysia() + * .use(userModule) + * .use(authModule); + * + * export { routes }; + * ``` + */ +import { writeFileSync, readdirSync } from "fs"; +import { join } from "path"; + +const modulesPath = "./src/modules"; +const importLines: string[] = []; +const useLines: string[] = []; + +for (const folder of readdirSync(modulesPath, { withFileTypes: true })) { + if (folder.isDirectory()) { + const varName = `${folder.name}Module`; + importLines.push(`import {${varName}} from './modules/${folder.name}';`); + useLines.push(`.use(${varName})`); + } +} + +const content = ` +import Elysia from "elysia"; +${importLines.join("\n")} +const routes = new Elysia() +${useLines.join("\n")}; +export { routes }; +`; + +writeFileSync(join(modulesPath, "../routes.ts"), content); diff --git a/src/index.ts b/src/index.ts index 4db0e8f..d25a260 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,7 +1,7 @@ import { Elysia } from "elysia"; import { routes } from "./routes"; -const app = new Elysia().use(routes).listen(3200); +const app = new Elysia().use(routes).listen(process.env.PORT || 3000); console.log( `🦊 Elysia is running at ${app.server?.hostname}:${app.server?.port}` diff --git a/src/routes.legacy.ts b/src/routes.legacy.ts new file mode 100644 index 0000000..07f8565 --- /dev/null +++ b/src/routes.legacy.ts @@ -0,0 +1,32 @@ +import Elysia from "elysia"; +import { pathToFileURL } from "bun"; +import { readdirSync } from "fs"; +import { join } from "path"; + +const routes = new Elysia(); + +const modulesPath = join(__dirname, "./modules"); + +for (const folder of readdirSync(modulesPath, { withFileTypes: true })) { + if (folder.isDirectory()) { + const moduleIndex = join(modulesPath, folder.name, "index.ts"); + + try { + const module = await import(pathToFileURL(moduleIndex).href); + + const mod = Object.values(module).find( + (m): m is Elysia => m instanceof Elysia + ); + + if (mod) { + routes.use(mod); + } + } catch (error) { + console.warn( + `Module ${folder.name} not found. Please check the module path or name: ${error}` + ); + } + } +} + +export { routes }; diff --git a/src/routes.ts b/src/routes.ts index 07f8565..526fc3f 100644 --- a/src/routes.ts +++ b/src/routes.ts @@ -1,32 +1,12 @@ + import Elysia from "elysia"; -import { pathToFileURL } from "bun"; -import { readdirSync } from "fs"; -import { join } from "path"; - -const routes = new Elysia(); - -const modulesPath = join(__dirname, "./modules"); - -for (const folder of readdirSync(modulesPath, { withFileTypes: true })) { - if (folder.isDirectory()) { - const moduleIndex = join(modulesPath, folder.name, "index.ts"); - - try { - const module = await import(pathToFileURL(moduleIndex).href); - - const mod = Object.values(module).find( - (m): m is Elysia => m instanceof Elysia - ); - - if (mod) { - routes.use(mod); - } - } catch (error) { - console.warn( - `Module ${folder.name} not found. Please check the module path or name: ${error}` - ); - } - } -} - +import {authModule} from './modules/auth'; +import {userModule} from './modules/user'; +import {userRoleModule} from './modules/userRole'; +import {userSessionModule} from './modules/userSession'; +const routes = new Elysia() +.use(authModule) +.use(userModule) +.use(userRoleModule) +.use(userSessionModule); export { routes };