From b554ff0e5b78d1827a4815162a1802748bb405a9 Mon Sep 17 00:00:00 2001 From: rafiarrafif Date: Tue, 6 May 2025 01:11:50 +0700 Subject: [PATCH] add basic files --- .gitignore | 7 + bun.lockb | Bin 8569 -> 22482 bytes package.json | 7 +- prisma/schema.prisma | 642 ++++++++++++++++++ .../user/controller/createUser.controller.ts | 0 .../user/controller/getAllUser.controller.ts | 0 src/modules/user/index.ts | 0 .../user/services/createUser.service.ts | 0 .../user/services/getAllUser.service.ts | 0 src/modules/user/user.model.ts | 0 src/modules/user/user.repository.ts | 0 src/modules/user/user.schema.ts | 0 src/modules/user/user.types.ts | 0 .../controller/createUserRole.controller.ts | 5 + src/modules/userRole/index.ts | 6 + .../services/createUserRole.service.ts | 0 src/modules/userRole/userRole.model.ts | 0 src/modules/userRole/userRole.repository.ts | 0 src/modules/userRole/userRole.schema.ts | 0 src/modules/userRole/userRole.types.ts | 0 src/routes.ts | 4 + 21 files changed, 669 insertions(+), 2 deletions(-) create mode 100644 prisma/schema.prisma create mode 100644 src/modules/user/controller/createUser.controller.ts create mode 100644 src/modules/user/controller/getAllUser.controller.ts create mode 100644 src/modules/user/index.ts create mode 100644 src/modules/user/services/createUser.service.ts create mode 100644 src/modules/user/services/getAllUser.service.ts create mode 100644 src/modules/user/user.model.ts create mode 100644 src/modules/user/user.repository.ts create mode 100644 src/modules/user/user.schema.ts create mode 100644 src/modules/user/user.types.ts create mode 100644 src/modules/userRole/controller/createUserRole.controller.ts create mode 100644 src/modules/userRole/index.ts create mode 100644 src/modules/userRole/services/createUserRole.service.ts create mode 100644 src/modules/userRole/userRole.model.ts create mode 100644 src/modules/userRole/userRole.repository.ts create mode 100644 src/modules/userRole/userRole.schema.ts create mode 100644 src/modules/userRole/userRole.types.ts create mode 100644 src/routes.ts diff --git a/.gitignore b/.gitignore index 6356b67..d0624e2 100644 --- a/.gitignore +++ b/.gitignore @@ -41,6 +41,13 @@ yarn-error.log* package-lock.json **/*.bun +# local env files +.env +.env.local +.env.development +.env.test +.env.production + # compiled output server server.exe \ No newline at end of file diff --git a/bun.lockb b/bun.lockb index 35695824ad671102c239ba3b30ddfeceedc1e5fa..d0482c763bc69c9cc8188a6bb5a44dc4c0fe1d2b 100644 GIT binary patch literal 22482 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 diff --git a/package.json b/package.json index 5c8d547..f94ba05 100644 --- a/package.json +++ b/package.json @@ -3,13 +3,16 @@ "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" }, "dependencies": { + "@prisma/client": "^6.7.0", "elysia": "latest" }, "devDependencies": { - "bun-types": "latest" + "bun-types": "latest", + "prisma": "^6.7.0" }, "module": "src/index.js" -} \ No newline at end of file +} diff --git a/prisma/schema.prisma b/prisma/schema.prisma new file mode 100644 index 0000000..192e10e --- /dev/null +++ b/prisma/schema.prisma @@ -0,0 +1,642 @@ +// This is your Prisma schema file, +// learn more about it in the docs: https://pris.ly/d/prisma-schema + +// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions? +// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init + + +//// Prisma Configuration //// + +generator client { + provider = "prisma-client-js" +} +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} + + + + + +//// Prisma Model //// + +model Media { + id String @id @default(uuid()) + title String @db.Text + titleAlternative Json + slug String @db.Text + pictureMedium String @db.Text + pictureLarge String @db.Text + genres Genre[] @relation("MediaGenres") + country Country @relation("MediaCounty", fields: [countryId], references: [id]) + countryId String + isAiring Boolean @default(false) + isTba Boolean @default(false) + startAiring DateTime + endAiring DateTime + synopsis String @db.Text + nfsw Boolean @default(false) + ageRating AgeRating + mediaType MediaType + source Source + studios Studio[] @relation("MediaStudios") + pendingUpload Boolean @default(true) + uploader User @relation("UserUploadedMedias", fields: [uploadedBy], references: [id]) + uploadedBy String + deletedAt DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + + logs MediaLog[] @relation("MediaLogs") + episodes Episode[] @relation("MediaEpisodes") + collections Collection[] @relation("MediaCollections") + reviews MediaReview[] @relation("MediaReviews") + @@map("medias") +} + +model MediaLog { + id String @id @default(uuid()) + status MediaOperation + approval Boolean @default(false) + proposer User @relation("UserProposedMedias", fields: [proposedBy], references: [id]) + proposedBy String + approver User @relation("UserApprovedMedias", fields: [approvedBy], references: [id]) + approvedBy String + media Media @relation("MediaLogs", fields: [mediaId], references: [id]) + mediaId String + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + @@map("media_logs") +} + +model Genre { + id String @id @default(uuid()) + name String @db.VarChar(255) + slug String @db.VarChar(255) + malId Int + malUrl String @db.VarChar(255) + creator User @relation("UserCreatedGenres", fields: [createdBy], references: [id]) + createdBy String + deletedAt DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + + medias Media[] @relation("MediaGenres") + user_favourite_genres UserPreference[] @relation("UserFavoriteGenres") + @@map("genres") +} + +model Studio { + id String @id @default(uuid()) + name String @db.VarChar(255) + slug String @db.VarChar(255) + logoUrl String @db.Text + colorHex String @db.VarChar(10) + creator User @relation("UserCreatedStudios", fields: [createdBy], references: [id]) + createdBy String + deletedAt DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + + medias Media[] @relation("MediaStudios") + @@map("studios") +} + +model Country { + id String @id @default(uuid()) + name String @db.VarChar(255) + code String @db.VarChar(5) + flag String @db.VarChar(10) + creator User @relation("UserCreatedCountry", fields: [createdBy], references: [id]) + createdBy String + deletedAt DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + + medias Media[] @relation("MediaCounty") + user_show_countries UserPreference[] @relation("UserShowContries") + @@map("countries") +} + +model Episode { + id String @id @default(uuid()) + media Media @relation("MediaEpisodes", fields: [mediaId], references: [id]) + mediaId String + episode Int + name String @db.VarChar(255) + pictureThumbnail String @db.Text + viewed BigInt @default(0) + likes BigInt @default(0) + dislikes BigInt @default(0) + pendingUpload Boolean @default(true) + uploader User @relation("UserEpisodes", fields: [uploadedBy], references: [id]) + uploadedBy String + deletedAt DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + + user_likes EpisodeLike[] @relation("EpisodeLikes") + videos Video[] @relation("EpisodeVideos") + user_histories WatchHistory[] @relation("EpisodeWatchHistories") + comments Comment[] @relation("EpisodeComments") + @@map("episodes") +} + +model EpisodeLike { + id String @id @default(uuid()) + user User @relation("UserEpisodeLikes", fields: [userId], references: [id]) + userId String + session UserSession @relation("SessionEpisodeLikes", fields: [sessionId], references: [id]) + sessionId String + episode Episode @relation("EpisodeLikes", fields: [episodeId], references: [id]) + episodeId String + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + @@map("episode_likes") +} + +model Video { + id String @id @default(uuid()) + episode Episode @relation("EpisodeVideos", fields: [episodeId], references: [id]) + episodeId String + service VideoService @relation("VideoServices", fields: [serviceId], references: [id]) + serviceId String + code String @db.VarChar(255) + pendingUpload Boolean @default(true) + uploader User @relation("UserVideos", fields: [uploadedBy], references: [id]) + uploadedBy String + deletedAt DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + @@map("videos") +} + +model VideoService { + id String @id @default(uuid()) + name String @db.VarChar(255) @unique + domain String @db.VarChar(255) + logo String? @db.Text + hexColor String @db.VarChar(10) + endpointVideo String @db.Text + endpointThumbnail String? @db.Text + creator User @relation("UserVideoServices", fields: [createdBy], references: [id]) + createdBy String + deletedAt DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + + videos Video[] @relation("VideoServices") + user_preferences UserPreference[] @relation("UserServiceDefault") + @@map("video_services") +} + +model User { + id String @id @default(uuid()) + name String @db.VarChar(255) + username String @unique @db.VarChar(255) + email String @unique @db.Text + password String @db.Text + birthDate DateTime? @db.Date + gender UserGender? + phoneCC Int? + phoneNumber Int? + roles UserRole[] @relation("UserRoles") + bioProfile String? @db.Text + profilePicture String? @db.Text + commentPicture String? @db.Text + preference UserPreference? @relation(fields: [preferenceId], references: [id]) + preferenceId String? @unique + verifiedAt DateTime? + disabledAt DateTime? + deletedAt DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + + medias Media[] @relation("UserUploadedMedias") + media_proposeds MediaLog[] @relation("UserProposedMedias") + media_approveds MediaLog[] @relation("UserApprovedMedias") + genres Genre[] @relation("UserCreatedGenres") + studios Studio[] @relation("UserCreatedStudios") + countries Country[] @relation("UserCreatedCountry") + episodes Episode[] @relation("UserEpisodes") + episode_likes EpisodeLike[] @relation("UserEpisodeLikes") + videos Video[] @relation("UserVideos") + video_services VideoService[] @relation("UserVideoServices") + create_roles UserRole[] @relation("UserCreateRoles") + notifications UserNotification[] @relation("UserNotifications") + sessions UserSession[] @relation("UserSession") + logs UserLog[] @relation("UserLogs") + collections Collection[] @relation("UserCollections") + allowed_collections Collection[] @relation("UserSelectedSharingCollention") + watch_histories WatchHistory[] @relation("UserWatchHistories") + media_reviews MediaReview[] @relation("UserMediaReviews") + comments Comment[] @relation("UserComments") + liked_comments CommentLike[] @relation("UserCommentLikes") + reported_comments CommentReport[] @relation("UserReportComments") + approved_comments CommentReport[] @relation("ApprovedReportComments") + create_languages Language[] @relation("UserCreateLanguages") + user_create_email EmailSystemAccount[] @relation("UserCreateSystemAccount") + user_emails EmailSystemHistory[] @relation("UserEmails") + sys_notifications SystemNotification[] @relation("UserCreatorSystemNotifications") + sys_logs SystemLog[] @relation("UserSystemLogs") + @@map("users") +} + +model UserPreference { + id String @id @default(uuid()) + userId User? @relation() + lang Language? @relation("UserPreferenceLang", fields: [langPreference], references: [code]) + langPreference String? + adultFiltering AdultFiltering @default(hide) + adultAlert AdultAlert @default(show) + videoQuality VideoQuality @default(Q1080) + serviceDefault VideoService? @relation("UserServiceDefault", fields: [serviceDefaultId], references: [id]) + serviceDefaultId String? + showContries Country[] @relation("UserShowContries") + favoriteGenres Genre[] @relation("UserFavoriteGenres") + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + @@map("user_preferences") +} + +model UserRole { + id String @id @default(uuid()) + name String @db.VarChar(255) @unique + primaryColor String? @db.VarChar(10) + secondaryColor String? @db.VarChar(10) + pictureImage String? @db.Text + badgeImage String? @db.Text + isSuperadmin Boolean @default(false) + canEditMedia Boolean @default(false) + canManageMedia Boolean @default(false) + canEditEpisodes Boolean @default(false) + canManageEpisodes Boolean @default(false) + canEditComment Boolean @default(false) + canManageComment Boolean @default(false) + canEditUser Boolean @default(false) + canManageUser Boolean @default(false) + canEditSystem Boolean @default(false) + canManageSystem Boolean @default(false) + creator User @relation("UserCreateRoles", fields: [createdBy], references: [id]) + createdBy String + deletedAt DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + + users User[] @relation("UserRoles") + @@map("user_roles") +} + +model UserNotification { + id String @id @default(uuid()) + title String @db.VarChar(255) + content String @db.Text + picture String @db.Text + state UserNotificationState + ctaLink String @db.Text + user User @relation("UserNotifications", fields: [userId], references: [id]) + userId String + isReaded Boolean @default(false) + deletedAt DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + @@map("user_notifications") +} + +model UserSession { + id String @id @default(uuid()) + isAuthenticated Boolean @default(false) + user User @relation("UserSession", fields: [userId], references: [id]) + userId String + deviceType String @db.VarChar(255) + deviceOs String @db.VarChar(255) + deviceIp String @db.VarChar(255) + isOnline Boolean @default(false) + lastOnline DateTime @default(now()) + validUntil DateTime + deletedAt DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + + logs UserLog[] @relation("UserSessionLogs") + episode_likes EpisodeLike[] @relation("SessionEpisodeLikes") + watch_histories WatchHistory[] @relation("SessionWatchHistories") + @@map("user_sessions") +} + +model UserLog { + id String @id @default(uuid()) + title String @db.VarChar(255) + notes String @db.Text + user User @relation("UserLogs", fields: [userId], references: [id]) + userId String + session UserSession @relation("UserSessionLogs", fields: [sessionId], references: [id]) + sessionId String + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + @@map("user_logs") +} + +model Collection { + id String @id @default(uuid()) + name String @db.VarChar(255) + medias Media[] @relation("MediaCollections") + owner User @relation("UserCollections", fields: [ownerId], references: [id]) + ownerId String + accessStatus AccessStatus @default(private) + password String? @db.VarChar(255) + usersAllowed User[] @relation("UserSelectedSharingCollention") + accessScope AccessScope @default(viewer) + deletedAt DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + @@map("collections") +} + +model WatchHistory { + id String @id @default(uuid()) + episode Episode @relation("EpisodeWatchHistories", fields: [id], references: [id]) + episodeId String + user User @relation("UserWatchHistories", fields: [userId], references: [id]) + userId String + session UserSession @relation("SessionWatchHistories", fields: [sessionId], references: [id]) + sessionId String + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + @@map("watch_histories") +} + +model MediaReview { + id String @id @default(uuid()) + media Media @relation("MediaReviews", fields: [mediaId], references:[id]) + mediaId String + rating Int + title String @db.VarChar(255) + text String @db.Text + reaction MediaReviewReaction + creator User @relation("UserMediaReviews", fields: [createdBy], references: [id]) + createdBy String + deletedAt DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + @@map("movie_reviews") +} + +model Comment { + id String @id @default(uuid()) + episode Episode @relation("EpisodeComments", fields: [episodeId], references: [id]) + episodeId String + text String @db.Text + isParent Boolean @default(false) + parent Comment? @relation("ParentReplyComments", fields: [parentId], references: [id]) + parentId String? + user User @relation("UserComments", fields: [userId], references: [id]) + userId String + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + + replies Comment[] @relation("ParentReplyComments") + likes CommentLike[] @relation("CommentLikes") + @@map("comments") +} + +model CommentLike { + id String @id @default(uuid()) + comment Comment @relation("CommentLikes", fields: [commentId], references: [id]) + commentId String + user User @relation("UserCommentLikes", fields: [userLiked], references: [id]) + userLiked String + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + @@map("comment_likes") +} + +model CommentReport { + id String @id @default(uuid()) + reporter User @relation("UserReportComments", fields: [userReporter], references: [id]) + userReporter String + commentReported String + isSupervisorReport Boolean @default(false) + reason ReportReason + status ReportStatus + description String @db.VarChar(255) + approver User? @relation("ApprovedReportComments", fields: [approvedBy], references: [id]) + approvedBy String? + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + @@map("comment_reports") +} + +model Language { + id String @id @default(uuid()) + name String @db.VarChar(255) + code String @db.VarChar(5) @unique + countryFlag String @db.VarChar(10) + fileLocation String @db.Text + creator User @relation("UserCreateLanguages", fields: [craetedBy], references: [id]) + craetedBy String + deletedAt DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + + user_used UserPreference[] @relation("UserPreferenceLang") + @@map("languages") +} + +model EmailSystemAccount { + id String @id @default(uuid()) + name String @unique + host String @db.VarChar(255) + port Int + secure Boolean + email String @unique @db.VarChar(255) + username String @unique @db.VarChar(255) + password String @db.VarChar(255) + purpose EmailPorpose + creator User @relation("UserCreateSystemAccount", fields: [createdBy], references: [id]) + createdBy String + deletedAt DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + @@map("email_system_accounts") +} + +model EmailSystemHistory { + id String @id @default(uuid()) + purpose EmailPorpose + fromEmail String @db.Text + toEmail String @db.Text + user User @relation("UserEmails", fields: [userRelated], references: [id]) + userRelated String + title String @db.VarChar(255) + htmlContent String @db.Text + deletedAt DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + @@map("email_system_histories") +} + +model SystemPreference { + id String @id @default(uuid()) + key String @db.VarChar(225) + value String @db.VarChar(225) + description String @db.Text + deletedAt DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + @@map("system_preferences") +} + +model SystemNotification { + id String @id @default(uuid()) + type TypeSystemNotification + componentName String? @db.VarChar(255) + popupImage String? @db.Text + titleToast String? @db.VarChar(255) + contentToast String? @db.Text + creator User @relation("UserCreatorSystemNotifications", fields: [createdBy], references: [id]) + createdBy String + deletedAt DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + @@map("system_notifications") +} + +model SystemLog { + id String @id @default(uuid()) + title String @db.VarChar(255) + notes String @db.Text + user User? @relation("UserSystemLogs", fields: [relatedUser], references: [id]) + relatedUser String? + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + @@map("system_logs") +} + + + + + +//// Prisma Enum Values //// + +// Media Enum +enum AgeRating { + G // All Ages + PG // Children + PG_13 // Teens 13 or older + R // 17+ (violance & profanity) + R_plus // Mild Nudity + Rx // Hentai +} +enum MediaType { + TV + ONA + OVA + Movie + Special + Music +} +enum Source { + original + manga + light_novel + game +} + +// MediaLog Enum +enum MediaOperation { + create + update + delete +} + +// User Enum +enum UserGender { + male + female +} + +// UserPreference Enum +enum AdultFiltering { + hide + show + explicit +} +enum AdultAlert { + hide + show +} +enum VideoQuality { + Q2160 + Q1440 + Q1080 + Q720 + Q480 + Q360 + Q240 + Q144 +} + +// userNotification Enum +enum UserNotificationState { + info + warning + danger +} + +// CommentReport Enum +enum ReportStatus { + pending + resolved + rejected +} +enum ReportReason { + sexualize + violent + explicit + hateful + political + racist + spam + other +} + +// Collection Enum +enum AccessStatus { + private + selected + protected + public +} +enum AccessScope { + viewer + editor +} + +// MediaReview Enum +enum MediaReviewReaction { + angry + sad + awesome + happy + sleepy + annoyed + disgusting + disappointed +} + +// EmailSystemHistory Enum +enum EmailPorpose { + forgot_password + account_activation + account_notification + subscribtion +} + +// systemNotification Enum +enum TypeSystemNotification { + component + popup + toast +} \ No newline at end of file diff --git a/src/modules/user/controller/createUser.controller.ts b/src/modules/user/controller/createUser.controller.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/user/controller/getAllUser.controller.ts b/src/modules/user/controller/getAllUser.controller.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/user/index.ts b/src/modules/user/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/user/services/createUser.service.ts b/src/modules/user/services/createUser.service.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/user/services/getAllUser.service.ts b/src/modules/user/services/getAllUser.service.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/user/user.model.ts b/src/modules/user/user.model.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/user/user.repository.ts b/src/modules/user/user.repository.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/user/user.schema.ts b/src/modules/user/user.schema.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/user/user.types.ts b/src/modules/user/user.types.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/userRole/controller/createUserRole.controller.ts b/src/modules/userRole/controller/createUserRole.controller.ts new file mode 100644 index 0000000..8451972 --- /dev/null +++ b/src/modules/userRole/controller/createUserRole.controller.ts @@ -0,0 +1,5 @@ +import { Context } from "elysia"; + +export const createUserRole = (ctx: Context) => { + return "OKOK"; +}; diff --git a/src/modules/userRole/index.ts b/src/modules/userRole/index.ts new file mode 100644 index 0000000..7cc3387 --- /dev/null +++ b/src/modules/userRole/index.ts @@ -0,0 +1,6 @@ +import Elysia from "elysia"; +import { createUserRole } from "./controller/createUserRole.controller"; + +export const userRoleModule = new Elysia({ prefix: "/user-role" }) + .get("/", () => "Hello User Role Module") + .post("/create", createUserRole); diff --git a/src/modules/userRole/services/createUserRole.service.ts b/src/modules/userRole/services/createUserRole.service.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/userRole/userRole.model.ts b/src/modules/userRole/userRole.model.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/userRole/userRole.repository.ts b/src/modules/userRole/userRole.repository.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/userRole/userRole.schema.ts b/src/modules/userRole/userRole.schema.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/userRole/userRole.types.ts b/src/modules/userRole/userRole.types.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/routes.ts b/src/routes.ts new file mode 100644 index 0000000..0b3fcc1 --- /dev/null +++ b/src/routes.ts @@ -0,0 +1,4 @@ +import Elysia from "elysia"; +import { userRoleModule } from "./modules/userRole"; + +export const routes = new Elysia().use(userRoleModule);