diff --git a/.gitignore b/.gitignore index a354957..d5a8492 100644 --- a/.gitignore +++ b/.gitignore @@ -27,4 +27,5 @@ package-lock.json tsconfig.tsbuildinfo config/ dist -.dist \ No newline at end of file +.dist +installer diff --git a/drizzle.config.ts b/drizzle.config.ts index 8cf04a6..4336cb6 100644 --- a/drizzle.config.ts +++ b/drizzle.config.ts @@ -1,4 +1,4 @@ -import { APP_PATH } from "@server/consts"; +import { APP_PATH } from "@server/lib/consts"; import { defineConfig } from "drizzle-kit"; import path from "path"; diff --git a/install/.gitignore b/install/.gitignore deleted file mode 100644 index 86789cb..0000000 --- a/install/.gitignore +++ /dev/null @@ -1 +0,0 @@ -installer \ No newline at end of file diff --git a/server/apiServer.ts b/server/apiServer.ts index 2e568f2..9a1a98d 100644 --- a/server/apiServer.ts +++ b/server/apiServer.ts @@ -1,7 +1,7 @@ import express from "express"; import cors from "cors"; import cookieParser from "cookie-parser"; -import config from "@server/config"; +import config from "@server/lib/config"; import logger from "@server/logger"; import { errorHandlerMiddleware, diff --git a/server/auth/index.ts b/server/auth/index.ts index 56e3fc2..4bf2c40 100644 --- a/server/auth/index.ts +++ b/server/auth/index.ts @@ -1,6 +1,3 @@ -export * from "./verifySession"; -export * from "./unauthorizedResponse"; - import { encodeBase32LowerCaseNoPadding, encodeHexLowerCase, @@ -9,7 +6,7 @@ import { sha256 } from "@oslojs/crypto/sha2"; import { Session, sessions, User, users } from "@server/db/schema"; import db from "@server/db"; import { eq } from "drizzle-orm"; -import config from "@server/config"; +import config from "@server/lib/config"; import type { RandomReader } from "@oslojs/crypto/random"; import { generateRandomString } from "@oslojs/crypto/random"; diff --git a/server/auth/resourceOtp.ts b/server/auth/resourceOtp.ts index 420602f..8c23e50 100644 --- a/server/auth/resourceOtp.ts +++ b/server/auth/resourceOtp.ts @@ -5,7 +5,7 @@ import { createDate, isWithinExpirationDate, TimeSpan } from "oslo"; import { alphabet, generateRandomString, sha256 } from "oslo/crypto"; import { sendEmail } from "@server/emails"; import ResourceOTPCode from "@server/emails/templates/ResourceOTPCode"; -import config from "@server/config"; +import config from "@server/lib/config"; import { verifyPassword } from "./password"; import { hashPassword } from "./password"; diff --git a/server/auth/sendEmailVerificationCode.ts b/server/auth/sendEmailVerificationCode.ts index 52d56f8..57523a5 100644 --- a/server/auth/sendEmailVerificationCode.ts +++ b/server/auth/sendEmailVerificationCode.ts @@ -4,7 +4,7 @@ import db from "@server/db"; import { users, emailVerificationCodes } from "@server/db/schema"; import { eq } from "drizzle-orm"; import { sendEmail } from "@server/emails"; -import config from "@server/config"; +import config from "@server/lib/config"; import { VerifyEmail } from "@server/emails/templates/VerifyEmailCode"; export async function sendEmailVerificationCode( diff --git a/server/auth/sessions/app.ts b/server/auth/sessions/app.ts new file mode 100644 index 0000000..4bf2c40 --- /dev/null +++ b/server/auth/sessions/app.ts @@ -0,0 +1,118 @@ +import { + encodeBase32LowerCaseNoPadding, + encodeHexLowerCase, +} from "@oslojs/encoding"; +import { sha256 } from "@oslojs/crypto/sha2"; +import { Session, sessions, User, users } from "@server/db/schema"; +import db from "@server/db"; +import { eq } from "drizzle-orm"; +import config from "@server/lib/config"; +import type { RandomReader } from "@oslojs/crypto/random"; +import { generateRandomString } from "@oslojs/crypto/random"; + +export const SESSION_COOKIE_NAME = config.getRawConfig().server.session_cookie_name; +export const SESSION_COOKIE_EXPIRES = 1000 * 60 * 60 * 24 * 30; +export const SECURE_COOKIES = config.getRawConfig().server.secure_cookies; +export const COOKIE_DOMAIN = "." + config.getBaseDomain(); + +export function generateSessionToken(): string { + const bytes = new Uint8Array(20); + crypto.getRandomValues(bytes); + const token = encodeBase32LowerCaseNoPadding(bytes); + return token; +} + +export async function createSession( + token: string, + userId: string, +): Promise { + const sessionId = encodeHexLowerCase( + sha256(new TextEncoder().encode(token)), + ); + const session: Session = { + sessionId: sessionId, + userId, + expiresAt: new Date(Date.now() + SESSION_COOKIE_EXPIRES).getTime(), + }; + await db.insert(sessions).values(session); + return session; +} + +export async function validateSessionToken( + token: string, +): Promise { + const sessionId = encodeHexLowerCase( + sha256(new TextEncoder().encode(token)), + ); + const result = await db + .select({ user: users, session: sessions }) + .from(sessions) + .innerJoin(users, eq(sessions.userId, users.userId)) + .where(eq(sessions.sessionId, sessionId)); + if (result.length < 1) { + return { session: null, user: null }; + } + const { user, session } = result[0]; + if (Date.now() >= session.expiresAt) { + await db + .delete(sessions) + .where(eq(sessions.sessionId, session.sessionId)); + return { session: null, user: null }; + } + if (Date.now() >= session.expiresAt - SESSION_COOKIE_EXPIRES / 2) { + session.expiresAt = new Date( + Date.now() + SESSION_COOKIE_EXPIRES, + ).getTime(); + await db + .update(sessions) + .set({ + expiresAt: session.expiresAt, + }) + .where(eq(sessions.sessionId, session.sessionId)); + } + return { session, user }; +} + +export async function invalidateSession(sessionId: string): Promise { + await db.delete(sessions).where(eq(sessions.sessionId, sessionId)); +} + +export async function invalidateAllSessions(userId: string): Promise { + await db.delete(sessions).where(eq(sessions.userId, userId)); +} + +export function serializeSessionCookie(token: string): string { + if (SECURE_COOKIES) { + return `${SESSION_COOKIE_NAME}=${token}; HttpOnly; SameSite=Strict; Max-Age=${SESSION_COOKIE_EXPIRES}; Path=/; Secure; Domain=${COOKIE_DOMAIN}`; + } else { + return `${SESSION_COOKIE_NAME}=${token}; HttpOnly; SameSite=Strict; Max-Age=${SESSION_COOKIE_EXPIRES}; Path=/; Domain=${COOKIE_DOMAIN}`; + } +} + +export function createBlankSessionTokenCookie(): string { + if (SECURE_COOKIES) { + return `${SESSION_COOKIE_NAME}=; HttpOnly; SameSite=Strict; Max-Age=0; Path=/; Secure; Domain=${COOKIE_DOMAIN}`; + } else { + return `${SESSION_COOKIE_NAME}=; HttpOnly; SameSite=Strict; Max-Age=0; Path=/; Domain=${COOKIE_DOMAIN}`; + } +} + +const random: RandomReader = { + read(bytes: Uint8Array): void { + crypto.getRandomValues(bytes); + }, +}; + +export function generateId(length: number): string { + const alphabet = "abcdefghijklmnopqrstuvwxyz0123456789"; + return generateRandomString(random, alphabet, length); +} + +export function generateIdFromEntropySize(size: number): string { + const buffer = crypto.getRandomValues(new Uint8Array(size)); + return encodeBase32LowerCaseNoPadding(buffer); +} + +export type SessionValidationResult = + | { session: Session; user: User } + | { session: null; user: null }; diff --git a/server/auth/newt.ts b/server/auth/sessions/newt.ts similarity index 79% rename from server/auth/newt.ts rename to server/auth/sessions/newt.ts index f9aefe3..7f45ce6 100644 --- a/server/auth/newt.ts +++ b/server/auth/sessions/newt.ts @@ -1,6 +1,3 @@ -export * from "./verifySession"; -export * from "./unauthorizedResponse"; - import { encodeHexLowerCase, } from "@oslojs/encoding"; @@ -8,12 +5,8 @@ import { sha256 } from "@oslojs/crypto/sha2"; import { Newt, newts, newtSessions, NewtSession } from "@server/db/schema"; import db from "@server/db"; import { eq } from "drizzle-orm"; -import config from "@server/config"; -export const SESSION_COOKIE_NAME = "session"; -export const SESSION_COOKIE_EXPIRES = 1000 * 60 * 60 * 24 * 30; -export const SECURE_COOKIES = config.getRawConfig().server.secure_cookies; -export const COOKIE_DOMAIN = "." + config.getBaseDomain(); +export const EXPIRES = 1000 * 60 * 60 * 24 * 30; export async function createNewtSession( token: string, @@ -25,7 +18,7 @@ export async function createNewtSession( const session: NewtSession = { sessionId: sessionId, newtId, - expiresAt: new Date(Date.now() + SESSION_COOKIE_EXPIRES).getTime(), + expiresAt: new Date(Date.now() + EXPIRES).getTime(), }; await db.insert(newtSessions).values(session); return session; @@ -52,9 +45,9 @@ export async function validateNewtSessionToken( .where(eq(newtSessions.sessionId, session.sessionId)); return { session: null, newt: null }; } - if (Date.now() >= session.expiresAt - (SESSION_COOKIE_EXPIRES / 2)) { + if (Date.now() >= session.expiresAt - (EXPIRES / 2)) { session.expiresAt = new Date( - Date.now() + SESSION_COOKIE_EXPIRES, + Date.now() + EXPIRES, ).getTime(); await db .update(newtSessions) diff --git a/server/auth/resource.ts b/server/auth/sessions/resource.ts similarity index 90% rename from server/auth/resource.ts rename to server/auth/sessions/resource.ts index e325080..e9b3241 100644 --- a/server/auth/resource.ts +++ b/server/auth/sessions/resource.ts @@ -1,15 +1,12 @@ import { encodeHexLowerCase } from "@oslojs/encoding"; import { sha256 } from "@oslojs/crypto/sha2"; -import { - resourceSessions, - ResourceSession, - resources -} from "@server/db/schema"; +import { resourceSessions, ResourceSession } from "@server/db/schema"; import db from "@server/db"; import { eq, and } from "drizzle-orm"; -import config from "@server/config"; +import config from "@server/lib/config"; -export const SESSION_COOKIE_NAME = "resource_session"; +export const SESSION_COOKIE_NAME = + config.getRawConfig().server.resource_session_cookie_name; export const SESSION_COOKIE_EXPIRES = 1000 * 60 * 60 * 24 * 30; export const SECURE_COOKIES = config.getRawConfig().server.secure_cookies; export const COOKIE_DOMAIN = "." + config.getBaseDomain(); @@ -88,18 +85,20 @@ export async function validateResourceSessionToken( return { resourceSession: null }; } else if ( Date.now() >= - resourceSession.expiresAt - resourceSession.sessionLength / 2 + resourceSession.expiresAt - resourceSession.sessionLength / 2 ) { if (!resourceSession.doNotExtend) { resourceSession.expiresAt = new Date( Date.now() + resourceSession.sessionLength ).getTime(); await db - .update(resourceSessions) - .set({ - expiresAt: resourceSession.expiresAt - }) - .where(eq(resourceSessions.sessionId, resourceSession.sessionId)); + .update(resourceSessions) + .set({ + expiresAt: resourceSession.expiresAt + }) + .where( + eq(resourceSessions.sessionId, resourceSession.sessionId) + ); } } diff --git a/server/auth/verifySession.ts b/server/auth/sessions/verifySession.ts similarity index 92% rename from server/auth/verifySession.ts rename to server/auth/sessions/verifySession.ts index fc9aecf..ca8f18f 100644 --- a/server/auth/verifySession.ts +++ b/server/auth/sessions/verifySession.ts @@ -1,5 +1,5 @@ import { Request } from "express"; -import { validateSessionToken, SESSION_COOKIE_NAME } from "@server/auth"; +import { validateSessionToken, SESSION_COOKIE_NAME } from "@server/auth/sessions/app"; export async function verifySession(req: Request) { const res = await validateSessionToken( diff --git a/server/auth/2fa.ts b/server/auth/totp.ts similarity index 100% rename from server/auth/2fa.ts rename to server/auth/totp.ts diff --git a/server/db/index.ts b/server/db/index.ts index 586934c..12b6ed1 100644 --- a/server/db/index.ts +++ b/server/db/index.ts @@ -3,7 +3,7 @@ import Database from "better-sqlite3"; import * as schema from "@server/db/schema"; import path from "path"; import fs from "fs/promises"; -import { APP_PATH } from "@server/consts"; +import { APP_PATH } from "@server/lib/consts"; export const location = path.join(APP_PATH, "db", "db.sqlite"); export const exists = await checkFileExists(location); diff --git a/server/db/names.ts b/server/db/names.ts index d7d2d47..a0b37ef 100644 --- a/server/db/names.ts +++ b/server/db/names.ts @@ -3,15 +3,15 @@ import { readFileSync } from "fs"; import { db } from "@server/db"; import { exitNodes, sites } from "./schema"; import { eq, and } from "drizzle-orm"; -import { __DIRNAME } from "@server/consts"; +import { __DIRNAME } from "@server/lib/consts"; // Load the names from the names.json file const dev = process.env.ENVIRONMENT !== "prod"; let file; if (!dev) { - file = join(__DIRNAME, "names.json"); + file = join("names.json"); } else { - file = join(__DIRNAME, "/db/names.json"); + file = join("server/db/names.json"); } export const names = JSON.parse(readFileSync(file, "utf-8")); diff --git a/server/emails/index.ts b/server/emails/index.ts index 13b37c6..10ee493 100644 --- a/server/emails/index.ts +++ b/server/emails/index.ts @@ -1,7 +1,7 @@ export * from "@server/emails/sendEmail"; import nodemailer from "nodemailer"; -import config from "@server/config"; +import config from "@server/lib/config"; import logger from "@server/logger"; function createEmailClient() { diff --git a/server/internalServer.ts b/server/internalServer.ts index c1bd6e1..92da137 100644 --- a/server/internalServer.ts +++ b/server/internalServer.ts @@ -2,7 +2,7 @@ import express from "express"; import helmet from "helmet"; import cors from "cors"; import cookieParser from "cookie-parser"; -import config from "@server/config"; +import config from "@server/lib/config"; import logger from "@server/logger"; import { errorHandlerMiddleware, diff --git a/server/middlewares/helpers/canUserAccessResource.ts b/server/lib/canUserAccessResource.ts similarity index 100% rename from server/middlewares/helpers/canUserAccessResource.ts rename to server/lib/canUserAccessResource.ts diff --git a/server/config.ts b/server/lib/config.ts similarity index 98% rename from server/config.ts rename to server/lib/config.ts index 435c57c..a282cca 100644 --- a/server/config.ts +++ b/server/lib/config.ts @@ -3,8 +3,8 @@ import yaml from "js-yaml"; import path from "path"; import { z } from "zod"; import { fromError } from "zod-validation-error"; -import { __DIRNAME, APP_PATH } from "@server/consts"; -import { loadAppVersion } from "@server/utils/loadAppVersion"; +import { __DIRNAME, APP_PATH } from "@server/lib/consts"; +import { loadAppVersion } from "@server/lib/loadAppVersion"; const portSchema = z.number().positive().gt(0).lte(65535); diff --git a/server/consts.ts b/server/lib/consts.ts similarity index 100% rename from server/consts.ts rename to server/lib/consts.ts diff --git a/server/utils/index.ts b/server/lib/index.ts similarity index 100% rename from server/utils/index.ts rename to server/lib/index.ts diff --git a/server/utils/ip.ts b/server/lib/ip.ts similarity index 100% rename from server/utils/ip.ts rename to server/lib/ip.ts diff --git a/server/utils/loadAppVersion.ts b/server/lib/loadAppVersion.ts similarity index 77% rename from server/utils/loadAppVersion.ts rename to server/lib/loadAppVersion.ts index 425eae6..80d9f55 100644 --- a/server/utils/loadAppVersion.ts +++ b/server/lib/loadAppVersion.ts @@ -1,9 +1,9 @@ import path from "path"; -import { __DIRNAME } from "@server/consts"; +import { __DIRNAME } from "@server/lib/consts"; import fs from "fs"; export function loadAppVersion() { - const packageJsonPath = path.join(__DIRNAME, "..", "package.json"); + const packageJsonPath = path.join("package.json"); let packageJson: any; if (fs.existsSync && fs.existsSync(packageJsonPath)) { const packageJsonContent = fs.readFileSync(packageJsonPath, "utf8"); diff --git a/server/utils/response.ts b/server/lib/response.ts similarity index 100% rename from server/utils/response.ts rename to server/lib/response.ts diff --git a/server/utils/stoi.ts b/server/lib/stoi.ts similarity index 100% rename from server/utils/stoi.ts rename to server/lib/stoi.ts diff --git a/server/logger.ts b/server/logger.ts index 9895f41..cd12d73 100644 --- a/server/logger.ts +++ b/server/logger.ts @@ -1,8 +1,8 @@ import "winston-daily-rotate-file"; -import config from "@server/config"; +import config from "@server/lib/config"; import * as winston from "winston"; import path from "path"; -import { APP_PATH } from "./consts"; +import { APP_PATH } from "./lib/consts"; const hformat = winston.format.printf( ({ level, label, message, timestamp, stack, ...metadata }) => { diff --git a/server/middlewares/formatError.ts b/server/middlewares/formatError.ts index c0a0be9..e96ff29 100644 --- a/server/middlewares/formatError.ts +++ b/server/middlewares/formatError.ts @@ -2,7 +2,7 @@ import { ErrorRequestHandler, NextFunction, Response } from "express"; import ErrorResponse from "@server/types/ErrorResponse"; import HttpCode from "@server/types/HttpCode"; import logger from "@server/logger"; -import config from "@server/config"; +import config from "@server/lib/config"; export const errorHandlerMiddleware: ErrorRequestHandler = ( error, diff --git a/server/middlewares/verifyAccessTokenAccess.ts b/server/middlewares/verifyAccessTokenAccess.ts index 159bd66..2854c46 100644 --- a/server/middlewares/verifyAccessTokenAccess.ts +++ b/server/middlewares/verifyAccessTokenAccess.ts @@ -4,7 +4,7 @@ import { resourceAccessToken, resources, userOrgs } from "@server/db/schema"; import { and, eq } from "drizzle-orm"; import createHttpError from "http-errors"; import HttpCode from "@server/types/HttpCode"; -import { canUserAccessResource } from "./helpers/canUserAccessResource"; +import { canUserAccessResource } from "@server/lib/canUserAccessResource"; export async function verifyAccessTokenAccess( req: Request, diff --git a/server/middlewares/verifySession.ts b/server/middlewares/verifySession.ts index 584529c..a74c793 100644 --- a/server/middlewares/verifySession.ts +++ b/server/middlewares/verifySession.ts @@ -1,16 +1,17 @@ import { NextFunction, Response } from "express"; import ErrorResponse from "@server/types/ErrorResponse"; -import { unauthorized, verifySession } from "@server/auth"; import { db } from "@server/db"; import { users } from "@server/db/schema"; import { eq } from "drizzle-orm"; import createHttpError from "http-errors"; import HttpCode from "@server/types/HttpCode"; +import { verifySession } from "@server/auth/sessions/verifySession"; +import { unauthorized } from "@server/auth/unauthorizedResponse"; export const verifySessionMiddleware = async ( req: any, res: Response, - next: NextFunction, + next: NextFunction ) => { const { session, user } = await verifySession(req); if (!session || !user) { @@ -24,7 +25,7 @@ export const verifySessionMiddleware = async ( if (!existingUser || !existingUser[0]) { return next( - createHttpError(HttpCode.BAD_REQUEST, "User does not exist"), + createHttpError(HttpCode.BAD_REQUEST, "User does not exist") ); } diff --git a/server/middlewares/verifyTargetAccess.ts b/server/middlewares/verifyTargetAccess.ts index a5c19ba..003e5e8 100644 --- a/server/middlewares/verifyTargetAccess.ts +++ b/server/middlewares/verifyTargetAccess.ts @@ -4,7 +4,7 @@ import { resources, targets, userOrgs } from "@server/db/schema"; import { and, eq } from "drizzle-orm"; import createHttpError from "http-errors"; import HttpCode from "@server/types/HttpCode"; -import { canUserAccessResource } from "./helpers/canUserAccessResource"; +import { canUserAccessResource } from "../lib/canUserAccessResource"; export async function verifyTargetAccess( req: Request, diff --git a/server/middlewares/verifyUser.ts b/server/middlewares/verifyUser.ts index 551c0c9..0f52f2e 100644 --- a/server/middlewares/verifyUser.ts +++ b/server/middlewares/verifyUser.ts @@ -1,12 +1,13 @@ import { NextFunction, Response } from "express"; import ErrorResponse from "@server/types/ErrorResponse"; -import { unauthorized, verifySession } from "@server/auth"; import { db } from "@server/db"; import { users } from "@server/db/schema"; import { eq } from "drizzle-orm"; import createHttpError from "http-errors"; import HttpCode from "@server/types/HttpCode"; -import config from "@server/config"; +import config from "@server/lib/config"; +import { verifySession } from "@server/auth/sessions/verifySession"; +import { unauthorized } from "@server/auth/unauthorizedResponse"; export const verifySessionUserMiddleware = async ( req: any, diff --git a/server/names.json b/server/names.json deleted file mode 100644 index fdf545f..0000000 --- a/server/names.json +++ /dev/null @@ -1,1711 +0,0 @@ -{ - "descriptors": [ - "abandoned", - "able", - "absolute", - "adorable", - "adventurous", - "academic", - "acceptable", - "acclaimed", - "accomplished", - "accurate", - "aching", - "acidic", - "acrobatic", - "active", - "actual", - "adept", - "admirable", - "admired", - "adolescent", - "adorable", - "adored", - "advanced", - "afraid", - "affectionate", - "aged", - "aggravating", - "aggressive", - "agile", - "agitated", - "agonizing", - "agreeable", - "ajar", - "alarmed", - "alarming", - "alert", - "alienated", - "alive", - "all", - "altruistic", - "amazing", - "ambitious", - "ample", - "amused", - "amusing", - "anchored", - "ancient", - "angelic", - "angry", - "anguished", - "animated", - "annual", - "another", - "antique", - "anxious", - "any", - "apprehensive", - "appropriate", - "apt", - "arctic", - "arid", - "aromatic", - "artistic", - "ashamed", - "assured", - "astonishing", - "athletic", - "attached", - "attentive", - "attractive", - "austere", - "authentic", - "authorized", - "automatic", - "avaricious", - "average", - "aware", - "awesome", - "awful", - "awkward", - "babyish", - "bad", - "back", - "baggy", - "bare", - "barren", - "basic", - "beautiful", - "belated", - "beloved", - "beneficial", - "better", - "best", - "bewitched", - "big", - "big-hearted", - "biodegradable", - "bite-sized", - "bitter", - "black", - "black-and-white", - "bland", - "blank", - "blaring", - "bleak", - "blind", - "blissful", - "blond", - "blue", - "blushing", - "bogus", - "boiling", - "bold", - "bony", - "boring", - "bossy", - "both", - "bouncy", - "bountiful", - "bowed", - "brave", - "breakable", - "brief", - "bright", - "brilliant", - "brisk", - "broken", - "bronze", - "brown", - "bruised", - "bubbly", - "bulky", - "bumpy", - "buoyant", - "burdensome", - "burly", - "bustling", - "busy", - "buttery", - "buzzing", - "calculating", - "calm", - "candid", - "canine", - "capital", - "carefree", - "careful", - "careless", - "caring", - "cautious", - "cavernous", - "celebrated", - "charming", - "cheap", - "cheerful", - "cheery", - "chief", - "chilly", - "chubby", - "circular", - "classic", - "clean", - "clear", - "clear-cut", - "clever", - "close", - "closed", - "cloudy", - "clueless", - "clumsy", - "cluttered", - "coarse", - "cold", - "colorful", - "colorless", - "colossal", - "comfortable", - "common", - "compassionate", - "competent", - "complete", - "complex", - "complicated", - "composed", - "concerned", - "concrete", - "confused", - "conscious", - "considerate", - "constant", - "content", - "conventional", - "cooked", - "cool", - "cooperative", - "coordinated", - "corny", - "corrupt", - "costly", - "courageous", - "courteous", - "crafty", - "crazy", - "creamy", - "creative", - "creepy", - "criminal", - "crisp", - "critical", - "crooked", - "crowded", - "cruel", - "crushing", - "cuddly", - "cultivated", - "cultured", - "cumbersome", - "curly", - "curvy", - "cute", - "cylindrical", - "damaged", - "damp", - "dangerous", - "dapper", - "daring", - "darling", - "dark", - "dazzling", - "dead", - "deadly", - "deafening", - "dear", - "dearest", - "decent", - "decimal", - "decisive", - "deep", - "defenseless", - "defensive", - "defiant", - "deficient", - "definite", - "definitive", - "delayed", - "delectable", - "delicious", - "delightful", - "delirious", - "demanding", - "dense", - "dental", - "dependable", - "dependent", - "descriptive", - "deserted", - "detailed", - "determined", - "devoted", - "different", - "difficult", - "digital", - "diligent", - "dim", - "dimpled", - "dimwitted", - "direct", - "disastrous", - "discrete", - "disfigured", - "disgusting", - "disloyal", - "dismal", - "distant", - "downright", - "dreary", - "dirty", - "disguised", - "dishonest", - "dismal", - "distant", - "distinct", - "distorted", - "dizzy", - "dopey", - "doting", - "double", - "downright", - "drab", - "drafty", - "dramatic", - "dreary", - "droopy", - "dry", - "dual", - "dull", - "dutiful", - "each", - "eager", - "earnest", - "early", - "easy", - "easy-going", - "ecstatic", - "edible", - "educated", - "elaborate", - "elastic", - "elated", - "elderly", - "electric", - "elegant", - "elementary", - "elliptical", - "embarrassed", - "embellished", - "eminent", - "emotional", - "empty", - "enchanted", - "enchanting", - "energetic", - "enlightened", - "enormous", - "enraged", - "entire", - "envious", - "equal", - "equatorial", - "essential", - "esteemed", - "ethical", - "euphoric", - "even", - "evergreen", - "everlasting", - "every", - "evil", - "exalted", - "excellent", - "exemplary", - "exhausted", - "excitable", - "excited", - "exciting", - "exotic", - "expensive", - "experienced", - "expert", - "extraneous", - "extroverted", - "extra-large", - "extra-small", - "fabulous", - "failing", - "faint", - "fair", - "faithful", - "fake", - "false", - "familiar", - "famous", - "fancy", - "fantastic", - "far", - "faraway", - "far-flung", - "far-off", - "fast", - "fat", - "fatal", - "fatherly", - "favorable", - "favorite", - "fearful", - "fearless", - "feisty", - "feline", - "female", - "feminine", - "few", - "fickle", - "filthy", - "fine", - "finished", - "firm", - "first", - "firsthand", - "fitting", - "fixed", - "flaky", - "flamboyant", - "flashy", - "flat", - "flawed", - "flawless", - "flickering", - "flimsy", - "flippant", - "flowery", - "fluffy", - "fluid", - "flustered", - "focused", - "fond", - "foolhardy", - "foolish", - "forceful", - "forked", - "formal", - "forsaken", - "forthright", - "fortunate", - "fragrant", - "frail", - "frank", - "frayed", - "free", - "French", - "fresh", - "frequent", - "friendly", - "frightened", - "frightening", - "frigid", - "frilly", - "frizzy", - "frivolous", - "front", - "frosty", - "frozen", - "frugal", - "fruitful", - "full", - "fumbling", - "functional", - "funny", - "fussy", - "fuzzy", - "gargantuan", - "gaseous", - "general", - "generous", - "gentle", - "genuine", - "giant", - "giddy", - "gigantic", - "gifted", - "giving", - "glamorous", - "glaring", - "glass", - "gleaming", - "gleeful", - "glistening", - "glittering", - "gloomy", - "glorious", - "glossy", - "glum", - "golden", - "good", - "good-natured", - "gorgeous", - "graceful", - "gracious", - "grand", - "grandiose", - "granular", - "grateful", - "grave", - "gray", - "great", - "greedy", - "green", - "gregarious", - "grim", - "grimy", - "gripping", - "grizzled", - "gross", - "grotesque", - "grouchy", - "grounded", - "growing", - "growling", - "grown", - "grubby", - "gruesome", - "grumpy", - "guilty", - "gullible", - "gummy", - "hairy", - "half", - "handmade", - "handsome", - "handy", - "happy", - "happy-go-lucky", - "hard", - "hard-to-find", - "harmful", - "harmless", - "harmonious", - "harsh", - "hasty", - "hateful", - "haunting", - "healthy", - "heartfelt", - "hearty", - "heavenly", - "heavy", - "hefty", - "helpful", - "helpless", - "hidden", - "hideous", - "high", - "high-level", - "hilarious", - "hoarse", - "hollow", - "homely", - "honest", - "honorable", - "honored", - "hopeful", - "horrible", - "hospitable", - "hot", - "huge", - "humble", - "humiliating", - "humming", - "humongous", - "hungry", - "hurtful", - "husky", - "icky", - "icy", - "ideal", - "idealistic", - "identical", - "idle", - "idiotic", - "idolized", - "ignorant", - "ill", - "illegal", - "ill-fated", - "ill-informed", - "illiterate", - "illustrious", - "imaginary", - "imaginative", - "immaculate", - "immaterial", - "immediate", - "immense", - "impassioned", - "impeccable", - "impartial", - "imperfect", - "imperturbable", - "impish", - "impolite", - "important", - "impossible", - "impractical", - "impressionable", - "impressive", - "improbable", - "impure", - "inborn", - "incomparable", - "incompatible", - "incomplete", - "inconsequential", - "incredible", - "indelible", - "inexperienced", - "indolent", - "infamous", - "infantile", - "infatuated", - "inferior", - "infinite", - "informal", - "innocent", - "insecure", - "insidious", - "insignificant", - "insistent", - "instructive", - "insubstantial", - "intelligent", - "intent", - "intentional", - "interesting", - "internal", - "international", - "intrepid", - "ironclad", - "irresponsible", - "irritating", - "itchy", - "jaded", - "jagged", - "jam-packed", - "jaunty", - "jealous", - "jittery", - "joint", - "jolly", - "jovial", - "joyful", - "joyous", - "jubilant", - "judicious", - "juicy", - "jumbo", - "junior", - "jumpy", - "juvenile", - "kaleidoscopic", - "keen", - "key", - "kind", - "kindhearted", - "kindly", - "klutzy", - "knobby", - "knotty", - "knowledgeable", - "knowing", - "known", - "kooky", - "kosher", - "lame", - "lanky", - "large", - "last", - "lasting", - "late", - "lavish", - "lawful", - "lazy", - "leading", - "lean", - "leafy", - "left", - "legal", - "legitimate", - "light", - "lighthearted", - "likable", - "likely", - "limited", - "limp", - "limping", - "linear", - "lined", - "liquid", - "little", - "live", - "lively", - "livid", - "loathsome", - "lone", - "lonely", - "long", - "long-term", - "loose", - "lopsided", - "lost", - "loud", - "lovable", - "lovely", - "loving", - "low", - "loyal", - "lucky", - "lumbering", - "luminous", - "lumpy", - "lustrous", - "luxurious", - "mad", - "made-up", - "magnificent", - "majestic", - "major", - "male", - "mammoth", - "married", - "marvelous", - "masculine", - "massive", - "mature", - "meager", - "mealy", - "mean", - "measly", - "meaty", - "medical", - "mediocre", - "medium", - "meek", - "mellow", - "melodic", - "memorable", - "menacing", - "merry", - "messy", - "metallic", - "mild", - "milky", - "mindless", - "miniature", - "minor", - "minty", - "miserable", - "miserly", - "misguided", - "misty", - "mixed", - "modern", - "modest", - "moist", - "monstrous", - "monthly", - "monumental", - "moral", - "mortified", - "motherly", - "motionless", - "mountainous", - "muddy", - "muffled", - "multicolored", - "mundane", - "murky", - "mushy", - "musty", - "muted", - "mysterious", - "naive", - "narrow", - "nasty", - "natural", - "naughty", - "nautical", - "near", - "neat", - "necessary", - "needy", - "negative", - "neglected", - "negligible", - "neighboring", - "nervous", - "new", - "next", - "nice", - "nifty", - "nimble", - "nippy", - "nocturnal", - "noisy", - "nonstop", - "normal", - "notable", - "noted", - "noteworthy", - "novel", - "noxious", - "numb", - "nutritious", - "nutty", - "obedient", - "obese", - "oblong", - "oily", - "oblong", - "obvious", - "occasional", - "odd", - "oddball", - "offbeat", - "offensive", - "official", - "old", - "old-fashioned", - "only", - "open", - "optimal", - "optimistic", - "opulent", - "orange", - "orderly", - "organic", - "ornate", - "ornery", - "ordinary", - "original", - "other", - "our", - "outlying", - "outgoing", - "outlandish", - "outrageous", - "outstanding", - "oval", - "overcooked", - "overdue", - "overjoyed", - "overlooked", - "palatable", - "pale", - "paltry", - "parallel", - "parched", - "partial", - "passionate", - "past", - "pastel", - "peaceful", - "peppery", - "perfect", - "perfumed", - "periodic", - "perky", - "personal", - "pertinent", - "pesky", - "pessimistic", - "petty", - "phony", - "physical", - "piercing", - "pink", - "pitiful", - "plain", - "plaintive", - "plastic", - "playful", - "pleasant", - "pleased", - "pleasing", - "plump", - "plush", - "polished", - "polite", - "political", - "pointed", - "pointless", - "poised", - "poor", - "popular", - "portly", - "posh", - "positive", - "possible", - "potable", - "powerful", - "powerless", - "practical", - "precious", - "present", - "prestigious", - "pretty", - "precious", - "previous", - "pricey", - "prickly", - "primary", - "prime", - "pristine", - "private", - "prize", - "probable", - "productive", - "profitable", - "profuse", - "proper", - "proud", - "prudent", - "punctual", - "pungent", - "puny", - "pure", - "purple", - "pushy", - "putrid", - "puzzled", - "puzzling", - "quaint", - "qualified", - "quarrelsome", - "quarterly", - "queasy", - "querulous", - "questionable", - "quick", - "quick-witted", - "quiet", - "quintessential", - "quirky", - "quixotic", - "quizzical", - "radiant", - "ragged", - "rapid", - "rare", - "rash", - "raw", - "recent", - "reckless", - "rectangular", - "ready", - "real", - "realistic", - "reasonable", - "red", - "reflecting", - "regal", - "regular", - "reliable", - "relieved", - "remarkable", - "remorseful", - "remote", - "repentant", - "required", - "respectful", - "responsible", - "repulsive", - "revolving", - "rewarding", - "rich", - "rigid", - "right", - "ringed", - "ripe", - "roasted", - "robust", - "rosy", - "rotating", - "rotten", - "rough", - "round", - "rowdy", - "royal", - "rubbery", - "rundown", - "ruddy", - "rude", - "runny", - "rural", - "rusty", - "sad", - "safe", - "salty", - "same", - "sandy", - "sane", - "sarcastic", - "sardonic", - "satisfied", - "scaly", - "scarce", - "scared", - "scary", - "scented", - "scholarly", - "scientific", - "scornful", - "scratchy", - "scrawny", - "second", - "secondary", - "second-hand", - "secret", - "self-assured", - "self-reliant", - "selfish", - "sentimental", - "separate", - "serene", - "serious", - "serpentine", - "several", - "severe", - "shabby", - "shadowy", - "shady", - "shallow", - "shameful", - "shameless", - "sharp", - "shimmering", - "shiny", - "shocked", - "shocking", - "shoddy", - "short", - "short-term", - "showy", - "shrill", - "shy", - "sick", - "silent", - "silky", - "silly", - "silver", - "similar", - "simple", - "simplistic", - "sinful", - "single", - "sizzling", - "skeletal", - "skinny", - "sleepy", - "slight", - "slim", - "slimy", - "slippery", - "slow", - "slushy", - "small", - "smart", - "smoggy", - "smooth", - "smug", - "snappy", - "snarling", - "sneaky", - "sniveling", - "snoopy", - "sociable", - "soft", - "soggy", - "solid", - "somber", - "some", - "spherical", - "sophisticated", - "sore", - "sorrowful", - "soulful", - "soupy", - "sour", - "Spanish", - "sparkling", - "sparse", - "specific", - "spectacular", - "speedy", - "spicy", - "spiffy", - "spirited", - "spiteful", - "splendid", - "spotless", - "spotted", - "spry", - "square", - "squeaky", - "squiggly", - "stable", - "staid", - "stained", - "stale", - "standard", - "starchy", - "stark", - "starry", - "steep", - "sticky", - "stiff", - "stimulating", - "stingy", - "stormy", - "straight", - "strange", - "steel", - "strict", - "strident", - "striking", - "striped", - "strong", - "studious", - "stunning", - "stupendous", - "stupid", - "sturdy", - "stylish", - "subdued", - "submissive", - "substantial", - "subtle", - "suburban", - "sudden", - "sugary", - "sunny", - "super", - "superb", - "superficial", - "superior", - "supportive", - "sure-footed", - "surprised", - "suspicious", - "svelte", - "sweaty", - "sweet", - "sweltering", - "swift", - "sympathetic", - "tall", - "talkative", - "tame", - "tan", - "tangible", - "tart", - "tasty", - "tattered", - "taut", - "tedious", - "teeming", - "tempting", - "tender", - "tense", - "tepid", - "terrible", - "terrific", - "testy", - "thankful", - "that", - "these", - "thick", - "thin", - "third", - "thirsty", - "this", - "thorough", - "thorny", - "those", - "thoughtful", - "threadbare", - "thrifty", - "thunderous", - "tidy", - "tight", - "timely", - "tinted", - "tiny", - "tired", - "torn", - "total", - "tough", - "traumatic", - "treasured", - "tremendous", - "tragic", - "trained", - "tremendous", - "triangular", - "tricky", - "trifling", - "trim", - "trivial", - "troubled", - "true", - "trusting", - "trustworthy", - "trusty", - "truthful", - "tubby", - "turbulent", - "twin", - "ugly", - "ultimate", - "unacceptable", - "unaware", - "uncomfortable", - "uncommon", - "unconscious", - "understated", - "unequaled", - "uneven", - "unfinished", - "unfit", - "unfolded", - "unfortunate", - "unhappy", - "unhealthy", - "uniform", - "unimportant", - "unique", - "united", - "unkempt", - "unknown", - "unlawful", - "unlined", - "unlucky", - "unnatural", - "unpleasant", - "unrealistic", - "unripe", - "unruly", - "unselfish", - "unsightly", - "unsteady", - "unsung", - "untidy", - "untimely", - "untried", - "untrue", - "unused", - "unusual", - "unwelcome", - "unwieldy", - "unwilling", - "unwitting", - "unwritten", - "upbeat", - "upright", - "upset", - "urban", - "usable", - "used", - "useful", - "useless", - "utilized", - "utter", - "vacant", - "vague", - "vain", - "valid", - "valuable", - "vapid", - "variable", - "vast", - "velvety", - "venerated", - "vengeful", - "verifiable", - "vibrant", - "vicious", - "victorious", - "vigilant", - "vigorous", - "villainous", - "violet", - "violent", - "virtual", - "virtuous", - "visible", - "vital", - "vivacious", - "vivid", - "voluminous", - "wan", - "warlike", - "warm", - "warmhearted", - "warped", - "wary", - "wasteful", - "watchful", - "waterlogged", - "watery", - "wavy", - "wealthy", - "weak", - "weary", - "webbed", - "wee", - "weekly", - "weepy", - "weighty", - "weird", - "welcome", - "well-documented", - "well-groomed", - "well-informed", - "well-lit", - "well-made", - "well-off", - "well-to-do", - "well-worn", - "wet", - "which", - "whimsical", - "whirlwind", - "whispered", - "white", - "whole", - "whopping", - "wicked", - "wide", - "wide-eyed", - "wiggly", - "wild", - "willing", - "wilted", - "winding", - "windy", - "winged", - "wiry", - "wise", - "witty", - "wobbly", - "woeful", - "wonderful", - "wooden", - "woozy", - "wordy", - "worldly", - "worn", - "worried", - "worrisome", - "worse", - "worst", - "worthless", - "worthwhile", - "worthy", - "wrathful", - "wretched", - "writhing", - "wrong", - "wry", - "yawning", - "yearly", - "yellow", - "yellowish", - "young", - "youthful", - "yummy", - "zany", - "zealous", - "zesty", - "zigzag" - ], - "animals": [ - "Cape Fox", - "Short-Beaked Echidna", - "Platypus", - "Arctic Ground Squirrel", - "Black-Tailed Prairie Dog", - "Franklin's Ground Squirrel", - "Golden-Mantled Ground Squirrel", - "Groundhog", - "Yellow-Bellied Marmot", - "Eastern Mole", - "Pink Fairy Armadillo", - "Star-Nosed Mole", - "Smooth-Coated Otter", - "Degu", - "Meadow Vole", - "Campbell's Dwarf Hamster", - "Fat Sand Rat", - "Striped Ground Squirrel", - "Syrian Hamster", - "Common Wombat", - "Greater Bilby", - "Marsupial Mole", - "Numbat", - "Southern Hairy-Nosed Wombat", - "American Badger", - "Little Blue Penguin", - "Giant Armadillo", - "Eastern Long-Beaked Echidna", - "Screaming Hairy Armadillo", - "Chinese Hamster", - "Roborovski Hamster", - "Djungarian Hamster", - "Indian Desert Jird", - "Great Gerbil", - "Plains Rat", - "Big-Headed Mole-Rat", - "Cape Ground Squirrel", - "Colorado Chipmunk", - "Alpine Chipmunk", - "Cliff Chipmunk", - "Hoary Marmot", - "Himalayan Marmot", - "Olympic Marmot", - "San Joaquin Antelope Squirrel", - "Gunnison's Prairie Dog", - "California Ground Squirrel", - "White-Tailed Prairie Dog", - "Spotted Ground Squirrel", - "Uinta Ground Squirrel", - "Columbian Ground Squirrel", - "Richardson's Ground Squirrel", - "European Ground Squirrel", - "Speckled Ground Squirrel", - "Broad-Footed Mole", - "European Mole", - "Sunda Pangolin", - "Desert Rosy Boa", - "Desert Tortoise", - "Brahminy Blind Snake", - "Eastern Hognose Snake", - "Saharan Horned Viper", - "Gopher Snake", - "Scarlet Kingsnake", - "Eastern Pine Snake", - "Eastern Coral Snake", - "Naked Mole-Rat", - "Mud Snake", - "Barbados Threadsnake", - "Arabian Sand Boa", - "Japanese Badger", - "Rainbow Snake", - "Red-Eyed Crocodile Skink", - "Texas Coral Snake", - "Glossy Snake", - "Oriental Wolf Snake", - "Hog Badger", - "Mongolian Gerbil", - "Damaraland Mole-Rat", - "Steppe Polecat", - "Woma Python", - "Southern Hognose Snake", - "Asian Badger", - "Giant Girdled Lizard", - "Common Vole", - "Bank Vole", - "Chinese Ferret-Badger", - "Desert Grassland Whiptail Lizard", - "Rough Earth Snake", - "Thirteen-Lined Ground Squirrel", - "Southern Three-Banded Armadillo", - "Slowworm", - "Siberian Chipmunk", - "Round-Tailed Ground Squirrel", - "Pygmy Rabbit", - "Pied Kingfisher", - "Northern Short-Tailed Shrew ", - "Northern Pika", - "Nine-Banded Armadillo", - "Nile Monitor", - "Lowland Streaked Tenrec", - "Lowland Paca", - "Long-Nosed Bandicoot", - "Long-Eared Jerboa", - "Idaho Ground Squirrel", - "Ground Pangolin", - "Great Plains Rat Snake", - "Gopher Tortoise", - "Giant Pangolin", - "European Hedgehog", - "European Hamster", - "Common Box Turtle", - "Brown Rat", - "Bog Turtle", - "Bengal Fox", - "American Alligator", - "Aardvark", - "Olm", - "Tiger salamander", - "Chinese giant salamander", - "Spotted salamander", - "Blue-spotted salamander", - "Eastern worm snake", - "Deinagkistrodon", - "Northern crested newt", - "Barred tiger salamander", - "Rainbow bee-eater", - "Sunbeam Snake", - "Sandfish Skink", - "Mexican Mole Lizard", - "Tarbagan marmot", - "Black-Headed Python", - "Vancouver Island Marmot", - "Bothrochilus", - "Western Box Turtle", - "Long-toed salamander", - "Fat-Tailed Gerbil", - "Mexican Prairie Dog", - "Marbled salamander", - "Bandy-Bandy", - "Smooth Earth Snake", - "Boodie", - "Zebra-Tailed Lizard", - "White-headed langur", - "Javan Ferret-Badger", - "Southwestern Blackhead Snake", - "Malagasy Giant Rat", - "Big Hairy Armadillo", - "Camas pocket gopher", - "Woodland vole", - "Lesser Egyptian jerboa", - "Little Brown Skink", - "Plains pocket gopher", - "Alaska marmot", - "Gray marmot", - "Louisiana waterthrush", - "Ord's kangaroo rat", - "North American least shrew", - "Western rosella", - "Northwestern salamander", - "Acrochordus granulatus", - "Kowari", - "Anilius", - "Gastrophryne carolinensis", - "Yellow mud turtle", - "Plateau pika", - "Steppe lemming", - "American shrew mole", - "Calabar python", - "Dermophis mexicanus", - "Rufous rat-kangaroo", - "Hairy-tailed mole", - "Mexican burrowing toad", - "Seven-banded armadillo", - "Scaphiopus holbrookii", - "Asiatic brush-tailed porcupine", - "Bolson tortoise", - "Common midwife toad", - "Ambystoma talpoideum", - "Crucifix toad", - "Red Hills salamander", - "Uperodon taprobanicus", - "Plains spadefoot toad", - "Spea hammondii", - "Puerto Rican crested toad", - "Physalaemus nattereri", - "Yosemite toad", - "Frosted flatwoods salamander", - "Striped newt", - "Streamside salamander", - "Southern red-backed salamander", - "Spencer's burrowing frog", - "Ringed salamander", - "Kaloula baleata", - "Uperodon systoma", - "Ichthyophis beddomei", - "Uperodon globulosus", - "Herpele squalostoma", - "Ichthyophis mindanaoensis", - "Sandhill frog", - "Strecker's chorus frog", - "Uraeotyphlus oxyurus", - "Caecilia nigricans", - "Uraeotyphlus menoni", - "Savannah forest tree frog", - "Uraeotyphlus interruptus", - "Rose's rain frog", - "Dermophis parviceps", - "Leptopelis gramineus", - "Rhombophryne coudreaui", - "Elachistocleis pearsei", - "Hylodes heyeri", - "Carphophis vermis", - "Anniella pulchra", - "Lampropeltis calligaster rhombomaculata", - "Xerotyphlops vermicularis", - "Iberian worm lizard", - "Lytorhynchus diadema", - "Micrurus frontalis", - "Euprepiophis conspicillata", - "Amphisbaena fuliginosa", - "Greater earless lizard", - "Afrotyphlops schlegelii", - "Texas lined snake", - "Atractaspis branchi", - "Calamaria gervaisii", - "Brachyurophis fasciolatus", - "Brongersma's worm snake", - "Letheobia simonii", - "Grypotyphlops acutus", - "Acontias breviceps", - "Reticulate worm snake", - "Trinidad worm snake", - "Amphisbaena microcephala", - "Lerista labialis", - "Flathead worm snake", - "Mertens's worm lizard", - "Elegant worm snake", - "Iranian worm snake", - "Pernambuco worm snake", - "Crest-tailed mulgara", - "Southern long-nosed armadillo", - "Greater fairy armadillo", - "Steppe pika", - "Black-capped marmot", - "Armored rat", - "Giant mole-rat", - "Montane vole", - "Oldfield mouse", - "Southeastern pocket gopher", - "Long-tailed vole", - "Greater naked-tailed armadillo", - "Common mole-rat", - "Philippine porcupine", - "Milne-Edwards's sifaka", - "Townsend's mole", - "Giant golden mole", - "Daurian pika", - "Cape golden mole", - "Yellow-faced pocket gopher", - "Indian gerbil", - "Plains viscacha rat", - "Red tree vole", - "Middle East blind mole-rat", - "Mountain paca", - "Pallas's pika", - "Bicolored shrew", - "Cape mole-rat", - "Cascade golden-mantled ground squirrel", - "Unstriped ground squirrel", - "Townsend's vole", - "Yellow ground squirrel", - "Desert pocket gopher", - "Bunny rat", - "Washington ground squirrel", - "Mole-like rice tenrec", - "Greater mole-rat", - "Hottentot golden mole", - "Plains pocket mouse", - "Cheesman's gerbil", - "Judean Mountains blind mole-rat", - "Chisel-toothed kangaroo rat", - "Rough-haired golden mole", - "Southeastern shrew", - "California pocket mouse", - "Coruro", - "Merriam's shrew", - "Long-tailed mole", - "Orange leaf-nosed bat", - "South African pouched mouse", - "Selous's mongoose", - "Ash-grey mouse", - "Russet ground squirrel", - "Gulf Coast kangaroo rat", - "Olive-backed pocket mouse", - "Northeast African mole-rat", - "San Diego pocket mouse", - "Nelson's pocket mouse", - "Geoffroy's horseshoe bat", - "Narrow-faced kangaroo rat", - "Chilean rock rat", - "R\u00fcppell's horseshoe bat", - "Long-tailed pocket mouse", - "Aztec mouse", - "Western mouse", - "Felten's myotis", - "Akodon azarae", - "Talas tuco-tuco", - "Upper Galilee Mountains blind mole-rat", - "Pearson's tuco-tuco", - "Mount Carmel blind mole-rat", - "Plethobasus cyphyus", - "Long-Nosed Snake", - "Russian Desman", - "Texas Blind Snake", - "Florida Box Turtle", - "Lesser Bandicoot Rat", - "Bush Rat", - "Six-Lined Racerunner", - "Eastern Bearded Dragon", - "Lesser Antillean Iguana", - "Eastern Mud Turtle", - "Slender Glass Lizard", - "Scarlet Snake", - "Natal Multimammate Mouse", - "Mountain Beaver", - "Bobak Marmot", - "Kirtland's Snake", - "Pine Woods Snake", - "Western Whiptail", - "Boxelder bug", - "Porcellio scaber", - "German cockroach", - "Forficula auricularia", - "Anisolabis maritima", - "Trigoniulus corallinus", - "Sinea diadema", - "Black imported fire ant", - "Scutigera coleoptrata", - "Mastigoproctus giganteus", - "Dermacentor andersoni", - "Deathstalker", - "Larinioides cornutus", - "Cheiracanthium inclusum", - "Latrodectus hesperus", - "Scytodes thoracica", - "Atypus affinis", - "Illacme plenipes", - "Ommatoiulus moreleti", - "Narceus americanus", - "Madagascar hissing cockroach", - "Labidura riparia", - "Forficula smyrnensis", - "Argentine ant", - "Texas leafcutter ant", - "Brachypelma klaasi", - "Western Blind Snake", - "Desert Box Turtle", - "African Striped Weasel" - ] -} \ No newline at end of file diff --git a/server/nextServer.ts b/server/nextServer.ts index 3a65eb2..e12c06e 100644 --- a/server/nextServer.ts +++ b/server/nextServer.ts @@ -2,7 +2,7 @@ import next from "next"; import express from "express"; import { parse } from "url"; import logger from "@server/logger"; -import config from "@server/config"; +import config from "@server/lib/config"; const nextPort = config.getRawConfig().server.next_port; diff --git a/server/routers/accessToken/deleteAccessToken.ts b/server/routers/accessToken/deleteAccessToken.ts index 891ede0..b9bbd42 100644 --- a/server/routers/accessToken/deleteAccessToken.ts +++ b/server/routers/accessToken/deleteAccessToken.ts @@ -1,6 +1,6 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; diff --git a/server/routers/accessToken/generateAccessToken.ts b/server/routers/accessToken/generateAccessToken.ts index bc39637..9037f5f 100644 --- a/server/routers/accessToken/generateAccessToken.ts +++ b/server/routers/accessToken/generateAccessToken.ts @@ -3,7 +3,7 @@ import { generateId, generateIdFromEntropySize, SESSION_COOKIE_EXPIRES -} from "@server/auth"; +} from "@server/auth/sessions/app"; import db from "@server/db"; import { ResourceAccessToken, @@ -11,7 +11,7 @@ import { resources } from "@server/db/schema"; import HttpCode from "@server/types/HttpCode"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import { eq } from "drizzle-orm"; import { NextFunction, Request, Response } from "express"; import createHttpError from "http-errors"; diff --git a/server/routers/accessToken/listAccessTokens.ts b/server/routers/accessToken/listAccessTokens.ts index 5ef543d..6ac2c93 100644 --- a/server/routers/accessToken/listAccessTokens.ts +++ b/server/routers/accessToken/listAccessTokens.ts @@ -7,12 +7,12 @@ import { roleResources, resourceAccessToken } from "@server/db/schema"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import { sql, eq, or, inArray, and, count, isNull, lt, gt } from "drizzle-orm"; import logger from "@server/logger"; -import stoi from "@server/utils/stoi"; +import stoi from "@server/lib/stoi"; const listAccessTokensParamsSchema = z .object({ diff --git a/server/routers/auth/changePassword.ts b/server/routers/auth/changePassword.ts index ecf3789..eba4497 100644 --- a/server/routers/auth/changePassword.ts +++ b/server/routers/auth/changePassword.ts @@ -2,22 +2,28 @@ import { Request, Response, NextFunction } from "express"; import createHttpError from "http-errors"; import HttpCode from "@server/types/HttpCode"; import { fromError } from "zod-validation-error"; -import { unauthorized, invalidateAllSessions } from "@server/auth"; import { z } from "zod"; import { db } from "@server/db"; import { User, users } from "@server/db/schema"; import { eq } from "drizzle-orm"; -import { response } from "@server/utils"; -import { hashPassword, verifyPassword } from "@server/auth/password"; -import { verifyTotpCode } from "@server/auth/2fa"; -import { passwordSchema } from "@server/auth/passwordSchema"; +import { response } from "@server/lib"; +import { + hashPassword, + verifyPassword +} from "@server/auth/password"; +import { verifyTotpCode } from "@server/auth/totp"; import logger from "@server/logger"; +import { unauthorized } from "@server/auth/unauthorizedResponse"; +import { invalidateAllSessions } from "@server/auth/sessions/app"; +import { passwordSchema } from "@server/auth/passwordSchema"; -export const changePasswordBody = z.object({ - oldPassword: z.string(), - newPassword: passwordSchema, - code: z.string().optional(), -}).strict(); +export const changePasswordBody = z + .object({ + oldPassword: z.string(), + newPassword: passwordSchema, + code: z.string().optional() + }) + .strict(); export type ChangePasswordBody = z.infer; @@ -28,7 +34,7 @@ export type ChangePasswordResponse = { export async function changePassword( req: Request, res: Response, - next: NextFunction, + next: NextFunction ): Promise { const parsedBody = changePasswordBody.safeParse(req.body); @@ -36,8 +42,8 @@ export async function changePassword( return next( createHttpError( HttpCode.BAD_REQUEST, - fromError(parsedBody.error).toString(), - ), + fromError(parsedBody.error).toString() + ) ); } @@ -49,14 +55,14 @@ export async function changePassword( return next( createHttpError( HttpCode.BAD_REQUEST, - "New password cannot be the same as the old password", - ), + "New password cannot be the same as the old password" + ) ); } const validPassword = await verifyPassword( oldPassword, - user.passwordHash, + user.passwordHash ); if (!validPassword) { return next(unauthorized()); @@ -69,21 +75,21 @@ export async function changePassword( success: true, error: false, message: "Two-factor authentication required", - status: HttpCode.ACCEPTED, + status: HttpCode.ACCEPTED }); } const validOTP = await verifyTotpCode( code!, user.twoFactorSecret!, - user.userId, + user.userId ); if (!validOTP) { return next( createHttpError( HttpCode.BAD_REQUEST, - "The two-factor code you entered is incorrect", - ), + "The two-factor code you entered is incorrect" + ) ); } } @@ -93,7 +99,7 @@ export async function changePassword( await db .update(users) .set({ - passwordHash: hash, + passwordHash: hash }) .where(eq(users.userId, user.userId)); @@ -106,15 +112,15 @@ export async function changePassword( success: true, error: false, message: "Password changed successfully", - status: HttpCode.OK, + status: HttpCode.OK }); } catch (error) { logger.error(error); return next( createHttpError( HttpCode.INTERNAL_SERVER_ERROR, - "Failed to authenticate user", - ), + "Failed to authenticate user" + ) ); } } diff --git a/server/routers/auth/checkResourceSession.ts b/server/routers/auth/checkResourceSession.ts index 95a27e2..ca7d80c 100644 --- a/server/routers/auth/checkResourceSession.ts +++ b/server/routers/auth/checkResourceSession.ts @@ -3,8 +3,8 @@ import createHttpError from "http-errors"; import { z } from "zod"; import { fromError } from "zod-validation-error"; import HttpCode from "@server/types/HttpCode"; -import { response } from "@server/utils"; -import { validateResourceSessionToken } from "@server/auth/resource"; +import { response } from "@server/lib"; +import { validateResourceSessionToken } from "@server/auth/sessions/resource"; import logger from "@server/logger"; export const params = z.object({ diff --git a/server/routers/auth/disable2fa.ts b/server/routers/auth/disable2fa.ts index 2a8bbf8..e27d75d 100644 --- a/server/routers/auth/disable2fa.ts +++ b/server/routers/auth/disable2fa.ts @@ -2,18 +2,18 @@ import { Request, Response, NextFunction } from "express"; import createHttpError from "http-errors"; import HttpCode from "@server/types/HttpCode"; import { fromError } from "zod-validation-error"; -import { unauthorized } from "@server/auth"; import { z } from "zod"; import { db } from "@server/db"; -import { twoFactorBackupCodes, User, users } from "@server/db/schema"; +import { User, users } from "@server/db/schema"; import { eq } from "drizzle-orm"; -import { response } from "@server/utils"; +import { response } from "@server/lib"; import { verifyPassword } from "@server/auth/password"; -import { verifyTotpCode } from "@server/auth/2fa"; +import { verifyTotpCode } from "@server/auth/totp"; import logger from "@server/logger"; import { sendEmail } from "@server/emails"; import TwoFactorAuthNotification from "@server/emails/templates/TwoFactorAuthNotification"; -import config from "@server/config"; +import config from "@server/lib/config"; +import { unauthorized } from "@server/auth/unauthorizedResponse"; export const disable2faBody = z .object({ diff --git a/server/routers/auth/login.ts b/server/routers/auth/login.ts index 9a2dd72..f5c28ad 100644 --- a/server/routers/auth/login.ts +++ b/server/routers/auth/login.ts @@ -1,23 +1,22 @@ -import { verify } from "@node-rs/argon2"; import { createSession, generateSessionToken, - serializeSessionCookie, - verifySession -} from "@server/auth"; + serializeSessionCookie +} from "@server/auth/sessions/app"; import db from "@server/db"; import { users } from "@server/db/schema"; import HttpCode from "@server/types/HttpCode"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import { eq } from "drizzle-orm"; import { NextFunction, Request, Response } from "express"; import createHttpError from "http-errors"; import { z } from "zod"; import { fromError } from "zod-validation-error"; -import { verifyTotpCode } from "@server/auth/2fa"; -import config from "@server/config"; +import { verifyTotpCode } from "@server/auth/totp"; +import config from "@server/lib/config"; import logger from "@server/logger"; import { verifyPassword } from "@server/auth/password"; +import { verifySession } from "@server/auth/sessions/verifySession"; export const loginBodySchema = z .object({ diff --git a/server/routers/auth/logout.ts b/server/routers/auth/logout.ts index 840ef2b..29ca18f 100644 --- a/server/routers/auth/logout.ts +++ b/server/routers/auth/logout.ts @@ -1,13 +1,13 @@ import { Request, Response, NextFunction } from "express"; import createHttpError from "http-errors"; import HttpCode from "@server/types/HttpCode"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import logger from "@server/logger"; import { createBlankSessionTokenCookie, invalidateSession, SESSION_COOKIE_NAME -} from "@server/auth"; +} from "@server/auth/sessions/app"; export async function logout( req: Request, diff --git a/server/routers/auth/requestEmailVerificationCode.ts b/server/routers/auth/requestEmailVerificationCode.ts index 06ded31..3153cf7 100644 --- a/server/routers/auth/requestEmailVerificationCode.ts +++ b/server/routers/auth/requestEmailVerificationCode.ts @@ -1,10 +1,10 @@ import { Request, Response, NextFunction } from "express"; import createHttpError from "http-errors"; import HttpCode from "@server/types/HttpCode"; -import { response } from "@server/utils"; +import { response } from "@server/lib"; import { User } from "@server/db/schema"; import { sendEmailVerificationCode } from "../../auth/sendEmailVerificationCode"; -import config from "@server/config"; +import config from "@server/lib/config"; import logger from "@server/logger"; export type RequestEmailVerificationCodeResponse = { diff --git a/server/routers/auth/requestPasswordReset.ts b/server/routers/auth/requestPasswordReset.ts index f6bdfde..e3d1de3 100644 --- a/server/routers/auth/requestPasswordReset.ts +++ b/server/routers/auth/requestPasswordReset.ts @@ -3,7 +3,7 @@ import createHttpError from "http-errors"; import { z } from "zod"; import { fromError } from "zod-validation-error"; import HttpCode from "@server/types/HttpCode"; -import { response } from "@server/utils"; +import { response } from "@server/lib"; import { db } from "@server/db"; import { passwordResetTokens, users } from "@server/db/schema"; import { eq } from "drizzle-orm"; @@ -11,9 +11,9 @@ import { alphabet, generateRandomString, sha256 } from "oslo/crypto"; import { encodeHex } from "oslo/encoding"; import { createDate } from "oslo"; import logger from "@server/logger"; -import { generateIdFromEntropySize } from "@server/auth"; +import { generateIdFromEntropySize } from "@server/auth/sessions/app"; import { TimeSpan } from "oslo"; -import config from "@server/config"; +import config from "@server/lib/config"; import { sendEmail } from "@server/emails"; import ResetPasswordCode from "@server/emails/templates/ResetPasswordCode"; import { hashPassword } from "@server/auth/password"; diff --git a/server/routers/auth/requestTotpSecret.ts b/server/routers/auth/requestTotpSecret.ts index 4f8dfb4..4926e51 100644 --- a/server/routers/auth/requestTotpSecret.ts +++ b/server/routers/auth/requestTotpSecret.ts @@ -4,16 +4,14 @@ import { z } from "zod"; import { fromError } from "zod-validation-error"; import { encodeHex } from "oslo/encoding"; import HttpCode from "@server/types/HttpCode"; -import { unauthorized } from "@server/auth"; -import { response } from "@server/utils"; +import { response } from "@server/lib"; import { db } from "@server/db"; import { User, users } from "@server/db/schema"; import { eq } from "drizzle-orm"; -import { verify } from "@node-rs/argon2"; import { createTOTPKeyURI } from "oslo/otp"; -import config from "@server/config"; import logger from "@server/logger"; import { verifyPassword } from "@server/auth/password"; +import { unauthorized } from "@server/auth/unauthorizedResponse"; export const requestTotpSecretBody = z .object({ diff --git a/server/routers/auth/resetPassword.ts b/server/routers/auth/resetPassword.ts index 2e46a0e..6f36d00 100644 --- a/server/routers/auth/resetPassword.ts +++ b/server/routers/auth/resetPassword.ts @@ -1,23 +1,21 @@ -import config from "@server/config"; +import config from "@server/lib/config"; import { Request, Response, NextFunction } from "express"; import createHttpError from "http-errors"; import { z } from "zod"; import { fromError } from "zod-validation-error"; import HttpCode from "@server/types/HttpCode"; -import { response } from "@server/utils"; +import { response } from "@server/lib"; import { db } from "@server/db"; import { passwordResetTokens, users } from "@server/db/schema"; import { eq } from "drizzle-orm"; -import { sha256 } from "oslo/crypto"; import { hashPassword, verifyPassword } from "@server/auth/password"; -import { verifyTotpCode } from "@server/auth/2fa"; -import { passwordSchema } from "@server/auth/passwordSchema"; -import { encodeHex } from "oslo/encoding"; +import { verifyTotpCode } from "@server/auth/totp"; import { isWithinExpirationDate } from "oslo"; -import { invalidateAllSessions } from "@server/auth"; +import { invalidateAllSessions } from "@server/auth/sessions/app"; import logger from "@server/logger"; import ConfirmPasswordReset from "@server/emails/templates/NotifyResetPassword"; import { sendEmail } from "@server/emails"; +import { passwordSchema } from "@server/auth/passwordSchema"; export const resetPasswordBody = z .object({ diff --git a/server/routers/auth/signup.ts b/server/routers/auth/signup.ts index 63a9ce6..1bc2498 100644 --- a/server/routers/auth/signup.ts +++ b/server/routers/auth/signup.ts @@ -1,15 +1,13 @@ import { NextFunction, Request, Response } from "express"; import db from "@server/db"; -import { hash } from "@node-rs/argon2"; import HttpCode from "@server/types/HttpCode"; import { z } from "zod"; -import { userActions, users } from "@server/db/schema"; +import { users } from "@server/db/schema"; import { fromError } from "zod-validation-error"; import createHttpError from "http-errors"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import { SqliteError } from "better-sqlite3"; import { sendEmailVerificationCode } from "../../auth/sendEmailVerificationCode"; -import { passwordSchema } from "@server/auth/passwordSchema"; import { eq } from "drizzle-orm"; import moment from "moment"; import { @@ -17,12 +15,12 @@ import { generateId, generateSessionToken, serializeSessionCookie -} from "@server/auth"; -import { ActionsEnum } from "@server/auth/actions"; -import config from "@server/config"; +} from "@server/auth/sessions/app"; +import config from "@server/lib/config"; import logger from "@server/logger"; import { hashPassword } from "@server/auth/password"; import { checkValidInvite } from "@server/auth/checkValidInvite"; +import { passwordSchema } from "@server/auth/passwordSchema"; export const signupBodySchema = z.object({ email: z.string().email(), diff --git a/server/routers/auth/verifyEmail.ts b/server/routers/auth/verifyEmail.ts index b7a85cf..45ef423 100644 --- a/server/routers/auth/verifyEmail.ts +++ b/server/routers/auth/verifyEmail.ts @@ -3,12 +3,12 @@ import createHttpError from "http-errors"; import { z } from "zod"; import { fromError } from "zod-validation-error"; import HttpCode from "@server/types/HttpCode"; -import { response } from "@server/utils"; +import { response } from "@server/lib"; import { db } from "@server/db"; import { User, emailVerificationCodes, users } from "@server/db/schema"; import { eq } from "drizzle-orm"; import { isWithinExpirationDate } from "oslo"; -import config from "@server/config"; +import config from "@server/lib/config"; import logger from "@server/logger"; export const verifyEmailBody = z diff --git a/server/routers/auth/verifyTotp.ts b/server/routers/auth/verifyTotp.ts index 79d0e89..f7b8eb3 100644 --- a/server/routers/auth/verifyTotp.ts +++ b/server/routers/auth/verifyTotp.ts @@ -3,17 +3,17 @@ import createHttpError from "http-errors"; import { z } from "zod"; import { fromError } from "zod-validation-error"; import HttpCode from "@server/types/HttpCode"; -import { response } from "@server/utils"; +import { response } from "@server/lib"; import { db } from "@server/db"; import { twoFactorBackupCodes, User, users } from "@server/db/schema"; import { eq } from "drizzle-orm"; import { alphabet, generateRandomString } from "oslo/crypto"; import { hashPassword } from "@server/auth/password"; -import { verifyTotpCode } from "@server/auth/2fa"; +import { verifyTotpCode } from "@server/auth/totp"; import logger from "@server/logger"; import { sendEmail } from "@server/emails"; import TwoFactorAuthNotification from "@server/emails/templates/TwoFactorAuthNotification"; -import config from "@server/config"; +import config from "@server/lib/config"; export const verifyTotpBody = z .object({ diff --git a/server/routers/badger/verifySession.ts b/server/routers/badger/verifySession.ts index 5803358..756fd04 100644 --- a/server/routers/badger/verifySession.ts +++ b/server/routers/badger/verifySession.ts @@ -3,8 +3,8 @@ import { NextFunction, Request, Response } from "express"; import createHttpError from "http-errors"; import { z } from "zod"; import { fromError } from "zod-validation-error"; -import { response } from "@server/utils/response"; -import { validateSessionToken } from "@server/auth"; +import { response } from "@server/lib/response"; +import { validateSessionToken } from "@server/auth/sessions/app"; import db from "@server/db"; import { resourceAccessToken, @@ -16,8 +16,8 @@ import { userOrgs } from "@server/db/schema"; import { and, eq } from "drizzle-orm"; -import config from "@server/config"; -import { validateResourceSessionToken } from "@server/auth/resource"; +import config from "@server/lib/config"; +import { validateResourceSessionToken } from "@server/auth/sessions/resource"; import { Resource, roleResources, userResources } from "@server/db/schema"; import logger from "@server/logger"; diff --git a/server/routers/external.ts b/server/routers/external.ts index 5736a76..0910f07 100644 --- a/server/routers/external.ts +++ b/server/routers/external.ts @@ -1,5 +1,5 @@ import { Router } from "express"; -import config from "@server/config"; +import config from "@server/lib/config"; import * as site from "./site"; import * as org from "./org"; import * as resource from "./resource"; diff --git a/server/routers/gerbil/getConfig.ts b/server/routers/gerbil/getConfig.ts index b30eee2..27fb05d 100644 --- a/server/routers/gerbil/getConfig.ts +++ b/server/routers/gerbil/getConfig.ts @@ -3,13 +3,13 @@ import { z } from 'zod'; import { sites, resources, targets, exitNodes } from '@server/db/schema'; import { db } from '@server/db'; import { eq } from 'drizzle-orm'; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from '@server/types/HttpCode'; import createHttpError from 'http-errors'; import logger from '@server/logger'; -import config from "@server/config"; +import config from "@server/lib/config"; import { getUniqueExitNodeEndpointName } from '@server/db/names'; -import { findNextAvailableCidr } from "@server/utils/ip"; +import { findNextAvailableCidr } from "@server/lib/ip"; import { fromError } from 'zod-validation-error'; // Define Zod schema for request validation const getConfigSchema = z.object({ @@ -34,7 +34,7 @@ export async function getConfig(req: Request, res: Response, next: NextFunction) return next( createHttpError( HttpCode.BAD_REQUEST, - fromError(parsedParams.error).toString() + fromError(parsedParams.error).toString() ) ); } @@ -151,4 +151,4 @@ async function getNextAvailablePort(): Promise { } return nextPort; -} \ No newline at end of file +} diff --git a/server/routers/gerbil/receiveBandwidth.ts b/server/routers/gerbil/receiveBandwidth.ts index 33e5fcd..b2063c0 100644 --- a/server/routers/gerbil/receiveBandwidth.ts +++ b/server/routers/gerbil/receiveBandwidth.ts @@ -5,7 +5,7 @@ import db from "@server/db"; import logger from "@server/logger"; import createHttpError from "http-errors"; import HttpCode from "@server/types/HttpCode"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; interface PeerBandwidth { publicKey: string; diff --git a/server/routers/newt/createNewt.ts b/server/routers/newt/createNewt.ts index 4dbeb1e..d43c4cc 100644 --- a/server/routers/newt/createNewt.ts +++ b/server/routers/newt/createNewt.ts @@ -5,11 +5,11 @@ import HttpCode from "@server/types/HttpCode"; import { z } from "zod"; import { newts } from "@server/db/schema"; import createHttpError from "http-errors"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import { SqliteError } from "better-sqlite3"; import moment from "moment"; -import { generateSessionToken } from "@server/auth"; -import { createNewtSession } from "@server/auth/newt"; +import { generateSessionToken } from "@server/auth/sessions/app"; +import { createNewtSession } from "@server/auth/sessions/newt"; import { fromError } from "zod-validation-error"; import { hashPassword } from "@server/auth/password"; diff --git a/server/routers/newt/getToken.ts b/server/routers/newt/getToken.ts index 6c02b61..f13cbac 100644 --- a/server/routers/newt/getToken.ts +++ b/server/routers/newt/getToken.ts @@ -1,19 +1,16 @@ -import { verify } from "@node-rs/argon2"; import { - createSession, generateSessionToken, - verifySession -} from "@server/auth"; +} from "@server/auth/sessions/app"; import db from "@server/db"; import { newts } from "@server/db/schema"; import HttpCode from "@server/types/HttpCode"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import { eq } from "drizzle-orm"; import { NextFunction, Request, Response } from "express"; import createHttpError from "http-errors"; import { z } from "zod"; import { fromError } from "zod-validation-error"; -import { createNewtSession, validateNewtSessionToken } from "@server/auth/newt"; +import { createNewtSession, validateNewtSessionToken } from "@server/auth/sessions/newt"; import { verifyPassword } from "@server/auth/password"; export const newtGetTokenBodySchema = z.object({ diff --git a/server/routers/org/checkId.ts b/server/routers/org/checkId.ts index 86ac0ee..475c967 100644 --- a/server/routers/org/checkId.ts +++ b/server/routers/org/checkId.ts @@ -3,7 +3,7 @@ import { z } from "zod"; import { db } from "@server/db"; import { orgs } from "@server/db/schema"; import { eq } from "drizzle-orm"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; diff --git a/server/routers/org/createOrg.ts b/server/routers/org/createOrg.ts index a471be3..b86dfd1 100644 --- a/server/routers/org/createOrg.ts +++ b/server/routers/org/createOrg.ts @@ -3,12 +3,12 @@ import { z } from "zod"; import { db } from "@server/db"; import { eq } from "drizzle-orm"; import { Org, orgs, roleActions, roles, userOrgs } from "@server/db/schema"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; import { createAdminRole } from "@server/setup/ensureActions"; -import config from "@server/config"; +import config from "@server/lib/config"; import { fromError } from "zod-validation-error"; import { defaultRoleAllowedActions } from "../role"; diff --git a/server/routers/org/deleteOrg.ts b/server/routers/org/deleteOrg.ts index 4bf1eaa..a796588 100644 --- a/server/routers/org/deleteOrg.ts +++ b/server/routers/org/deleteOrg.ts @@ -9,7 +9,7 @@ import { userActions } from "@server/db/schema"; import { eq } from "drizzle-orm"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import { ActionsEnum, checkUserActionPermission } from "@server/auth/actions"; diff --git a/server/routers/org/getOrg.ts b/server/routers/org/getOrg.ts index 18cf2ec..0deb476 100644 --- a/server/routers/org/getOrg.ts +++ b/server/routers/org/getOrg.ts @@ -3,7 +3,7 @@ import { z } from "zod"; import { db } from "@server/db"; import { Org, orgs } from "@server/db/schema"; import { eq } from "drizzle-orm"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; diff --git a/server/routers/org/getOrgOverview.ts b/server/routers/org/getOrgOverview.ts index 2a9b6f1..dbaa157 100644 --- a/server/routers/org/getOrgOverview.ts +++ b/server/routers/org/getOrgOverview.ts @@ -12,7 +12,7 @@ import { userSites } from "@server/db/schema"; import { and, count, eq, inArray } from "drizzle-orm"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; diff --git a/server/routers/org/listOrgs.ts b/server/routers/org/listOrgs.ts index 8b8ae68..6c1274e 100644 --- a/server/routers/org/listOrgs.ts +++ b/server/routers/org/listOrgs.ts @@ -2,7 +2,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; import { Org, orgs } from "@server/db/schema"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import { sql, inArray } from "drizzle-orm"; diff --git a/server/routers/org/updateOrg.ts b/server/routers/org/updateOrg.ts index 0ca66d0..43bc569 100644 --- a/server/routers/org/updateOrg.ts +++ b/server/routers/org/updateOrg.ts @@ -3,7 +3,7 @@ import { z } from "zod"; import { db } from "@server/db"; import { orgs } from "@server/db/schema"; import { eq } from "drizzle-orm"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; diff --git a/server/routers/resource/authWithAccessToken.ts b/server/routers/resource/authWithAccessToken.ts index e79bfef..fdc4b25 100644 --- a/server/routers/resource/authWithAccessToken.ts +++ b/server/routers/resource/authWithAccessToken.ts @@ -1,8 +1,8 @@ -import { generateSessionToken } from "@server/auth"; +import { generateSessionToken } from "@server/auth/sessions/app"; import db from "@server/db"; import { resourceAccessToken, resources } from "@server/db/schema"; import HttpCode from "@server/types/HttpCode"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import { eq, and } from "drizzle-orm"; import { NextFunction, Request, Response } from "express"; import createHttpError from "http-errors"; @@ -11,8 +11,8 @@ import { fromError } from "zod-validation-error"; import { createResourceSession, serializeResourceSessionCookie -} from "@server/auth/resource"; -import config from "@server/config"; +} from "@server/auth/sessions/resource"; +import config from "@server/lib/config"; import logger from "@server/logger"; import { verify } from "@node-rs/argon2"; import { isWithinExpirationDate } from "oslo"; diff --git a/server/routers/resource/authWithPassword.ts b/server/routers/resource/authWithPassword.ts index bbcfff8..dc7c41a 100644 --- a/server/routers/resource/authWithPassword.ts +++ b/server/routers/resource/authWithPassword.ts @@ -1,9 +1,9 @@ import { verify } from "@node-rs/argon2"; -import { generateSessionToken } from "@server/auth"; +import { generateSessionToken } from "@server/auth/sessions/app"; import db from "@server/db"; import { orgs, resourcePassword, resources } from "@server/db/schema"; import HttpCode from "@server/types/HttpCode"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import { eq } from "drizzle-orm"; import { NextFunction, Request, Response } from "express"; import createHttpError from "http-errors"; @@ -12,8 +12,8 @@ import { fromError } from "zod-validation-error"; import { createResourceSession, serializeResourceSessionCookie -} from "@server/auth/resource"; -import config from "@server/config"; +} from "@server/auth/sessions/resource"; +import config from "@server/lib/config"; import logger from "@server/logger"; import { verifyPassword } from "@server/auth/password"; diff --git a/server/routers/resource/authWithPincode.ts b/server/routers/resource/authWithPincode.ts index a0ac53d..a41f5a2 100644 --- a/server/routers/resource/authWithPincode.ts +++ b/server/routers/resource/authWithPincode.ts @@ -1,5 +1,5 @@ import { verify } from "@node-rs/argon2"; -import { generateSessionToken } from "@server/auth"; +import { generateSessionToken } from "@server/auth/sessions/app"; import db from "@server/db"; import { orgs, @@ -9,7 +9,7 @@ import { resourceWhitelist } from "@server/db/schema"; import HttpCode from "@server/types/HttpCode"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import { and, eq } from "drizzle-orm"; import { NextFunction, Request, Response } from "express"; import createHttpError from "http-errors"; @@ -18,9 +18,9 @@ import { fromError } from "zod-validation-error"; import { createResourceSession, serializeResourceSessionCookie -} from "@server/auth/resource"; +} from "@server/auth/sessions/resource"; import logger from "@server/logger"; -import config from "@server/config"; +import config from "@server/lib/config"; import { AuthWithPasswordResponse } from "./authWithPassword"; import { isValidOtp, sendResourceOtpEmail } from "@server/auth/resourceOtp"; import { verifyPassword } from "@server/auth/password"; diff --git a/server/routers/resource/authWithWhitelist.ts b/server/routers/resource/authWithWhitelist.ts index 252c9eb..cc73410 100644 --- a/server/routers/resource/authWithWhitelist.ts +++ b/server/routers/resource/authWithWhitelist.ts @@ -1,4 +1,4 @@ -import { generateSessionToken } from "@server/auth"; +import { generateSessionToken } from "@server/auth/sessions/app"; import db from "@server/db"; import { orgs, @@ -8,7 +8,7 @@ import { resourceWhitelist } from "@server/db/schema"; import HttpCode from "@server/types/HttpCode"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import { eq, and } from "drizzle-orm"; import { NextFunction, Request, Response } from "express"; import createHttpError from "http-errors"; @@ -17,8 +17,8 @@ import { fromError } from "zod-validation-error"; import { createResourceSession, serializeResourceSessionCookie -} from "@server/auth/resource"; -import config from "@server/config"; +} from "@server/auth/sessions/resource"; +import config from "@server/lib/config"; import { isValidOtp, sendResourceOtpEmail } from "@server/auth/resourceOtp"; import logger from "@server/logger"; diff --git a/server/routers/resource/createResource.ts b/server/routers/resource/createResource.ts index d5b349e..00cad94 100644 --- a/server/routers/resource/createResource.ts +++ b/server/routers/resource/createResource.ts @@ -10,11 +10,11 @@ import { roles, userResources } from "@server/db/schema"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import { eq, and } from "drizzle-orm"; -import stoi from "@server/utils/stoi"; +import stoi from "@server/lib/stoi"; import { fromError } from "zod-validation-error"; import { subdomainSchema } from "@server/schemas/subdomainSchema"; import logger from "@server/logger"; diff --git a/server/routers/resource/deleteResource.ts b/server/routers/resource/deleteResource.ts index b4318fb..c904601 100644 --- a/server/routers/resource/deleteResource.ts +++ b/server/routers/resource/deleteResource.ts @@ -3,7 +3,7 @@ import { z } from "zod"; import { db } from "@server/db"; import { newts, resources, sites, targets } from "@server/db/schema"; import { eq } from "drizzle-orm"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; diff --git a/server/routers/resource/getResource.ts b/server/routers/resource/getResource.ts index dfd48eb..d832e85 100644 --- a/server/routers/resource/getResource.ts +++ b/server/routers/resource/getResource.ts @@ -3,7 +3,7 @@ import { z } from "zod"; import { db } from "@server/db"; import { Resource, resources } from "@server/db/schema"; import { eq } from "drizzle-orm"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import { fromError } from "zod-validation-error"; diff --git a/server/routers/resource/getResourceAuthInfo.ts b/server/routers/resource/getResourceAuthInfo.ts index 10305e2..30da242 100644 --- a/server/routers/resource/getResourceAuthInfo.ts +++ b/server/routers/resource/getResourceAuthInfo.ts @@ -7,7 +7,7 @@ import { resources } from "@server/db/schema"; import { eq } from "drizzle-orm"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import { fromError } from "zod-validation-error"; diff --git a/server/routers/resource/getResourceWhitelist.ts b/server/routers/resource/getResourceWhitelist.ts index 64a421a..53d504b 100644 --- a/server/routers/resource/getResourceWhitelist.ts +++ b/server/routers/resource/getResourceWhitelist.ts @@ -3,7 +3,7 @@ import { z } from "zod"; import { db } from "@server/db"; import { resourceWhitelist, users } from "@server/db/schema"; // Assuming these are the correct tables import { eq } from "drizzle-orm"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; diff --git a/server/routers/resource/listResourceRoles.ts b/server/routers/resource/listResourceRoles.ts index 8b0069f..00fc40f 100644 --- a/server/routers/resource/listResourceRoles.ts +++ b/server/routers/resource/listResourceRoles.ts @@ -3,7 +3,7 @@ import { z } from "zod"; import { db } from "@server/db"; import { roleResources, roles } from "@server/db/schema"; import { eq } from "drizzle-orm"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; diff --git a/server/routers/resource/listResourceUsers.ts b/server/routers/resource/listResourceUsers.ts index d4b0182..97a790e 100644 --- a/server/routers/resource/listResourceUsers.ts +++ b/server/routers/resource/listResourceUsers.ts @@ -3,7 +3,7 @@ import { z } from "zod"; import { db } from "@server/db"; import { userResources, users } from "@server/db/schema"; // Assuming these are the correct tables import { eq } from "drizzle-orm"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; diff --git a/server/routers/resource/listResources.ts b/server/routers/resource/listResources.ts index 0752fef..74c1cff 100644 --- a/server/routers/resource/listResources.ts +++ b/server/routers/resource/listResources.ts @@ -9,12 +9,12 @@ import { resourcePassword, resourcePincode } from "@server/db/schema"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import { sql, eq, or, inArray, and, count } from "drizzle-orm"; import logger from "@server/logger"; -import stoi from "@server/utils/stoi"; +import stoi from "@server/lib/stoi"; const listResourcesParamsSchema = z .object({ diff --git a/server/routers/resource/setResourcePassword.ts b/server/routers/resource/setResourcePassword.ts index f6fa632..ecfc744 100644 --- a/server/routers/resource/setResourcePassword.ts +++ b/server/routers/resource/setResourcePassword.ts @@ -7,7 +7,7 @@ import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import { fromError } from "zod-validation-error"; import { hash } from "@node-rs/argon2"; -import { response } from "@server/utils"; +import { response } from "@server/lib"; import logger from "@server/logger"; import { hashPassword } from "@server/auth/password"; diff --git a/server/routers/resource/setResourcePincode.ts b/server/routers/resource/setResourcePincode.ts index f1b5846..1f1815b 100644 --- a/server/routers/resource/setResourcePincode.ts +++ b/server/routers/resource/setResourcePincode.ts @@ -7,8 +7,8 @@ import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import { fromError } from "zod-validation-error"; import { hash } from "@node-rs/argon2"; -import { response } from "@server/utils"; -import stoi from "@server/utils/stoi"; +import { response } from "@server/lib"; +import stoi from "@server/lib/stoi"; import logger from "@server/logger"; import { hashPassword } from "@server/auth/password"; diff --git a/server/routers/resource/setResourceRoles.ts b/server/routers/resource/setResourceRoles.ts index 4fb7e48..31c6cbe 100644 --- a/server/routers/resource/setResourceRoles.ts +++ b/server/routers/resource/setResourceRoles.ts @@ -2,7 +2,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; import { roleResources, roles } from "@server/db/schema"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; diff --git a/server/routers/resource/setResourceUsers.ts b/server/routers/resource/setResourceUsers.ts index 5587582..5f38afb 100644 --- a/server/routers/resource/setResourceUsers.ts +++ b/server/routers/resource/setResourceUsers.ts @@ -2,7 +2,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; import { userResources } from "@server/db/schema"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; diff --git a/server/routers/resource/setResourceWhitelist.ts b/server/routers/resource/setResourceWhitelist.ts index 0ef24b0..5eefbd5 100644 --- a/server/routers/resource/setResourceWhitelist.ts +++ b/server/routers/resource/setResourceWhitelist.ts @@ -2,7 +2,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; import { resources, resourceWhitelist } from "@server/db/schema"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; diff --git a/server/routers/resource/updateResource.ts b/server/routers/resource/updateResource.ts index da064e7..67b6812 100644 --- a/server/routers/resource/updateResource.ts +++ b/server/routers/resource/updateResource.ts @@ -3,7 +3,7 @@ import { z } from "zod"; import { db } from "@server/db"; import { orgs, resources, sites } from "@server/db/schema"; import { eq, or } from "drizzle-orm"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; diff --git a/server/routers/role/addRoleAction.ts b/server/routers/role/addRoleAction.ts index 1c3f2d2..53cea29 100644 --- a/server/routers/role/addRoleAction.ts +++ b/server/routers/role/addRoleAction.ts @@ -2,7 +2,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; import { roleActions, roles } from "@server/db/schema"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; diff --git a/server/routers/role/addRoleSite.ts b/server/routers/role/addRoleSite.ts index c702614..dddb91c 100644 --- a/server/routers/role/addRoleSite.ts +++ b/server/routers/role/addRoleSite.ts @@ -2,7 +2,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; import { resources, roleResources, roleSites } from "@server/db/schema"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; diff --git a/server/routers/role/createRole.ts b/server/routers/role/createRole.ts index a6a82dc..5076f98 100644 --- a/server/routers/role/createRole.ts +++ b/server/routers/role/createRole.ts @@ -2,7 +2,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; import { orgs, Role, roleActions, roles } from "@server/db/schema"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; diff --git a/server/routers/role/deleteRole.ts b/server/routers/role/deleteRole.ts index 708b096..3160f31 100644 --- a/server/routers/role/deleteRole.ts +++ b/server/routers/role/deleteRole.ts @@ -3,7 +3,7 @@ import { z } from "zod"; import { db } from "@server/db"; import { roles, userOrgs } from "@server/db/schema"; import { eq } from "drizzle-orm"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; @@ -108,7 +108,7 @@ export async function deleteRole( // delete the old role await trx.delete(roles).where(eq(roles.roleId, roleId)); }); - + return response(res, { data: null, success: true, diff --git a/server/routers/role/getRole.ts b/server/routers/role/getRole.ts index 54ce307..401c5e9 100644 --- a/server/routers/role/getRole.ts +++ b/server/routers/role/getRole.ts @@ -3,7 +3,7 @@ import { z } from "zod"; import { db } from "@server/db"; import { roles } from "@server/db/schema"; import { eq } from "drizzle-orm"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; diff --git a/server/routers/role/listRoleActions.ts b/server/routers/role/listRoleActions.ts index d33b971..20190bb 100644 --- a/server/routers/role/listRoleActions.ts +++ b/server/routers/role/listRoleActions.ts @@ -3,7 +3,7 @@ import { z } from "zod"; import { db } from "@server/db"; import { roleActions, actions } from "@server/db/schema"; import { eq } from "drizzle-orm"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; diff --git a/server/routers/role/listRoleResources.ts b/server/routers/role/listRoleResources.ts index 06405c3..3b13d96 100644 --- a/server/routers/role/listRoleResources.ts +++ b/server/routers/role/listRoleResources.ts @@ -3,7 +3,7 @@ import { z } from "zod"; import { db } from "@server/db"; import { roleResources, resources } from "@server/db/schema"; import { eq } from "drizzle-orm"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; diff --git a/server/routers/role/listRoleSites.ts b/server/routers/role/listRoleSites.ts index 999dc54..4b676d8 100644 --- a/server/routers/role/listRoleSites.ts +++ b/server/routers/role/listRoleSites.ts @@ -3,7 +3,7 @@ import { z } from "zod"; import { db } from "@server/db"; import { roleSites, sites } from "@server/db/schema"; import { eq } from "drizzle-orm"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; diff --git a/server/routers/role/listRoles.ts b/server/routers/role/listRoles.ts index c4c6f20..5427a91 100644 --- a/server/routers/role/listRoles.ts +++ b/server/routers/role/listRoles.ts @@ -2,13 +2,13 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; import { roles, orgs } from "@server/db/schema"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import { sql, eq } from "drizzle-orm"; import logger from "@server/logger"; import { fromError } from "zod-validation-error"; -import stoi from "@server/utils/stoi"; +import stoi from "@server/lib/stoi"; const listRolesParamsSchema = z .object({ diff --git a/server/routers/role/removeRoleAction.ts b/server/routers/role/removeRoleAction.ts index 47bfc0e..376e20b 100644 --- a/server/routers/role/removeRoleAction.ts +++ b/server/routers/role/removeRoleAction.ts @@ -3,7 +3,7 @@ import { z } from "zod"; import { db } from "@server/db"; import { roleActions } from "@server/db/schema"; import { and, eq } from "drizzle-orm"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; diff --git a/server/routers/role/removeRoleResource.ts b/server/routers/role/removeRoleResource.ts index 6724780..e5a0ead 100644 --- a/server/routers/role/removeRoleResource.ts +++ b/server/routers/role/removeRoleResource.ts @@ -3,7 +3,7 @@ import { z } from "zod"; import { db } from "@server/db"; import { roleResources } from "@server/db/schema"; import { and, eq } from "drizzle-orm"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; diff --git a/server/routers/role/removeRoleSite.ts b/server/routers/role/removeRoleSite.ts index e04b9dd..1294ce6 100644 --- a/server/routers/role/removeRoleSite.ts +++ b/server/routers/role/removeRoleSite.ts @@ -3,7 +3,7 @@ import { z } from "zod"; import { db } from "@server/db"; import { resources, roleResources, roleSites } from "@server/db/schema"; import { and, eq } from "drizzle-orm"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; diff --git a/server/routers/role/updateRole.ts b/server/routers/role/updateRole.ts index 0ba10ab..2bfcfe9 100644 --- a/server/routers/role/updateRole.ts +++ b/server/routers/role/updateRole.ts @@ -3,7 +3,7 @@ import { z } from "zod"; import { db } from "@server/db"; import { roles } from "@server/db/schema"; import { eq } from "drizzle-orm"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; diff --git a/server/routers/site/createSite.ts b/server/routers/site/createSite.ts index 417dcf2..1151fea 100644 --- a/server/routers/site/createSite.ts +++ b/server/routers/site/createSite.ts @@ -2,7 +2,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; import { roles, userSites, sites, roleSites, Site } from "@server/db/schema"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; diff --git a/server/routers/site/deleteSite.ts b/server/routers/site/deleteSite.ts index d739810..4bf79fc 100644 --- a/server/routers/site/deleteSite.ts +++ b/server/routers/site/deleteSite.ts @@ -3,7 +3,7 @@ import { z } from "zod"; import { db } from "@server/db"; import { newts, newtSessions, sites } from "@server/db/schema"; import { eq } from "drizzle-orm"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; @@ -77,7 +77,7 @@ export async function deleteSite( await trx.delete(sites).where(eq(sites.siteId, siteId)); }); - + return response(res, { data: null, success: true, diff --git a/server/routers/site/getSite.ts b/server/routers/site/getSite.ts index fd19b30..2a12e4d 100644 --- a/server/routers/site/getSite.ts +++ b/server/routers/site/getSite.ts @@ -3,11 +3,11 @@ import { z } from "zod"; import { db } from "@server/db"; import { sites } from "@server/db/schema"; import { eq, and } from "drizzle-orm"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; -import stoi from "@server/utils/stoi"; +import stoi from "@server/lib/stoi"; import { fromError } from "zod-validation-error"; const getSiteSchema = z diff --git a/server/routers/site/listSiteRoles.ts b/server/routers/site/listSiteRoles.ts index c347a08..ccb1308 100644 --- a/server/routers/site/listSiteRoles.ts +++ b/server/routers/site/listSiteRoles.ts @@ -3,7 +3,7 @@ import { z } from "zod"; import { db } from "@server/db"; import { roleSites, roles } from "@server/db/schema"; import { eq } from "drizzle-orm"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; diff --git a/server/routers/site/listSites.ts b/server/routers/site/listSites.ts index 4046944..d9ad9d1 100644 --- a/server/routers/site/listSites.ts +++ b/server/routers/site/listSites.ts @@ -2,7 +2,7 @@ import { db } from "@server/db"; import { orgs, roleSites, sites, userSites } from "@server/db/schema"; import logger from "@server/logger"; import HttpCode from "@server/types/HttpCode"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import { and, count, eq, inArray, or, sql } from "drizzle-orm"; import { NextFunction, Request, Response } from "express"; import createHttpError from "http-errors"; diff --git a/server/routers/site/pickSiteDefaults.ts b/server/routers/site/pickSiteDefaults.ts index cc9a008..5a111fa 100644 --- a/server/routers/site/pickSiteDefaults.ts +++ b/server/routers/site/pickSiteDefaults.ts @@ -2,12 +2,12 @@ import { Request, Response, NextFunction } from "express"; import { db } from "@server/db"; import { exitNodes, sites } from "@server/db/schema"; import { eq } from "drizzle-orm"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; -import { findNextAvailableCidr } from "@server/utils/ip"; -import { generateId } from "@server/auth"; +import { findNextAvailableCidr } from "@server/lib/ip"; +import { generateId } from "@server/auth/sessions/app"; export type PickSiteDefaultsResponse = { exitNodeId: number; diff --git a/server/routers/site/updateSite.ts b/server/routers/site/updateSite.ts index 5fc39e6..f3e9d31 100644 --- a/server/routers/site/updateSite.ts +++ b/server/routers/site/updateSite.ts @@ -3,7 +3,7 @@ import { z } from "zod"; import { db } from "@server/db"; import { sites } from "@server/db/schema"; import { eq } from "drizzle-orm"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; diff --git a/server/routers/target/createTarget.ts b/server/routers/target/createTarget.ts index 71b1a55..478c8d2 100644 --- a/server/routers/target/createTarget.ts +++ b/server/routers/target/createTarget.ts @@ -2,13 +2,13 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; import { newts, resources, sites, Target, targets } from "@server/db/schema"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; import { addPeer } from "../gerbil/peers"; import { eq, and } from "drizzle-orm"; -import { isIpInCidr } from "@server/utils/ip"; +import { isIpInCidr } from "@server/lib/ip"; import { fromError } from "zod-validation-error"; import { addTargets } from "../newt/targets"; diff --git a/server/routers/target/deleteTarget.ts b/server/routers/target/deleteTarget.ts index 1d9d337..06be64e 100644 --- a/server/routers/target/deleteTarget.ts +++ b/server/routers/target/deleteTarget.ts @@ -3,7 +3,7 @@ import { z } from "zod"; import { db } from "@server/db"; import { newts, resources, sites, targets } from "@server/db/schema"; import { eq } from "drizzle-orm"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; diff --git a/server/routers/target/getTarget.ts b/server/routers/target/getTarget.ts index 21ee78c..8206e82 100644 --- a/server/routers/target/getTarget.ts +++ b/server/routers/target/getTarget.ts @@ -3,7 +3,7 @@ import { z } from "zod"; import { db } from "@server/db"; import { targets } from "@server/db/schema"; import { eq } from "drizzle-orm"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; diff --git a/server/routers/target/listTargets.ts b/server/routers/target/listTargets.ts index b39fb0a..e430ed1 100644 --- a/server/routers/target/listTargets.ts +++ b/server/routers/target/listTargets.ts @@ -1,7 +1,7 @@ import { db } from "@server/db"; import { targets } from "@server/db/schema"; import HttpCode from "@server/types/HttpCode"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import { eq, sql } from "drizzle-orm"; import { NextFunction, Request, Response } from "express"; import createHttpError from "http-errors"; diff --git a/server/routers/target/updateTarget.ts b/server/routers/target/updateTarget.ts index a1f8620..448f501 100644 --- a/server/routers/target/updateTarget.ts +++ b/server/routers/target/updateTarget.ts @@ -3,7 +3,7 @@ import { z } from "zod"; import { db } from "@server/db"; import { newts, resources, sites, targets } from "@server/db/schema"; import { eq } from "drizzle-orm"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; diff --git a/server/routers/traefik/getTraefikConfig.ts b/server/routers/traefik/getTraefikConfig.ts index fa4ba15..708fa41 100644 --- a/server/routers/traefik/getTraefikConfig.ts +++ b/server/routers/traefik/getTraefikConfig.ts @@ -4,7 +4,7 @@ import * as schema from "@server/db/schema"; import { and, eq, isNotNull } from "drizzle-orm"; import logger from "@server/logger"; import HttpCode from "@server/types/HttpCode"; -import config from "@server/config"; +import config from "@server/lib/config"; export async function traefikConfigProvider( _: Request, diff --git a/server/routers/user/acceptInvite.ts b/server/routers/user/acceptInvite.ts index 3097c2d..b7f225a 100644 --- a/server/routers/user/acceptInvite.ts +++ b/server/routers/user/acceptInvite.ts @@ -1,18 +1,15 @@ -import { verify } from "@node-rs/argon2"; import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; import { roles, userInvites, userOrgs, users } from "@server/db/schema"; import { eq } from "drizzle-orm"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; import { fromError } from "zod-validation-error"; -import { isWithinExpirationDate } from "oslo"; -import { verifyPassword } from "@server/auth/password"; import { checkValidInvite } from "@server/auth/checkValidInvite"; -import { verifySession } from "@server/auth"; +import { verifySession } from "@server/auth/sessions/verifySession"; const acceptInviteBodySchema = z .object({ diff --git a/server/routers/user/addUserAction.ts b/server/routers/user/addUserAction.ts index 0352982..0b6fea9 100644 --- a/server/routers/user/addUserAction.ts +++ b/server/routers/user/addUserAction.ts @@ -2,7 +2,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; import { userActions, users } from "@server/db/schema"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; diff --git a/server/routers/user/addUserRole.ts b/server/routers/user/addUserRole.ts index 0b3acf6..4b24c5a 100644 --- a/server/routers/user/addUserRole.ts +++ b/server/routers/user/addUserRole.ts @@ -3,12 +3,12 @@ import { z } from "zod"; import { db } from "@server/db"; import { userOrgs, roles } from "@server/db/schema"; import { eq, and } from "drizzle-orm"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; import { fromError } from "zod-validation-error"; -import stoi from "@server/utils/stoi"; +import stoi from "@server/lib/stoi"; const addUserRoleParamsSchema = z .object({ diff --git a/server/routers/user/addUserSite.ts b/server/routers/user/addUserSite.ts index 4e6a2ef..1129c20 100644 --- a/server/routers/user/addUserSite.ts +++ b/server/routers/user/addUserSite.ts @@ -2,7 +2,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; import { resources, userResources, userSites } from "@server/db/schema"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; @@ -63,7 +63,7 @@ export async function addUserSite( status: HttpCode.CREATED }); }); - + } catch (error) { logger.error(error); return next( diff --git a/server/routers/user/getOrgUser.ts b/server/routers/user/getOrgUser.ts index 3f4a7b6..38d806d 100644 --- a/server/routers/user/getOrgUser.ts +++ b/server/routers/user/getOrgUser.ts @@ -3,7 +3,7 @@ import { z } from "zod"; import { db } from "@server/db"; import { roles, userOrgs, users } from "@server/db/schema"; import { and, eq } from "drizzle-orm"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; diff --git a/server/routers/user/getUser.ts b/server/routers/user/getUser.ts index b692ee6..096d4e2 100644 --- a/server/routers/user/getUser.ts +++ b/server/routers/user/getUser.ts @@ -3,7 +3,7 @@ import { z } from "zod"; import { db } from "@server/db"; import { users } from "@server/db/schema"; import { eq } from "drizzle-orm"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; diff --git a/server/routers/user/inviteUser.ts b/server/routers/user/inviteUser.ts index e44838b..7b77149 100644 --- a/server/routers/user/inviteUser.ts +++ b/server/routers/user/inviteUser.ts @@ -3,13 +3,13 @@ import { z } from "zod"; import { db } from "@server/db"; import { orgs, userInvites, userOrgs, users } from "@server/db/schema"; import { and, eq } from "drizzle-orm"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; import { alphabet, generateRandomString } from "oslo/crypto"; import { createDate, TimeSpan } from "oslo"; -import config from "@server/config"; +import config from "@server/lib/config"; import { hashPassword } from "@server/auth/password"; import { fromError } from "zod-validation-error"; import { sendEmail } from "@server/emails"; diff --git a/server/routers/user/listUsers.ts b/server/routers/user/listUsers.ts index 7202735..6c9e49a 100644 --- a/server/routers/user/listUsers.ts +++ b/server/routers/user/listUsers.ts @@ -2,7 +2,7 @@ import { Request, Response, NextFunction } from "express"; import { z } from "zod"; import { db } from "@server/db"; import { roles, userOrgs, users } from "@server/db/schema"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import { sql } from "drizzle-orm"; diff --git a/server/routers/user/removeUserAction.ts b/server/routers/user/removeUserAction.ts index 0ccb260..0d220fd 100644 --- a/server/routers/user/removeUserAction.ts +++ b/server/routers/user/removeUserAction.ts @@ -3,7 +3,7 @@ import { z } from "zod"; import { db } from "@server/db"; import { userActions } from "@server/db/schema"; import { and, eq } from "drizzle-orm"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; diff --git a/server/routers/user/removeUserOrg.ts b/server/routers/user/removeUserOrg.ts index 5c5d305..a608b89 100644 --- a/server/routers/user/removeUserOrg.ts +++ b/server/routers/user/removeUserOrg.ts @@ -3,7 +3,7 @@ import { z } from "zod"; import { db } from "@server/db"; import { userOrgs, userResources, users, userSites } from "@server/db/schema"; import { and, eq } from "drizzle-orm"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; diff --git a/server/routers/user/removeUserResource.ts b/server/routers/user/removeUserResource.ts index 318b6b3..23f115e 100644 --- a/server/routers/user/removeUserResource.ts +++ b/server/routers/user/removeUserResource.ts @@ -3,7 +3,7 @@ import { z } from "zod"; import { db } from "@server/db"; import { userResources } from "@server/db/schema"; import { and, eq } from "drizzle-orm"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; diff --git a/server/routers/user/removeUserSite.ts b/server/routers/user/removeUserSite.ts index 6d10bce..b45f722 100644 --- a/server/routers/user/removeUserSite.ts +++ b/server/routers/user/removeUserSite.ts @@ -3,7 +3,7 @@ import { z } from "zod"; import { db } from "@server/db"; import { resources, userResources, userSites } from "@server/db/schema"; import { and, eq } from "drizzle-orm"; -import response from "@server/utils/response"; +import response from "@server/lib/response"; import HttpCode from "@server/types/HttpCode"; import createHttpError from "http-errors"; import logger from "@server/logger"; diff --git a/server/routers/ws.ts b/server/routers/ws.ts index 95947e2..afe422d 100644 --- a/server/routers/ws.ts +++ b/server/routers/ws.ts @@ -6,7 +6,7 @@ import { Socket } from "net"; import { Newt, newts, NewtSession } from "@server/db/schema"; import { eq } from "drizzle-orm"; import db from "@server/db"; -import { validateNewtSessionToken } from "@server/auth/newt"; +import { validateNewtSessionToken } from "@server/auth/sessions/newt"; import { messageHandlers } from "./messageHandlers"; import logger from "@server/logger"; @@ -64,7 +64,7 @@ const addClient = (newtId: string, ws: AuthenticatedWebSocket): void => { const removeClient = (newtId: string, ws: AuthenticatedWebSocket): void => { const existingClients = connectedClients.get(newtId) || []; const updatedClients = existingClients.filter(client => client !== ws); - + if (updatedClients.length === 0) { connectedClients.delete(newtId); logger.info(`All connections removed for Newt ID: ${newtId}`); @@ -145,18 +145,18 @@ const setupConnection = (ws: AuthenticatedWebSocket, newt: Newt): void => { try { const message: WSMessage = JSON.parse(data.toString()); // logger.info(`Message received from Newt ID ${newtId}:`, message); - + // Validate message format if (!message.type || typeof message.type !== "string") { throw new Error("Invalid message format: missing or invalid type"); } - + // Get the appropriate handler for the message type const handler = messageHandlers[message.type]; if (!handler) { throw new Error(`Unsupported message type: ${message.type}`); } - + // Process the message and get response const response = await handler({ message, @@ -166,7 +166,7 @@ const setupConnection = (ws: AuthenticatedWebSocket, newt: Newt): void => { broadcastToAllExcept, connectedClients }); - + // Send response if one was returned if (response) { if (response.broadcast) { @@ -191,13 +191,13 @@ const setupConnection = (ws: AuthenticatedWebSocket, newt: Newt): void => { } })); } - }); - + }); + ws.on("close", () => { removeClient(newt.newtId, ws); logger.info(`Client disconnected - Newt ID: ${newt.newtId}`); }); - + ws.on("error", (error: Error) => { logger.error(`WebSocket error for Newt ID ${newt.newtId}:`, error); }); @@ -250,4 +250,4 @@ export { sendToClient, broadcastToAllExcept, connectedClients -}; \ No newline at end of file +}; diff --git a/server/setup/copyInConfig.ts b/server/setup/copyInConfig.ts index 3eab20b..ff459e6 100644 --- a/server/setup/copyInConfig.ts +++ b/server/setup/copyInConfig.ts @@ -1,6 +1,6 @@ import { db } from "@server/db"; import { orgs } from "../db/schema"; -import config from "@server/config"; +import config from "@server/lib/config"; import { ne } from "drizzle-orm"; import logger from "@server/logger"; diff --git a/server/setup/migrations.ts b/server/setup/migrations.ts index f6ea350..5483b2a 100644 --- a/server/setup/migrations.ts +++ b/server/setup/migrations.ts @@ -4,8 +4,8 @@ import path from "path"; import semver from "semver"; import { versionMigrations } from "@server/db/schema"; import { desc } from "drizzle-orm"; -import { __DIRNAME } from "@server/consts"; -import { loadAppVersion } from "@server/utils/loadAppVersion"; +import { __DIRNAME } from "@server/lib/consts"; +import { loadAppVersion } from "@server/lib/loadAppVersion"; import m1 from "./scripts/1.0.0-beta1"; // THIS CANNOT IMPORT ANYTHING FROM THE SERVER diff --git a/server/setup/setupServerAdmin.ts b/server/setup/setupServerAdmin.ts index d448215..54d3833 100644 --- a/server/setup/setupServerAdmin.ts +++ b/server/setup/setupServerAdmin.ts @@ -1,13 +1,13 @@ -import { generateId, invalidateAllSessions } from "@server/auth"; +import { generateId, invalidateAllSessions } from "@server/auth/sessions/app"; import { hashPassword, verifyPassword } from "@server/auth/password"; -import { passwordSchema } from "@server/auth/passwordSchema"; -import config from "@server/config"; +import config from "@server/lib/config"; import db from "@server/db"; import { users } from "@server/db/schema"; import logger from "@server/logger"; import { eq } from "drizzle-orm"; import moment from "moment"; import { fromError } from "zod-validation-error"; +import { passwordSchema } from "@server/auth/passwordSchema"; export async function setupServerAdmin() { const { diff --git a/src/app/[orgId]/components/OrganizationLandingCard.tsx b/src/app/[orgId]/OrganizationLandingCard.tsx similarity index 100% rename from src/app/[orgId]/components/OrganizationLandingCard.tsx rename to src/app/[orgId]/OrganizationLandingCard.tsx diff --git a/src/app/[orgId]/layout.tsx b/src/app/[orgId]/layout.tsx index e705eff..b8b5c6a 100644 --- a/src/app/[orgId]/layout.tsx +++ b/src/app/[orgId]/layout.tsx @@ -1,5 +1,5 @@ -import { internal } from "@app/api"; -import { authCookieHeader } from "@app/api/cookies"; +import { internal } from "@app/lib/api"; +import { authCookieHeader } from "@app/lib/api/cookies"; import ProfileIcon from "@app/components/ProfileIcon"; import { verifySession } from "@app/lib/auth/verifySession"; import UserProvider from "@app/providers/UserProvider"; diff --git a/src/app/[orgId]/page.tsx b/src/app/[orgId]/page.tsx index ff435eb..eaff09d 100644 --- a/src/app/[orgId]/page.tsx +++ b/src/app/[orgId]/page.tsx @@ -2,11 +2,11 @@ import ProfileIcon from "@app/components/ProfileIcon"; import { verifySession } from "@app/lib/auth/verifySession"; import UserProvider from "@app/providers/UserProvider"; import { cache } from "react"; -import OrganizationLandingCard from "./components/OrganizationLandingCard"; +import OrganizationLandingCard from "./OrganizationLandingCard"; import { GetOrgOverviewResponse } from "@server/routers/org/getOrgOverview"; -import { internal } from "@app/api"; +import { internal } from "@app/lib/api"; import { AxiosResponse } from "axios"; -import { authCookieHeader } from "@app/api/cookies"; +import { authCookieHeader } from "@app/lib/api/cookies"; import { redirect } from "next/navigation"; type OrgPageProps = { diff --git a/src/app/[orgId]/settings/access/components/AccessPageHeaderAndNav.tsx b/src/app/[orgId]/settings/access/AccessPageHeaderAndNav.tsx similarity index 100% rename from src/app/[orgId]/settings/access/components/AccessPageHeaderAndNav.tsx rename to src/app/[orgId]/settings/access/AccessPageHeaderAndNav.tsx diff --git a/src/app/[orgId]/settings/access/roles/components/CreateRoleForm.tsx b/src/app/[orgId]/settings/access/roles/CreateRoleForm.tsx similarity index 98% rename from src/app/[orgId]/settings/access/roles/components/CreateRoleForm.tsx rename to src/app/[orgId]/settings/access/roles/CreateRoleForm.tsx index cb6b909..c17b1ee 100644 --- a/src/app/[orgId]/settings/access/roles/components/CreateRoleForm.tsx +++ b/src/app/[orgId]/settings/access/roles/CreateRoleForm.tsx @@ -28,8 +28,8 @@ import { } from "@app/components/Credenza"; import { useOrgContext } from "@app/hooks/useOrgContext"; import { CreateRoleBody, CreateRoleResponse } from "@server/routers/role"; -import { formatAxiosError } from "@app/lib/utils"; -import { createApiClient } from "@app/api"; +import { formatAxiosError } from "@app/lib/api";; +import { createApiClient } from "@app/lib/api"; import { useEnvContext } from "@app/hooks/useEnvContext"; type CreateRoleFormProps = { diff --git a/src/app/[orgId]/settings/access/roles/components/DeleteRoleForm.tsx b/src/app/[orgId]/settings/access/roles/DeleteRoleForm.tsx similarity index 98% rename from src/app/[orgId]/settings/access/roles/components/DeleteRoleForm.tsx rename to src/app/[orgId]/settings/access/roles/DeleteRoleForm.tsx index bc1eb94..ae86726 100644 --- a/src/app/[orgId]/settings/access/roles/components/DeleteRoleForm.tsx +++ b/src/app/[orgId]/settings/access/roles/DeleteRoleForm.tsx @@ -35,8 +35,8 @@ import { SelectValue, } from "@app/components/ui/select"; import { RoleRow } from "./RolesTable"; -import { formatAxiosError } from "@app/lib/utils"; -import { createApiClient } from "@app/api"; +import { formatAxiosError } from "@app/lib/api";; +import { createApiClient } from "@app/lib/api"; import { useEnvContext } from "@app/hooks/useEnvContext"; type CreateRoleFormProps = { diff --git a/src/app/[orgId]/settings/access/roles/components/RolesDataTable.tsx b/src/app/[orgId]/settings/access/roles/RolesDataTable.tsx similarity index 100% rename from src/app/[orgId]/settings/access/roles/components/RolesDataTable.tsx rename to src/app/[orgId]/settings/access/roles/RolesDataTable.tsx diff --git a/src/app/[orgId]/settings/access/roles/components/RolesTable.tsx b/src/app/[orgId]/settings/access/roles/RolesTable.tsx similarity index 99% rename from src/app/[orgId]/settings/access/roles/components/RolesTable.tsx rename to src/app/[orgId]/settings/access/roles/RolesTable.tsx index 7b67c08..1c74d91 100644 --- a/src/app/[orgId]/settings/access/roles/components/RolesTable.tsx +++ b/src/app/[orgId]/settings/access/roles/RolesTable.tsx @@ -17,7 +17,7 @@ import { RolesDataTable } from "./RolesDataTable"; import { Role } from "@server/db/schema"; import CreateRoleForm from "./CreateRoleForm"; import DeleteRoleForm from "./DeleteRoleForm"; -import { createApiClient } from "@app/api"; +import { createApiClient } from "@app/lib/api"; import { useEnvContext } from "@app/hooks/useEnvContext"; export type RoleRow = Role; diff --git a/src/app/[orgId]/settings/access/roles/page.tsx b/src/app/[orgId]/settings/access/roles/page.tsx index 1555a5d..b091597 100644 --- a/src/app/[orgId]/settings/access/roles/page.tsx +++ b/src/app/[orgId]/settings/access/roles/page.tsx @@ -1,13 +1,13 @@ -import { internal } from "@app/api"; -import { authCookieHeader } from "@app/api/cookies"; +import { internal } from "@app/lib/api"; +import { authCookieHeader } from "@app/lib/api/cookies"; import { AxiosResponse } from "axios"; import { GetOrgResponse } from "@server/routers/org"; import { cache } from "react"; import OrgProvider from "@app/providers/OrgProvider"; import { ListRolesResponse } from "@server/routers/role"; -import RolesTable, { RoleRow } from "./components/RolesTable"; +import RolesTable, { RoleRow } from "./RolesTable"; import { SidebarSettings } from "@app/components/SidebarSettings"; -import AccessPageHeaderAndNav from "../components/AccessPageHeaderAndNav"; +import AccessPageHeaderAndNav from "../AccessPageHeaderAndNav"; type RolesPageProps = { params: Promise<{ orgId: string }>; diff --git a/src/app/[orgId]/settings/access/users/components/InviteUserForm.tsx b/src/app/[orgId]/settings/access/users/InviteUserForm.tsx similarity index 99% rename from src/app/[orgId]/settings/access/users/components/InviteUserForm.tsx rename to src/app/[orgId]/settings/access/users/InviteUserForm.tsx index daf44d9..12772ba 100644 --- a/src/app/[orgId]/settings/access/users/components/InviteUserForm.tsx +++ b/src/app/[orgId]/settings/access/users/InviteUserForm.tsx @@ -37,8 +37,8 @@ import { } from "@app/components/Credenza"; import { useOrgContext } from "@app/hooks/useOrgContext"; import { ListRolesResponse } from "@server/routers/role"; -import { formatAxiosError } from "@app/lib/utils"; -import { createApiClient } from "@app/api"; +import { formatAxiosError } from "@app/lib/api";; +import { createApiClient } from "@app/lib/api"; import { useEnvContext } from "@app/hooks/useEnvContext"; import { Checkbox } from "@app/components/ui/checkbox"; diff --git a/src/app/[orgId]/settings/access/users/components/UsersDataTable.tsx b/src/app/[orgId]/settings/access/users/UsersDataTable.tsx similarity index 98% rename from src/app/[orgId]/settings/access/users/components/UsersDataTable.tsx rename to src/app/[orgId]/settings/access/users/UsersDataTable.tsx index a35fd44..7c7d174 100644 --- a/src/app/[orgId]/settings/access/users/components/UsersDataTable.tsx +++ b/src/app/[orgId]/settings/access/users/UsersDataTable.tsx @@ -22,7 +22,7 @@ import { import { Button } from "@app/components/ui/button"; import { useState } from "react"; import { Input } from "@app/components/ui/input"; -import { DataTablePagination } from "../../../../../../components/DataTablePagination"; +import { DataTablePagination } from "@app/components/DataTablePagination"; import { Plus, Search } from "lucide-react"; interface DataTableProps { diff --git a/src/app/[orgId]/settings/access/users/components/UsersTable.tsx b/src/app/[orgId]/settings/access/users/UsersTable.tsx similarity index 99% rename from src/app/[orgId]/settings/access/users/components/UsersTable.tsx rename to src/app/[orgId]/settings/access/users/UsersTable.tsx index 6b45fd4..dbb243e 100644 --- a/src/app/[orgId]/settings/access/users/components/UsersTable.tsx +++ b/src/app/[orgId]/settings/access/users/UsersTable.tsx @@ -17,8 +17,8 @@ import { useOrgContext } from "@app/hooks/useOrgContext"; import { useToast } from "@app/hooks/useToast"; import Link from "next/link"; import { useRouter } from "next/navigation"; -import { formatAxiosError } from "@app/lib/utils"; -import { createApiClient } from "@app/api"; +import { formatAxiosError } from "@app/lib/api";; +import { createApiClient } from "@app/lib/api"; import { useEnvContext } from "@app/hooks/useEnvContext"; import { useUserContext } from "@app/hooks/useUserContext"; diff --git a/src/app/[orgId]/settings/access/users/[userId]/access-controls/page.tsx b/src/app/[orgId]/settings/access/users/[userId]/access-controls/page.tsx index aae7649..5df8248 100644 --- a/src/app/[orgId]/settings/access/users/[userId]/access-controls/page.tsx +++ b/src/app/[orgId]/settings/access/users/[userId]/access-controls/page.tsx @@ -28,8 +28,8 @@ import { userOrgUserContext } from "@app/hooks/useOrgUserContext"; import { useParams } from "next/navigation"; import { Button } from "@app/components/ui/button"; import SettingsSectionTitle from "@app/components/SettingsSectionTitle"; -import { formatAxiosError } from "@app/lib/utils"; -import { createApiClient } from "@app/api"; +import { formatAxiosError } from "@app/lib/api";; +import { createApiClient } from "@app/lib/api"; import { useEnvContext } from "@app/hooks/useEnvContext"; const formSchema = z.object({ diff --git a/src/app/[orgId]/settings/access/users/[userId]/layout.tsx b/src/app/[orgId]/settings/access/users/[userId]/layout.tsx index d7f792f..a5dfbcb 100644 --- a/src/app/[orgId]/settings/access/users/[userId]/layout.tsx +++ b/src/app/[orgId]/settings/access/users/[userId]/layout.tsx @@ -1,7 +1,7 @@ -import { internal } from "@app/api"; +import { internal } from "@app/lib/api"; import { AxiosResponse } from "axios"; import { redirect } from "next/navigation"; -import { authCookieHeader } from "@app/api/cookies"; +import { authCookieHeader } from "@app/lib/api/cookies"; import { SidebarSettings } from "@app/components/SidebarSettings"; import { GetOrgUserResponse } from "@server/routers/user"; import OrgUserProvider from "@app/providers/OrgUserProvider"; diff --git a/src/app/[orgId]/settings/access/users/page.tsx b/src/app/[orgId]/settings/access/users/page.tsx index d6f3d99..68832f0 100644 --- a/src/app/[orgId]/settings/access/users/page.tsx +++ b/src/app/[orgId]/settings/access/users/page.tsx @@ -1,15 +1,14 @@ -import { internal } from "@app/api"; -import { authCookieHeader } from "@app/api/cookies"; +import { internal } from "@app/lib/api"; +import { authCookieHeader } from "@app/lib/api/cookies"; import { ListUsersResponse } from "@server/routers/user"; import { AxiosResponse } from "axios"; -import UsersTable, { UserRow } from "./components/UsersTable"; +import UsersTable, { UserRow } from "./UsersTable"; import { GetOrgResponse } from "@server/routers/org"; import { cache } from "react"; import OrgProvider from "@app/providers/OrgProvider"; import UserProvider from "@app/providers/UserProvider"; import { verifySession } from "@app/lib/auth/verifySession"; -import { SidebarSettings } from "@app/components/SidebarSettings"; -import AccessPageHeaderAndNav from "../components/AccessPageHeaderAndNav"; +import AccessPageHeaderAndNav from "../AccessPageHeaderAndNav"; type UsersPageProps = { params: Promise<{ orgId: string }>; diff --git a/src/app/[orgId]/settings/general/layout.tsx b/src/app/[orgId]/settings/general/layout.tsx index f4dc654..5923118 100644 --- a/src/app/[orgId]/settings/general/layout.tsx +++ b/src/app/[orgId]/settings/general/layout.tsx @@ -1,5 +1,5 @@ -import { internal } from "@app/api"; -import { authCookieHeader } from "@app/api/cookies"; +import { internal } from "@app/lib/api"; +import { authCookieHeader } from "@app/lib/api/cookies"; import SettingsSectionTitle from "@app/components/SettingsSectionTitle"; import { SidebarSettings } from "@app/components/SidebarSettings"; import { verifySession } from "@app/lib/auth/verifySession"; diff --git a/src/app/[orgId]/settings/general/page.tsx b/src/app/[orgId]/settings/general/page.tsx index d134715..2ded3f7 100644 --- a/src/app/[orgId]/settings/general/page.tsx +++ b/src/app/[orgId]/settings/general/page.tsx @@ -19,9 +19,9 @@ import { Input } from "@/components/ui/input"; import { z } from "zod"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; -import { createApiClient } from "@app/api"; +import { createApiClient } from "@app/lib/api"; import { useEnvContext } from "@app/hooks/useEnvContext"; -import { formatAxiosError } from "@app/lib/utils"; +import { formatAxiosError } from "@app/lib/api";; import { AlertTriangle, Trash2 } from "lucide-react"; import { Card, diff --git a/src/app/[orgId]/settings/layout.tsx b/src/app/[orgId]/settings/layout.tsx index 076d499..49cbeea 100644 --- a/src/app/[orgId]/settings/layout.tsx +++ b/src/app/[orgId]/settings/layout.tsx @@ -4,10 +4,10 @@ import { Cog, Combine, Link, Settings, Users, Waypoints } from "lucide-react"; import { Header } from "@app/components/Header"; import { verifySession } from "@app/lib/auth/verifySession"; import { redirect } from "next/navigation"; -import { internal } from "@app/api"; +import { internal } from "@app/lib/api"; import { AxiosResponse } from "axios"; import { GetOrgResponse, ListOrgsResponse } from "@server/routers/org"; -import { authCookieHeader } from "@app/api/cookies"; +import { authCookieHeader } from "@app/lib/api/cookies"; import { cache } from "react"; import { GetOrgUserResponse } from "@server/routers/user"; import UserProvider from "@app/providers/UserProvider"; diff --git a/src/app/[orgId]/settings/resources/components/CreateResourceForm.tsx b/src/app/[orgId]/settings/resources/CreateResourceForm.tsx similarity index 98% rename from src/app/[orgId]/settings/resources/components/CreateResourceForm.tsx rename to src/app/[orgId]/settings/resources/CreateResourceForm.tsx index d7f9ae4..912f7be 100644 --- a/src/app/[orgId]/settings/resources/components/CreateResourceForm.tsx +++ b/src/app/[orgId]/settings/resources/CreateResourceForm.tsx @@ -28,7 +28,7 @@ import { } from "@app/components/Credenza"; import { useParams, useRouter } from "next/navigation"; import { ListSitesResponse } from "@server/routers/site"; -import { cn, formatAxiosError } from "@app/lib/utils"; +import { formatAxiosError } from "@app/lib/api"; import { CheckIcon } from "lucide-react"; import { Popover, @@ -44,13 +44,14 @@ import { CommandList } from "@app/components/ui/command"; import { CaretSortIcon } from "@radix-ui/react-icons"; -import CustomDomainInput from "../[resourceId]/components/CustomDomainInput"; +import CustomDomainInput from "./[resourceId]/CustomDomainInput"; import { Axios, AxiosResponse } from "axios"; import { Resource } from "@server/db/schema"; import { useOrgContext } from "@app/hooks/useOrgContext"; import { subdomainSchema } from "@server/schemas/subdomainSchema"; -import { createApiClient } from "@app/api"; +import { createApiClient } from "@app/lib/api"; import { useEnvContext } from "@app/hooks/useEnvContext"; +import { cn } from "@app/lib/cn"; const accountFormSchema = z.object({ subdomain: subdomainSchema, diff --git a/src/app/[orgId]/settings/resources/components/ResourcesDataTable.tsx b/src/app/[orgId]/settings/resources/ResourcesDataTable.tsx similarity index 100% rename from src/app/[orgId]/settings/resources/components/ResourcesDataTable.tsx rename to src/app/[orgId]/settings/resources/ResourcesDataTable.tsx diff --git a/src/app/[orgId]/settings/resources/components/ResourcesTable.tsx b/src/app/[orgId]/settings/resources/ResourcesTable.tsx similarity index 98% rename from src/app/[orgId]/settings/resources/components/ResourcesTable.tsx rename to src/app/[orgId]/settings/resources/ResourcesTable.tsx index c071f8e..b9df72b 100644 --- a/src/app/[orgId]/settings/resources/components/ResourcesTable.tsx +++ b/src/app/[orgId]/settings/resources/ResourcesTable.tsx @@ -25,9 +25,9 @@ import CreateResourceForm from "./CreateResourceForm"; import { useState } from "react"; import ConfirmDeleteDialog from "@app/components/ConfirmDeleteDialog"; import { set } from "zod"; -import { formatAxiosError } from "@app/lib/utils"; +import { formatAxiosError } from "@app/lib/api";; import { useToast } from "@app/hooks/useToast"; -import { createApiClient } from "@app/api"; +import { createApiClient } from "@app/lib/api"; import { useEnvContext } from "@app/hooks/useEnvContext"; import CopyToClipboard from "@app/components/CopyToClipboard"; diff --git a/src/app/[orgId]/settings/resources/[resourceId]/components/CustomDomainInput.tsx b/src/app/[orgId]/settings/resources/[resourceId]/CustomDomainInput.tsx similarity index 100% rename from src/app/[orgId]/settings/resources/[resourceId]/components/CustomDomainInput.tsx rename to src/app/[orgId]/settings/resources/[resourceId]/CustomDomainInput.tsx diff --git a/src/app/[orgId]/settings/resources/[resourceId]/components/ResourceInfoBox.tsx b/src/app/[orgId]/settings/resources/[resourceId]/ResourceInfoBox.tsx similarity index 100% rename from src/app/[orgId]/settings/resources/[resourceId]/components/ResourceInfoBox.tsx rename to src/app/[orgId]/settings/resources/[resourceId]/ResourceInfoBox.tsx diff --git a/src/app/[orgId]/settings/resources/[resourceId]/authentication/components/SetResourcePasswordForm.tsx b/src/app/[orgId]/settings/resources/[resourceId]/authentication/SetResourcePasswordForm.tsx similarity index 98% rename from src/app/[orgId]/settings/resources/[resourceId]/authentication/components/SetResourcePasswordForm.tsx rename to src/app/[orgId]/settings/resources/[resourceId]/authentication/SetResourcePasswordForm.tsx index 7bc8f18..6a092c0 100644 --- a/src/app/[orgId]/settings/resources/[resourceId]/authentication/components/SetResourcePasswordForm.tsx +++ b/src/app/[orgId]/settings/resources/[resourceId]/authentication/SetResourcePasswordForm.tsx @@ -26,10 +26,10 @@ import { CredenzaHeader, CredenzaTitle, } from "@app/components/Credenza"; -import { formatAxiosError } from "@app/lib/utils"; +import { formatAxiosError } from "@app/lib/api";; import { AxiosResponse } from "axios"; import { Resource } from "@server/db/schema"; -import { createApiClient } from "@app/api"; +import { createApiClient } from "@app/lib/api"; import { useEnvContext } from "@app/hooks/useEnvContext"; const setPasswordFormSchema = z.object({ diff --git a/src/app/[orgId]/settings/resources/[resourceId]/authentication/components/SetResourcePincodeForm.tsx b/src/app/[orgId]/settings/resources/[resourceId]/authentication/SetResourcePincodeForm.tsx similarity index 98% rename from src/app/[orgId]/settings/resources/[resourceId]/authentication/components/SetResourcePincodeForm.tsx rename to src/app/[orgId]/settings/resources/[resourceId]/authentication/SetResourcePincodeForm.tsx index 3c4c36c..1f698c0 100644 --- a/src/app/[orgId]/settings/resources/[resourceId]/authentication/components/SetResourcePincodeForm.tsx +++ b/src/app/[orgId]/settings/resources/[resourceId]/authentication/SetResourcePincodeForm.tsx @@ -26,7 +26,7 @@ import { CredenzaHeader, CredenzaTitle, } from "@app/components/Credenza"; -import { formatAxiosError } from "@app/lib/utils"; +import { formatAxiosError } from "@app/lib/api";; import { AxiosResponse } from "axios"; import { Resource } from "@server/db/schema"; import { @@ -34,7 +34,7 @@ import { InputOTPGroup, InputOTPSlot, } from "@app/components/ui/input-otp"; -import { createApiClient } from "@app/api"; +import { createApiClient } from "@app/lib/api"; import { useEnvContext } from "@app/hooks/useEnvContext"; const setPincodeFormSchema = z.object({ diff --git a/src/app/[orgId]/settings/resources/[resourceId]/authentication/page.tsx b/src/app/[orgId]/settings/resources/[resourceId]/authentication/page.tsx index 5d9bd11..900f986 100644 --- a/src/app/[orgId]/settings/resources/[resourceId]/authentication/page.tsx +++ b/src/app/[orgId]/settings/resources/[resourceId]/authentication/page.tsx @@ -6,7 +6,7 @@ import { useToast } from "@app/hooks/useToast"; import { useOrgContext } from "@app/hooks/useOrgContext"; import { useResourceContext } from "@app/hooks/useResourceContext"; import { AxiosResponse } from "axios"; -import { formatAxiosError } from "@app/lib/utils"; +import { formatAxiosError } from "@app/lib/api";; import { GetResourceAuthInfoResponse, GetResourceWhitelistResponse, @@ -33,10 +33,10 @@ import { ListUsersResponse } from "@server/routers/user"; import { Switch } from "@app/components/ui/switch"; import { Label } from "@app/components/ui/label"; import { Binary, Key, ShieldCheck } from "lucide-react"; -import SetResourcePasswordForm from "./components/SetResourcePasswordForm"; +import SetResourcePasswordForm from "./SetResourcePasswordForm"; import { Separator } from "@app/components/ui/separator"; -import SetResourcePincodeForm from "./components/SetResourcePincodeForm"; -import { createApiClient } from "@app/api"; +import SetResourcePincodeForm from "./SetResourcePincodeForm"; +import { createApiClient } from "@app/lib/api"; import { useEnvContext } from "@app/hooks/useEnvContext"; const UsersRolesFormSchema = z.object({ diff --git a/src/app/[orgId]/settings/resources/[resourceId]/connectivity/page.tsx b/src/app/[orgId]/settings/resources/[resourceId]/connectivity/page.tsx index f33d94c..fe91d2e 100644 --- a/src/app/[orgId]/settings/resources/[resourceId]/connectivity/page.tsx +++ b/src/app/[orgId]/settings/resources/[resourceId]/connectivity/page.tsx @@ -48,9 +48,9 @@ import { useToast } from "@app/hooks/useToast"; import SettingsSectionTitle from "@app/components/SettingsSectionTitle"; import { useResourceContext } from "@app/hooks/useResourceContext"; import { ArrayElement } from "@server/types/ArrayElement"; -import { formatAxiosError } from "@app/lib/utils"; +import { formatAxiosError } from "@app/lib/api/formatAxiosError";; import { useEnvContext } from "@app/hooks/useEnvContext"; -import { createApiClient } from "@app/api"; +import { createApiClient } from "@app/lib/api"; import { GetSiteResponse } from "@server/routers/site"; const addTargetSchema = z.object({ diff --git a/src/app/[orgId]/settings/resources/[resourceId]/general/page.tsx b/src/app/[orgId]/settings/resources/[resourceId]/general/page.tsx index fd32e98..3aa64a8 100644 --- a/src/app/[orgId]/settings/resources/[resourceId]/general/page.tsx +++ b/src/app/[orgId]/settings/resources/[resourceId]/general/page.tsx @@ -2,7 +2,7 @@ import { zodResolver } from "@hookform/resolvers/zod"; import { z } from "zod"; -import { cn, formatAxiosError } from "@/lib/utils"; +import { formatAxiosError } from "@app/lib/api"; import { Button } from "@/components/ui/button"; import { Form, @@ -39,10 +39,10 @@ import { GetResourceAuthInfoResponse } from "@server/routers/resource"; import { useToast } from "@app/hooks/useToast"; import SettingsSectionTitle from "@app/components/SettingsSectionTitle"; import { useOrgContext } from "@app/hooks/useOrgContext"; -import CustomDomainInput from "../components/CustomDomainInput"; -import ResourceInfoBox from "../components/ResourceInfoBox"; +import CustomDomainInput from "../CustomDomainInput"; +import ResourceInfoBox from "../ResourceInfoBox"; import { subdomainSchema } from "@server/schemas/subdomainSchema"; -import { createApiClient } from "@app/api"; +import { createApiClient } from "@app/lib/api"; import { useEnvContext } from "@app/hooks/useEnvContext"; const GeneralFormSchema = z.object({ diff --git a/src/app/[orgId]/settings/resources/[resourceId]/layout.tsx b/src/app/[orgId]/settings/resources/[resourceId]/layout.tsx index 3ff26eb..fea9ea7 100644 --- a/src/app/[orgId]/settings/resources/[resourceId]/layout.tsx +++ b/src/app/[orgId]/settings/resources/[resourceId]/layout.tsx @@ -1,19 +1,19 @@ import ResourceProvider from "@app/providers/ResourceProvider"; -import { internal } from "@app/api"; +import { internal } from "@app/lib/api"; import { GetResourceAuthInfoResponse, GetResourceResponse, } from "@server/routers/resource"; import { AxiosResponse } from "axios"; import { redirect } from "next/navigation"; -import { authCookieHeader } from "@app/api/cookies"; +import { authCookieHeader } from "@app/lib/api/cookies"; import { SidebarSettings } from "@app/components/SidebarSettings"; import { Cloud, Settings, Shield } from "lucide-react"; import SettingsSectionTitle from "@app/components/SettingsSectionTitle"; import { GetOrgResponse } from "@server/routers/org"; import OrgProvider from "@app/providers/OrgProvider"; import { cache } from "react"; -import ResourceInfoBox from "./components/ResourceInfoBox"; +import ResourceInfoBox from "./ResourceInfoBox"; import { Breadcrumb, BreadcrumbItem, diff --git a/src/app/[orgId]/settings/resources/page.tsx b/src/app/[orgId]/settings/resources/page.tsx index 0cb3da0..2325149 100644 --- a/src/app/[orgId]/settings/resources/page.tsx +++ b/src/app/[orgId]/settings/resources/page.tsx @@ -1,6 +1,6 @@ -import { internal } from "@app/api"; -import { authCookieHeader } from "@app/api/cookies"; -import ResourcesTable, { ResourceRow } from "./components/ResourcesTable"; +import { internal } from "@app/lib/api"; +import { authCookieHeader } from "@app/lib/api/cookies"; +import ResourcesTable, { ResourceRow } from "./ResourcesTable"; import { AxiosResponse } from "axios"; import { ListResourcesResponse } from "@server/routers/resource"; import SettingsSectionTitle from "@app/components/SettingsSectionTitle"; diff --git a/src/app/[orgId]/settings/share-links/components/CreateShareLinkForm.tsx b/src/app/[orgId]/settings/share-links/CreateShareLinkForm.tsx similarity index 99% rename from src/app/[orgId]/settings/share-links/components/CreateShareLinkForm.tsx rename to src/app/[orgId]/settings/share-links/CreateShareLinkForm.tsx index b55fd5b..64c4d31 100644 --- a/src/app/[orgId]/settings/share-links/components/CreateShareLinkForm.tsx +++ b/src/app/[orgId]/settings/share-links/CreateShareLinkForm.tsx @@ -38,8 +38,9 @@ import { } from "@app/components/Credenza"; import { useOrgContext } from "@app/hooks/useOrgContext"; import { ListRolesResponse } from "@server/routers/role"; -import { cn, formatAxiosError } from "@app/lib/utils"; -import { createApiClient } from "@app/api"; +import { formatAxiosError } from "@app/lib/api"; +import { cn } from "@app/lib/cn"; +import { createApiClient } from "@app/lib/api"; import { useEnvContext } from "@app/hooks/useEnvContext"; import { ListResourcesResponse } from "@server/routers/resource"; import { diff --git a/src/app/[orgId]/settings/share-links/components/ShareLinksDataTable.tsx b/src/app/[orgId]/settings/share-links/ShareLinksDataTable.tsx similarity index 100% rename from src/app/[orgId]/settings/share-links/components/ShareLinksDataTable.tsx rename to src/app/[orgId]/settings/share-links/ShareLinksDataTable.tsx diff --git a/src/app/[orgId]/settings/share-links/components/ShareLinksTable.tsx b/src/app/[orgId]/settings/share-links/ShareLinksTable.tsx similarity index 99% rename from src/app/[orgId]/settings/share-links/components/ShareLinksTable.tsx rename to src/app/[orgId]/settings/share-links/ShareLinksTable.tsx index 83863ca..505a85c 100644 --- a/src/app/[orgId]/settings/share-links/components/ShareLinksTable.tsx +++ b/src/app/[orgId]/settings/share-links/ShareLinksTable.tsx @@ -24,9 +24,9 @@ import { useRouter } from "next/navigation"; // import CreateResourceForm from "./CreateResourceForm"; import { useState } from "react"; import ConfirmDeleteDialog from "@app/components/ConfirmDeleteDialog"; -import { formatAxiosError } from "@app/lib/utils"; +import { formatAxiosError } from "@app/lib/api";; import { useToast } from "@app/hooks/useToast"; -import { createApiClient } from "@app/api"; +import { createApiClient } from "@app/lib/api"; import { useEnvContext } from "@app/hooks/useEnvContext"; import { ArrayElement } from "@server/types/ArrayElement"; import { ListAccessTokensResponse } from "@server/routers/accessToken"; diff --git a/src/app/[orgId]/settings/share-links/page.tsx b/src/app/[orgId]/settings/share-links/page.tsx index 4ffe834..6e74afc 100644 --- a/src/app/[orgId]/settings/share-links/page.tsx +++ b/src/app/[orgId]/settings/share-links/page.tsx @@ -1,5 +1,5 @@ -import { internal } from "@app/api"; -import { authCookieHeader } from "@app/api/cookies"; +import { internal } from "@app/lib/api"; +import { authCookieHeader } from "@app/lib/api/cookies"; import { AxiosResponse } from "axios"; import SettingsSectionTitle from "@app/components/SettingsSectionTitle"; import { redirect } from "next/navigation"; @@ -7,7 +7,7 @@ import { cache } from "react"; import { GetOrgResponse } from "@server/routers/org"; import OrgProvider from "@app/providers/OrgProvider"; import { ListAccessTokensResponse } from "@server/routers/accessToken"; -import ShareLinksTable, { ShareLinkRow } from "./components/ShareLinksTable"; +import ShareLinksTable, { ShareLinkRow } from "./ShareLinksTable"; type ShareLinksPageProps = { params: Promise<{ orgId: string }>; diff --git a/src/app/[orgId]/settings/sites/components/CreateSiteForm.tsx b/src/app/[orgId]/settings/sites/CreateSiteForm.tsx similarity index 98% rename from src/app/[orgId]/settings/sites/components/CreateSiteForm.tsx rename to src/app/[orgId]/settings/sites/CreateSiteForm.tsx index f8957b6..c4f62a2 100644 --- a/src/app/[orgId]/settings/sites/components/CreateSiteForm.tsx +++ b/src/app/[orgId]/settings/sites/CreateSiteForm.tsx @@ -21,7 +21,7 @@ import { CreateSiteResponse, PickSiteDefaultsResponse } from "@server/routers/site"; -import { generateKeypair } from "../[niceId]/components/wireguardConfig"; +import { generateKeypair } from "./[niceId]/wireguardConfig"; import CopyTextBox from "@app/components/CopyTextBox"; import { Checkbox } from "@app/components/ui/checkbox"; import { @@ -31,8 +31,8 @@ import { SelectTrigger, SelectValue } from "@app/components/ui/select"; -import { formatAxiosError } from "@app/lib/utils"; -import { createApiClient } from "@app/api"; +import { formatAxiosError } from "@app/lib/api"; +import { createApiClient } from "@app/lib/api"; import { useEnvContext } from "@app/hooks/useEnvContext"; import { SiteRow } from "./SitesTable"; import { AxiosResponse } from "axios"; diff --git a/src/app/[orgId]/settings/sites/components/CreateSiteModal.tsx b/src/app/[orgId]/settings/sites/CreateSiteModal.tsx similarity index 100% rename from src/app/[orgId]/settings/sites/components/CreateSiteModal.tsx rename to src/app/[orgId]/settings/sites/CreateSiteModal.tsx diff --git a/src/app/[orgId]/settings/sites/components/SitesDataTable.tsx b/src/app/[orgId]/settings/sites/SitesDataTable.tsx similarity index 98% rename from src/app/[orgId]/settings/sites/components/SitesDataTable.tsx rename to src/app/[orgId]/settings/sites/SitesDataTable.tsx index c538e3b..bef72bf 100644 --- a/src/app/[orgId]/settings/sites/components/SitesDataTable.tsx +++ b/src/app/[orgId]/settings/sites/SitesDataTable.tsx @@ -23,7 +23,7 @@ import { import { Button } from "@app/components/ui/button"; import { useState } from "react"; import { Input } from "@app/components/ui/input"; -import { DataTablePagination } from "../../../../../components/DataTablePagination"; +import { DataTablePagination } from "@app/components/DataTablePagination"; import { Plus, Search } from "lucide-react"; interface DataTableProps { diff --git a/src/app/[orgId]/settings/sites/components/SitesTable.tsx b/src/app/[orgId]/settings/sites/SitesTable.tsx similarity index 99% rename from src/app/[orgId]/settings/sites/components/SitesTable.tsx rename to src/app/[orgId]/settings/sites/SitesTable.tsx index b580238..7f43164 100644 --- a/src/app/[orgId]/settings/sites/components/SitesTable.tsx +++ b/src/app/[orgId]/settings/sites/SitesTable.tsx @@ -23,8 +23,8 @@ import { useState } from "react"; import CreateSiteForm from "./CreateSiteForm"; import ConfirmDeleteDialog from "@app/components/ConfirmDeleteDialog"; import { useToast } from "@app/hooks/useToast"; -import { formatAxiosError } from "@app/lib/utils"; -import { createApiClient } from "@app/api"; +import { formatAxiosError } from "@app/lib/api";; +import { createApiClient } from "@app/lib/api"; import { useEnvContext } from "@app/hooks/useEnvContext"; import CreateSiteFormModal from "./CreateSiteModal"; diff --git a/src/app/[orgId]/settings/sites/[niceId]/components/SiteInfoCard.tsx b/src/app/[orgId]/settings/sites/[niceId]/SiteInfoCard.tsx similarity index 100% rename from src/app/[orgId]/settings/sites/[niceId]/components/SiteInfoCard.tsx rename to src/app/[orgId]/settings/sites/[niceId]/SiteInfoCard.tsx diff --git a/src/app/[orgId]/settings/sites/[niceId]/general/page.tsx b/src/app/[orgId]/settings/sites/[niceId]/general/page.tsx index 69c9d58..63b5dcd 100644 --- a/src/app/[orgId]/settings/sites/[niceId]/general/page.tsx +++ b/src/app/[orgId]/settings/sites/[niceId]/general/page.tsx @@ -18,8 +18,8 @@ import { useForm } from "react-hook-form"; import { useToast } from "@app/hooks/useToast"; import { useRouter } from "next/navigation"; import SettingsSectionTitle from "@app/components/SettingsSectionTitle"; -import { formatAxiosError } from "@app/lib/utils"; -import { createApiClient } from "@app/api"; +import { formatAxiosError } from "@app/lib/api";; +import { createApiClient } from "@app/lib/api"; import { useEnvContext } from "@app/hooks/useEnvContext"; const GeneralFormSchema = z.object({ diff --git a/src/app/[orgId]/settings/sites/[niceId]/layout.tsx b/src/app/[orgId]/settings/sites/[niceId]/layout.tsx index 4da189d..7b0fa46 100644 --- a/src/app/[orgId]/settings/sites/[niceId]/layout.tsx +++ b/src/app/[orgId]/settings/sites/[niceId]/layout.tsx @@ -1,9 +1,9 @@ import SiteProvider from "@app/providers/SiteProvider"; -import { internal } from "@app/api"; +import { internal } from "@app/lib/api"; import { GetSiteResponse } from "@server/routers/site"; import { AxiosResponse } from "axios"; import { redirect } from "next/navigation"; -import { authCookieHeader } from "@app/api/cookies"; +import { authCookieHeader } from "@app/lib/api/cookies"; import { SidebarSettings } from "@app/components/SidebarSettings"; import Link from "next/link"; import { ArrowLeft } from "lucide-react"; @@ -15,7 +15,7 @@ import { BreadcrumbPage, BreadcrumbSeparator } from "@app/components/ui/breadcrumb"; -import SiteInfoCard from "./components/SiteInfoCard"; +import SiteInfoCard from "./SiteInfoCard"; interface SettingsLayoutProps { children: React.ReactNode; diff --git a/src/app/[orgId]/settings/sites/[niceId]/components/wireguardConfig.ts b/src/app/[orgId]/settings/sites/[niceId]/wireguardConfig.ts similarity index 100% rename from src/app/[orgId]/settings/sites/[niceId]/components/wireguardConfig.ts rename to src/app/[orgId]/settings/sites/[niceId]/wireguardConfig.ts diff --git a/src/app/[orgId]/settings/sites/page.tsx b/src/app/[orgId]/settings/sites/page.tsx index 1957fa7..87aa2ad 100644 --- a/src/app/[orgId]/settings/sites/page.tsx +++ b/src/app/[orgId]/settings/sites/page.tsx @@ -1,8 +1,8 @@ -import { internal } from "@app/api"; -import { authCookieHeader } from "@app/api/cookies"; +import { internal } from "@app/lib/api"; +import { authCookieHeader } from "@app/lib/api/cookies"; import { ListSitesResponse } from "@server/routers/site"; import { AxiosResponse } from "axios"; -import SitesTable, { SiteRow } from "./components/SitesTable"; +import SitesTable, { SiteRow } from "./SitesTable"; import SettingsSectionTitle from "@app/components/SettingsSectionTitle"; type SitesPageProps = { diff --git a/src/app/auth/login/DashboardLoginForm.tsx b/src/app/auth/login/DashboardLoginForm.tsx index 25ee47a..933c32b 100644 --- a/src/app/auth/login/DashboardLoginForm.tsx +++ b/src/app/auth/login/DashboardLoginForm.tsx @@ -7,7 +7,7 @@ import { CardHeader, CardTitle } from "@/components/ui/card"; -import { createApiClient } from "@app/api"; +import { createApiClient } from "@app/lib/api"; import LoginForm from "@app/components/LoginForm"; import { useEnvContext } from "@app/hooks/useEnvContext"; import { useRouter } from "next/navigation"; diff --git a/src/app/auth/reset-password/ResetPasswordForm.tsx b/src/app/auth/reset-password/ResetPasswordForm.tsx index b780d75..8cf97f7 100644 --- a/src/app/auth/reset-password/ResetPasswordForm.tsx +++ b/src/app/auth/reset-password/ResetPasswordForm.tsx @@ -25,14 +25,12 @@ import { Input } from "@/components/ui/input"; import { InputOTP, InputOTPGroup, - InputOTPSeparator, InputOTPSlot } from "@/components/ui/input-otp"; import { AxiosResponse } from "axios"; import { RequestPasswordResetBody, RequestPasswordResetResponse, - resetPasswordBody, ResetPasswordBody, ResetPasswordResponse } from "@server/routers/auth"; @@ -40,12 +38,11 @@ import { Loader2 } from "lucide-react"; import { Alert, AlertDescription } from "../../../components/ui/alert"; import { useToast } from "@app/hooks/useToast"; import { useRouter } from "next/navigation"; -import { formatAxiosError } from "@app/lib/utils"; -import { createApiClient } from "@app/api"; +import { formatAxiosError } from "@app/lib/api";; +import { createApiClient } from "@app/lib/api"; import { useEnvContext } from "@app/hooks/useEnvContext"; -import { passwordSchema } from "@server/auth/passwordSchema"; -import { get } from "http"; import { REGEXP_ONLY_DIGITS_AND_CHARS } from "input-otp"; +import { passwordSchema } from "@server/auth/passwordSchema"; const requestSchema = z.object({ email: z.string().email() diff --git a/src/app/auth/resource/[resourceId]/components/AccessToken.tsx b/src/app/auth/resource/[resourceId]/AccessToken.tsx similarity index 97% rename from src/app/auth/resource/[resourceId]/components/AccessToken.tsx rename to src/app/auth/resource/[resourceId]/AccessToken.tsx index d4e35ea..5098cca 100644 --- a/src/app/auth/resource/[resourceId]/components/AccessToken.tsx +++ b/src/app/auth/resource/[resourceId]/AccessToken.tsx @@ -1,6 +1,6 @@ "use client"; -import { createApiClient } from "@app/api"; +import { createApiClient } from "@app/lib/api"; import { Button } from "@app/components/ui/button"; import { Card, diff --git a/src/app/auth/resource/[resourceId]/components/ResourceAccessDenied.tsx b/src/app/auth/resource/[resourceId]/ResourceAccessDenied.tsx similarity index 100% rename from src/app/auth/resource/[resourceId]/components/ResourceAccessDenied.tsx rename to src/app/auth/resource/[resourceId]/ResourceAccessDenied.tsx diff --git a/src/app/auth/resource/[resourceId]/components/ResourceAuthPortal.tsx b/src/app/auth/resource/[resourceId]/ResourceAuthPortal.tsx similarity index 99% rename from src/app/auth/resource/[resourceId]/components/ResourceAuthPortal.tsx rename to src/app/auth/resource/[resourceId]/ResourceAuthPortal.tsx index 6b2b04d..2cb6dcd 100644 --- a/src/app/auth/resource/[resourceId]/components/ResourceAuthPortal.tsx +++ b/src/app/auth/resource/[resourceId]/ResourceAuthPortal.tsx @@ -42,13 +42,13 @@ import { } from "@app/components/ui/input-otp"; import { useRouter } from "next/navigation"; import { Alert, AlertDescription } from "@app/components/ui/alert"; -import { formatAxiosError } from "@app/lib/utils"; +import { formatAxiosError } from "@app/lib/api";; import { AxiosResponse } from "axios"; import LoginForm from "@app/components/LoginForm"; import { AuthWithPasswordResponse, AuthWithAccessTokenResponse, AuthWithWhitelistResponse } from "@server/routers/resource"; import { redirect } from "next/dist/server/api-utils"; import ResourceAccessDenied from "./ResourceAccessDenied"; -import { createApiClient } from "@app/api"; +import { createApiClient } from "@app/lib/api"; import { useEnvContext } from "@app/hooks/useEnvContext"; import { useToast } from "@app/hooks/useToast"; diff --git a/src/app/auth/resource/[resourceId]/components/ResourceNotFound.tsx b/src/app/auth/resource/[resourceId]/ResourceNotFound.tsx similarity index 100% rename from src/app/auth/resource/[resourceId]/components/ResourceNotFound.tsx rename to src/app/auth/resource/[resourceId]/ResourceNotFound.tsx diff --git a/src/app/auth/resource/[resourceId]/page.tsx b/src/app/auth/resource/[resourceId]/page.tsx index 4365de8..79d57b8 100644 --- a/src/app/auth/resource/[resourceId]/page.tsx +++ b/src/app/auth/resource/[resourceId]/page.tsx @@ -3,19 +3,19 @@ import { GetResourceAuthInfoResponse, GetResourceResponse } from "@server/routers/resource"; -import ResourceAuthPortal from "./components/ResourceAuthPortal"; -import { internal, priv } from "@app/api"; +import ResourceAuthPortal from "./ResourceAuthPortal"; +import { internal, priv } from "@app/lib/api"; import { AxiosResponse } from "axios"; -import { authCookieHeader } from "@app/api/cookies"; +import { authCookieHeader } from "@app/lib/api/cookies"; import { cache } from "react"; import { verifySession } from "@app/lib/auth/verifySession"; import { redirect } from "next/navigation"; -import ResourceNotFound from "./components/ResourceNotFound"; -import ResourceAccessDenied from "./components/ResourceAccessDenied"; +import ResourceNotFound from "./ResourceNotFound"; +import ResourceAccessDenied from "./ResourceAccessDenied"; import { cookies } from "next/headers"; import { CheckResourceSessionResponse } from "@server/routers/auth"; -import AccessTokenInvalid from "./components/AccessToken"; -import AccessToken from "./components/AccessToken"; +import AccessTokenInvalid from "./AccessToken"; +import AccessToken from "./AccessToken"; export default async function ResourceAuthPage(props: { params: Promise<{ resourceId: number }>; diff --git a/src/app/auth/signup/SignupForm.tsx b/src/app/auth/signup/SignupForm.tsx index d219477..ae503dd 100644 --- a/src/app/auth/signup/SignupForm.tsx +++ b/src/app/auth/signup/SignupForm.tsx @@ -26,8 +26,8 @@ import { SignUpResponse } from "@server/routers/auth"; import { useRouter } from "next/navigation"; import { passwordSchema } from "@server/auth/passwordSchema"; import { AxiosResponse } from "axios"; -import { formatAxiosError } from "@app/lib/utils"; -import { createApiClient } from "@app/api"; +import { formatAxiosError } from "@app/lib/api";; +import { createApiClient } from "@app/lib/api"; import { useEnvContext } from "@app/hooks/useEnvContext"; type SignupFormProps = { diff --git a/src/app/auth/verify-email/VerifyEmailForm.tsx b/src/app/auth/verify-email/VerifyEmailForm.tsx index 598a273..7a6bc08 100644 --- a/src/app/auth/verify-email/VerifyEmailForm.tsx +++ b/src/app/auth/verify-email/VerifyEmailForm.tsx @@ -33,8 +33,8 @@ import { Loader2 } from "lucide-react"; import { Alert, AlertDescription } from "../../../components/ui/alert"; import { useToast } from "@app/hooks/useToast"; import { useRouter } from "next/navigation"; -import { formatAxiosError } from "@app/lib/utils"; -import { createApiClient } from "@app/api"; +import { formatAxiosError } from "@app/lib/api";; +import { createApiClient } from "@app/lib/api"; import { useEnvContext } from "@app/hooks/useEnvContext"; const FormSchema = z.object({ diff --git a/src/app/invite/InviteStatusCard.tsx b/src/app/invite/InviteStatusCard.tsx index aa9bbb3..235a735 100644 --- a/src/app/invite/InviteStatusCard.tsx +++ b/src/app/invite/InviteStatusCard.tsx @@ -1,6 +1,6 @@ "use client"; -import { createApiClient } from "@app/api"; +import { createApiClient } from "@app/lib/api"; import { Button } from "@app/components/ui/button"; import { Card, diff --git a/src/app/invite/page.tsx b/src/app/invite/page.tsx index 03f04bd..009fe79 100644 --- a/src/app/invite/page.tsx +++ b/src/app/invite/page.tsx @@ -1,11 +1,11 @@ -import { internal } from "@app/api"; -import { authCookieHeader } from "@app/api/cookies"; +import { internal } from "@app/lib/api"; +import { authCookieHeader } from "@app/lib/api/cookies"; import { verifySession } from "@app/lib/auth/verifySession"; import { AcceptInviteResponse } from "@server/routers/user"; import { AxiosResponse } from "axios"; import { redirect } from "next/navigation"; import InviteStatusCard from "./InviteStatusCard"; -import { formatAxiosError } from "@app/lib/utils"; +import { formatAxiosError } from "@app/lib/api";; export default async function InvitePage(props: { searchParams: Promise<{ [key: string]: string | string[] | undefined }>; diff --git a/src/app/page.tsx b/src/app/page.tsx index a8afc21..31a9b75 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,5 +1,5 @@ -import { internal } from "@app/api"; -import { authCookieHeader } from "@app/api/cookies"; +import { internal } from "@app/lib/api"; +import { authCookieHeader } from "@app/lib/api/cookies"; import ProfileIcon from "@app/components/ProfileIcon"; import { verifySession } from "@app/lib/auth/verifySession"; import UserProvider from "@app/providers/UserProvider"; diff --git a/src/app/setup/page.tsx b/src/app/setup/page.tsx index 4f2422b..318ceed 100644 --- a/src/app/setup/page.tsx +++ b/src/app/setup/page.tsx @@ -14,8 +14,8 @@ import { CardTitle } from "@app/components/ui/card"; import CopyTextBox from "@app/components/CopyTextBox"; -import { formatAxiosError } from "@app/lib/utils"; -import { createApiClient } from "@app/api"; +import { formatAxiosError } from "@app/lib/api";; +import { createApiClient } from "@app/lib/api"; import { useEnvContext } from "@app/hooks/useEnvContext"; import { Separator } from "@/components/ui/separator"; import { z } from "zod"; @@ -32,7 +32,7 @@ import { FormMessage } from "@app/components/ui/form"; import { Alert, AlertDescription } from "@app/components/ui/alert"; -import CreateSiteForm from "../[orgId]/settings/sites/components/CreateSiteForm"; +import CreateSiteForm from "../[orgId]/settings/sites/CreateSiteForm"; type Step = "org" | "site" | "resources"; diff --git a/src/components/ConfirmDeleteDialog.tsx b/src/components/ConfirmDeleteDialog.tsx index 8ce6b18..c79899b 100644 --- a/src/components/ConfirmDeleteDialog.tsx +++ b/src/components/ConfirmDeleteDialog.tsx @@ -41,7 +41,7 @@ import { } from "@app/components/Credenza"; import { useOrgContext } from "@app/hooks/useOrgContext"; import { Description } from "@radix-ui/react-toast"; -import { createApiClient } from "@app/api"; +import { createApiClient } from "@app/lib/api"; import { useEnvContext } from "@app/hooks/useEnvContext"; type InviteUserFormProps = { diff --git a/src/components/Credenza.tsx b/src/components/Credenza.tsx index e286b97..133e940 100644 --- a/src/components/Credenza.tsx +++ b/src/components/Credenza.tsx @@ -2,7 +2,7 @@ import * as React from "react"; -import { cn } from "@/lib/utils"; +import { cn } from "@app/lib/cn"; import { useMediaQuery } from "@app/hooks/useMediaQuery"; import { Dialog, diff --git a/src/components/Disable2FaForm.tsx b/src/components/Disable2FaForm.tsx index 68e51a6..cf36d95 100644 --- a/src/components/Disable2FaForm.tsx +++ b/src/components/Disable2FaForm.tsx @@ -3,7 +3,7 @@ import { useState } from "react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; -import { createApiClient } from "@app/api"; +import { createApiClient } from "@app/lib/api"; import { useEnvContext } from "@app/hooks/useEnvContext"; import { AxiosResponse } from "axios"; import { Disable2faBody, Disable2faResponse } from "@server/routers/auth"; @@ -29,7 +29,7 @@ import { CredenzaTitle } from "@app/components/Credenza"; import { useToast } from "@app/hooks/useToast"; -import { formatAxiosError } from "@app/lib/utils"; +import { formatAxiosError } from "@app/lib/api";; import { useUserContext } from "@app/hooks/useUserContext"; import { InputOTP, InputOTPGroup, InputOTPSlot } from "./ui/input-otp"; import { REGEXP_ONLY_DIGITS_AND_CHARS } from "input-otp"; diff --git a/src/components/Enable2FaForm.tsx b/src/components/Enable2FaForm.tsx index 4e1caf1..640416c 100644 --- a/src/components/Enable2FaForm.tsx +++ b/src/components/Enable2FaForm.tsx @@ -5,7 +5,7 @@ import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { AlertCircle, CheckCircle2 } from "lucide-react"; -import { createApiClient } from "@app/api"; +import { createApiClient } from "@app/lib/api"; import { useEnvContext } from "@app/hooks/useEnvContext"; import { AxiosResponse } from "axios"; import { @@ -36,7 +36,7 @@ import { CredenzaTitle } from "@app/components/Credenza"; import { useToast } from "@app/hooks/useToast"; -import { formatAxiosError } from "@app/lib/utils"; +import { formatAxiosError } from "@app/lib/api";; import CopyTextBox from "@app/components/CopyTextBox"; import { QRCodeCanvas, QRCodeSVG } from "qrcode.react"; import { useUserContext } from "@app/hooks/useUserContext"; diff --git a/src/components/Header.tsx b/src/components/Header.tsx index e05b9c1..8b06de9 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -16,7 +16,7 @@ import { PopoverTrigger } from "@app/components/ui/popover"; import { useEnvContext } from "@app/hooks/useEnvContext"; -import { cn } from "@app/lib/utils"; +import { cn } from "@app/lib/cn"; import { ListOrgsResponse } from "@server/routers/org"; import { Check, ChevronsUpDown, Plus } from "lucide-react"; import Link from "next/link"; diff --git a/src/components/LoginForm.tsx b/src/components/LoginForm.tsx index 90567bd..35f291b 100644 --- a/src/components/LoginForm.tsx +++ b/src/components/LoginForm.tsx @@ -25,9 +25,9 @@ import { Alert, AlertDescription } from "@/components/ui/alert"; import { LoginResponse } from "@server/routers/auth"; import { useRouter } from "next/navigation"; import { AxiosResponse } from "axios"; -import { formatAxiosError } from "@app/lib/utils"; +import { formatAxiosError } from "@app/lib/api";; import { LockIcon } from "lucide-react"; -import { createApiClient } from "@app/api"; +import { createApiClient } from "@app/lib/api"; import { useEnvContext } from "@app/hooks/useEnvContext"; import { InputOTP, diff --git a/src/components/ProfileIcon.tsx b/src/components/ProfileIcon.tsx index 18fdbaf..e2175f7 100644 --- a/src/components/ProfileIcon.tsx +++ b/src/components/ProfileIcon.tsx @@ -1,6 +1,6 @@ "use client"; -import { createApiClient } from "@app/api"; +import { createApiClient } from "@app/lib/api"; import { Avatar, AvatarFallback } from "@app/components/ui/avatar"; import { Button } from "@app/components/ui/button"; import { @@ -13,7 +13,7 @@ import { } from "@app/components/ui/dropdown-menu"; import { useEnvContext } from "@app/hooks/useEnvContext"; import { useToast } from "@app/hooks/useToast"; -import { formatAxiosError } from "@app/lib/utils"; +import { formatAxiosError } from "@app/lib/api";; import { Laptop, LogOut, Moon, Sun } from "lucide-react"; import { useTheme } from "next-themes"; import { useRouter } from "next/navigation"; diff --git a/src/components/sidebar-nav.tsx b/src/components/SidebarNav.tsx similarity index 99% rename from src/components/sidebar-nav.tsx rename to src/components/SidebarNav.tsx index 366573d..86ee922 100644 --- a/src/components/sidebar-nav.tsx +++ b/src/components/SidebarNav.tsx @@ -3,7 +3,7 @@ import React, { useEffect } from "react"; import Link from "next/link"; import { useParams, usePathname, useRouter } from "next/navigation"; -import { cn } from "@/lib/utils"; +import { cn } from "@app/lib/cn"; import { buttonVariants } from "@/components/ui/button"; import { Select, diff --git a/src/components/SidebarSettings.tsx b/src/components/SidebarSettings.tsx index 29d4863..6e4ab00 100644 --- a/src/components/SidebarSettings.tsx +++ b/src/components/SidebarSettings.tsx @@ -1,6 +1,6 @@ "use client"; -import { SidebarNav } from "@app/components/sidebar-nav"; +import { SidebarNav } from "@app/components/SidebarNav"; import React from "react"; interface SideBarSettingsProps { @@ -18,7 +18,7 @@ export function SidebarSettings({ children, sidebarNavItems, disabled, - limitWidth, + limitWidth }: SideBarSettingsProps) { return (
diff --git a/src/components/TopbarNav.tsx b/src/components/TopbarNav.tsx index d208e97..4d04cf8 100644 --- a/src/components/TopbarNav.tsx +++ b/src/components/TopbarNav.tsx @@ -3,7 +3,7 @@ import React from "react"; import Link from "next/link"; import { usePathname } from "next/navigation"; -import { cn } from "@/lib/utils"; +import { cn } from "@app/lib/cn"; interface TopbarNavProps extends React.HTMLAttributes { items: { diff --git a/src/components/ui/alert.tsx b/src/components/ui/alert.tsx index 8073779..964257b 100644 --- a/src/components/ui/alert.tsx +++ b/src/components/ui/alert.tsx @@ -1,7 +1,7 @@ import * as React from "react"; import { cva, type VariantProps } from "class-variance-authority"; -import { cn } from "@/lib/utils"; +import { cn } from "@app/lib/cn"; const alertVariants = cva( "relative w-full rounded-lg border p-4 [&>svg~*]:pl-7 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground", diff --git a/src/components/ui/avatar.tsx b/src/components/ui/avatar.tsx index 51e507b..ef6e435 100644 --- a/src/components/ui/avatar.tsx +++ b/src/components/ui/avatar.tsx @@ -3,7 +3,7 @@ import * as React from "react" import * as AvatarPrimitive from "@radix-ui/react-avatar" -import { cn } from "@/lib/utils" +import { cn } from "@app/lib/cn" const Avatar = React.forwardRef< React.ElementRef, diff --git a/src/components/ui/badge.tsx b/src/components/ui/badge.tsx index fb95de0..0c44fda 100644 --- a/src/components/ui/badge.tsx +++ b/src/components/ui/badge.tsx @@ -1,7 +1,7 @@ import * as React from "react"; import { cva, type VariantProps } from "class-variance-authority"; -import { cn } from "@/lib/utils"; +import { cn } from "@app/lib/cn"; const badgeVariants = cva( "inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2", diff --git a/src/components/ui/breadcrumb.tsx b/src/components/ui/breadcrumb.tsx index 60e6c96..dd40aa5 100644 --- a/src/components/ui/breadcrumb.tsx +++ b/src/components/ui/breadcrumb.tsx @@ -2,7 +2,7 @@ import * as React from "react" import { Slot } from "@radix-ui/react-slot" import { ChevronRight, MoreHorizontal } from "lucide-react" -import { cn } from "@/lib/utils" +import { cn } from "@app/lib/cn" const Breadcrumb = React.forwardRef< HTMLElement, diff --git a/src/components/ui/button.tsx b/src/components/ui/button.tsx index f8c71c3..906a572 100644 --- a/src/components/ui/button.tsx +++ b/src/components/ui/button.tsx @@ -2,7 +2,7 @@ import * as React from "react"; import { Slot } from "@radix-ui/react-slot"; import { cva, type VariantProps } from "class-variance-authority"; -import { cn } from "@/lib/utils"; +import { cn } from "@app/lib/cn"; import { Loader2 } from "lucide-react"; const buttonVariants = cva( diff --git a/src/components/ui/card.tsx b/src/components/ui/card.tsx index cadb7f7..e5f1604 100644 --- a/src/components/ui/card.tsx +++ b/src/components/ui/card.tsx @@ -1,6 +1,6 @@ import * as React from "react"; -import { cn } from "@/lib/utils"; +import { cn } from "@app/lib/cn"; const Card = React.forwardRef< HTMLDivElement, diff --git a/src/components/ui/checkbox.tsx b/src/components/ui/checkbox.tsx index df61a13..494269c 100644 --- a/src/components/ui/checkbox.tsx +++ b/src/components/ui/checkbox.tsx @@ -4,7 +4,7 @@ import * as React from "react" import * as CheckboxPrimitive from "@radix-ui/react-checkbox" import { Check } from "lucide-react" -import { cn } from "@/lib/utils" +import { cn } from "@app/lib/cn" const Checkbox = React.forwardRef< React.ElementRef, diff --git a/src/components/ui/command.tsx b/src/components/ui/command.tsx index 190f291..195b2f3 100644 --- a/src/components/ui/command.tsx +++ b/src/components/ui/command.tsx @@ -5,7 +5,7 @@ import { type DialogProps } from "@radix-ui/react-dialog" import { Command as CommandPrimitive } from "cmdk" import { Search } from "lucide-react" -import { cn } from "@/lib/utils" +import { cn } from "@app/lib/cn" import { Dialog, DialogContent } from "@/components/ui/dialog" const Command = React.forwardRef< diff --git a/src/components/ui/dialog.tsx b/src/components/ui/dialog.tsx index 37ddc7f..6eb0a37 100644 --- a/src/components/ui/dialog.tsx +++ b/src/components/ui/dialog.tsx @@ -4,7 +4,7 @@ import * as React from "react"; import * as DialogPrimitive from "@radix-ui/react-dialog"; import { X } from "lucide-react"; -import { cn } from "@/lib/utils"; +import { cn } from "@app/lib/cn"; const Dialog = DialogPrimitive.Root; diff --git a/src/components/ui/drawer.tsx b/src/components/ui/drawer.tsx index 1df3dbd..d050006 100644 --- a/src/components/ui/drawer.tsx +++ b/src/components/ui/drawer.tsx @@ -3,7 +3,7 @@ import * as React from "react"; import { Drawer as DrawerPrimitive } from "vaul"; -import { cn } from "@/lib/utils"; +import { cn } from "@app/lib/cn"; const Drawer = ({ shouldScaleBackground = true, diff --git a/src/components/ui/dropdown-menu.tsx b/src/components/ui/dropdown-menu.tsx index 3b24cee..8d2f4c3 100644 --- a/src/components/ui/dropdown-menu.tsx +++ b/src/components/ui/dropdown-menu.tsx @@ -4,7 +4,7 @@ import * as React from "react" import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu" import { Check, ChevronRight, Circle } from "lucide-react" -import { cn } from "@/lib/utils" +import { cn } from "@app/lib/cn" const DropdownMenu = DropdownMenuPrimitive.Root diff --git a/src/components/ui/form.tsx b/src/components/ui/form.tsx index 25b9ea1..61796ef 100644 --- a/src/components/ui/form.tsx +++ b/src/components/ui/form.tsx @@ -12,7 +12,7 @@ import { useFormContext, } from "react-hook-form" -import { cn } from "@/lib/utils" +import { cn } from "@app/lib/cn" import { Label } from "@/components/ui/label" const Form = FormProvider diff --git a/src/components/ui/input-otp.tsx b/src/components/ui/input-otp.tsx index 00994bd..f13ce8a 100644 --- a/src/components/ui/input-otp.tsx +++ b/src/components/ui/input-otp.tsx @@ -4,7 +4,7 @@ import * as React from "react" import { OTPInput, OTPInputContext } from "input-otp" import { Dot } from "lucide-react" -import { cn } from "@/lib/utils" +import { cn } from "@app/lib/cn" const InputOTP = React.forwardRef< React.ElementRef, diff --git a/src/components/ui/input.tsx b/src/components/ui/input.tsx index ccbba59..db9ec24 100644 --- a/src/components/ui/input.tsx +++ b/src/components/ui/input.tsx @@ -1,6 +1,6 @@ import * as React from "react"; -import { cn } from "@/lib/utils"; +import { cn } from "@app/lib/cn"; import { EyeOff, Eye } from "lucide-react"; export type InputProps = React.InputHTMLAttributes; diff --git a/src/components/ui/label.tsx b/src/components/ui/label.tsx index fa5143e..0c85b64 100644 --- a/src/components/ui/label.tsx +++ b/src/components/ui/label.tsx @@ -4,7 +4,7 @@ import * as React from "react" import * as LabelPrimitive from "@radix-ui/react-label" import { cva, type VariantProps } from "class-variance-authority" -import { cn } from "@/lib/utils" +import { cn } from "@app/lib/cn" const labelVariants = cva( "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70" diff --git a/src/components/ui/popover.tsx b/src/components/ui/popover.tsx index a0ec48b..4867037 100644 --- a/src/components/ui/popover.tsx +++ b/src/components/ui/popover.tsx @@ -3,7 +3,7 @@ import * as React from "react" import * as PopoverPrimitive from "@radix-ui/react-popover" -import { cn } from "@/lib/utils" +import { cn } from "@app/lib/cn" const Popover = PopoverPrimitive.Root diff --git a/src/components/ui/radio-group.tsx b/src/components/ui/radio-group.tsx index e9bde17..f0bf50a 100644 --- a/src/components/ui/radio-group.tsx +++ b/src/components/ui/radio-group.tsx @@ -4,7 +4,7 @@ import * as React from "react" import * as RadioGroupPrimitive from "@radix-ui/react-radio-group" import { Circle } from "lucide-react" -import { cn } from "@/lib/utils" +import { cn } from "@app/lib/cn" const RadioGroup = React.forwardRef< React.ElementRef, diff --git a/src/components/ui/select.tsx b/src/components/ui/select.tsx index b7a08c2..e9fa0c8 100644 --- a/src/components/ui/select.tsx +++ b/src/components/ui/select.tsx @@ -4,7 +4,7 @@ import * as React from "react" import * as SelectPrimitive from "@radix-ui/react-select" import { Check, ChevronDown, ChevronUp } from "lucide-react" -import { cn } from "@/lib/utils" +import { cn } from "@app/lib/cn" const Select = SelectPrimitive.Root diff --git a/src/components/ui/separator.tsx b/src/components/ui/separator.tsx index 12d81c4..c59cac0 100644 --- a/src/components/ui/separator.tsx +++ b/src/components/ui/separator.tsx @@ -3,7 +3,7 @@ import * as React from "react" import * as SeparatorPrimitive from "@radix-ui/react-separator" -import { cn } from "@/lib/utils" +import { cn } from "@app/lib/cn" const Separator = React.forwardRef< React.ElementRef, diff --git a/src/components/ui/sheet.tsx b/src/components/ui/sheet.tsx index 3f10980..9841824 100644 --- a/src/components/ui/sheet.tsx +++ b/src/components/ui/sheet.tsx @@ -5,7 +5,7 @@ import * as SheetPrimitive from "@radix-ui/react-dialog" import { cva, type VariantProps } from "class-variance-authority" import { X } from "lucide-react" -import { cn } from "@/lib/utils" +import { cn } from "@app/lib/cn" const Sheet = SheetPrimitive.Root diff --git a/src/components/ui/switch.tsx b/src/components/ui/switch.tsx index bc69cf2..92f9a4f 100644 --- a/src/components/ui/switch.tsx +++ b/src/components/ui/switch.tsx @@ -3,7 +3,7 @@ import * as React from "react" import * as SwitchPrimitives from "@radix-ui/react-switch" -import { cn } from "@/lib/utils" +import { cn } from "@app/lib/cn" const Switch = React.forwardRef< React.ElementRef, diff --git a/src/components/ui/table.tsx b/src/components/ui/table.tsx index ab9c94c..4d76689 100644 --- a/src/components/ui/table.tsx +++ b/src/components/ui/table.tsx @@ -1,6 +1,6 @@ import * as React from "react" -import { cn } from "@/lib/utils" +import { cn } from "@app/lib/cn" const Table = React.forwardRef< HTMLTableElement, diff --git a/src/components/ui/tabs.tsx b/src/components/ui/tabs.tsx index 7316862..aa76c09 100644 --- a/src/components/ui/tabs.tsx +++ b/src/components/ui/tabs.tsx @@ -3,7 +3,7 @@ import * as React from "react" import * as TabsPrimitive from "@radix-ui/react-tabs" -import { cn } from "@/lib/utils" +import { cn } from "@app/lib/cn" const Tabs = TabsPrimitive.Root diff --git a/src/components/ui/textarea.tsx b/src/components/ui/textarea.tsx index 9f9a6dc..625d181 100644 --- a/src/components/ui/textarea.tsx +++ b/src/components/ui/textarea.tsx @@ -1,6 +1,6 @@ import * as React from "react" -import { cn } from "@/lib/utils" +import { cn } from "@app/lib/cn" export interface TextareaProps extends React.TextareaHTMLAttributes {} diff --git a/src/components/ui/toast.tsx b/src/components/ui/toast.tsx index bcafdad..c4c5d48 100644 --- a/src/components/ui/toast.tsx +++ b/src/components/ui/toast.tsx @@ -5,7 +5,7 @@ import * as ToastPrimitives from "@radix-ui/react-toast" import { cva, type VariantProps } from "class-variance-authority" import { X } from "lucide-react" -import { cn } from "@/lib/utils" +import { cn } from "@app/lib/cn" const ToastProvider = ToastPrimitives.Provider diff --git a/src/api/cookies.ts b/src/lib/api/cookies.ts similarity index 100% rename from src/api/cookies.ts rename to src/lib/api/cookies.ts diff --git a/src/lib/utils.ts b/src/lib/api/formatAxiosError.ts similarity index 56% rename from src/lib/utils.ts rename to src/lib/api/formatAxiosError.ts index 3a5000e..42d2cc5 100644 --- a/src/lib/utils.ts +++ b/src/lib/api/formatAxiosError.ts @@ -1,10 +1,3 @@ -import { clsx, type ClassValue } from "clsx"; -import { twMerge } from "tailwind-merge"; - -export function cn(...inputs: ClassValue[]) { - return twMerge(clsx(inputs)); -} - export function formatAxiosError(error: any, defaultMessage?: string): string { return ( error.response?.data?.message || diff --git a/src/api/index.ts b/src/lib/api/index.ts similarity index 97% rename from src/api/index.ts rename to src/lib/api/index.ts index d9ac4bd..646df7c 100644 --- a/src/api/index.ts +++ b/src/lib/api/index.ts @@ -58,3 +58,6 @@ export const priv = axios.create({ "Content-Type": "application/json" } }); + +export * from "./formatAxiosError"; + diff --git a/src/lib/auth/verifySession.ts b/src/lib/auth/verifySession.ts index d12c81f..2d282d0 100644 --- a/src/lib/auth/verifySession.ts +++ b/src/lib/auth/verifySession.ts @@ -1,5 +1,5 @@ -import { internal } from "@app/api"; -import { authCookieHeader } from "@app/api/cookies"; +import { internal } from "@app/lib/api"; +import { authCookieHeader } from "@app/lib/api/cookies"; import { GetUserResponse } from "@server/routers/user"; import { AxiosResponse } from "axios"; diff --git a/src/lib/cn.ts b/src/lib/cn.ts new file mode 100644 index 0000000..e6a8be0 --- /dev/null +++ b/src/lib/cn.ts @@ -0,0 +1,6 @@ +import { clsx, type ClassValue } from "clsx"; +import { twMerge } from "tailwind-merge"; + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +}