commit ff4c9da44d828f96d1e51077cb15680df494f92c Author: sulthan Date: Mon Jun 22 22:17:16 2026 +0700 initial commit diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..a4face5 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,9 @@ +node_modules +.git +tmp +stderr.log +*.sql +.DS_Store +.gitignore +.htaccess +.well-known diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0973f9d --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +node_modules/ +.env +stderr.log +tmp/ +public/images/ +humicpro_intellisight.sql +.htaccess diff --git a/.htaccess b/.htaccess new file mode 100644 index 0000000..d6f1b96 --- /dev/null +++ b/.htaccess @@ -0,0 +1,19 @@ +# DO NOT REMOVE. CLOUDLINUX PASSENGER CONFIGURATION BEGIN +PassengerAppRoot "/home/humicpro/public_html/intellisight-api.humicprototyping.com" +PassengerBaseURI "/" +PassengerNodejs "/home/humicpro/nodevenv/public_html/intellisight-api.humicprototyping.com/20/bin/node" +PassengerAppType node +PassengerStartupFile index.js +# DO NOT REMOVE. CLOUDLINUX PASSENGER CONFIGURATION END +# DO NOT REMOVE OR MODIFY. CLOUDLINUX ENV VARS CONFIGURATION BEGIN + +SetEnv DB_HOST localhost +SetEnv DB_NAME humicpro_intellisight +SetEnv DB_USER humicpro_intellisight +SetEnv ACCESS_TOKEN_SECRET F22dm6BOm2p23XlmHbmS9Fc843U5V8s9mmsAFC83xQOQbKLcoPYF1sMDaM80ztaR8 +SetEnv REFRESH_TOKEN_SECRET Lm6t2mHQ1sYHTSKjx8lToTSvzoHpRQ3EcFxDAouWR387UzYV4BsT0C38QihptOhYi +SetEnv ACCESS_TOKEN_EXP 60m +SetEnv REFRESH_TOKEN_EXP 1d +SetEnv DB_PASS humicpro_intellisight + +# DO NOT REMOVE OR MODIFY. CLOUDLINUX ENV VARS CONFIGURATION END \ No newline at end of file diff --git a/docker/.env.example b/docker/.env.example new file mode 100644 index 0000000..daa0a12 --- /dev/null +++ b/docker/.env.example @@ -0,0 +1,15 @@ +PORT=4000 +NODE_ENV=production + +DB_HOST=db +DB_NAME=intellisight +DB_USER=intellisight +DB_PASS=change-me +DB_ROOT_PASS=change-me + +ACCESS_TOKEN_SECRET=generate-a-random-secret +REFRESH_TOKEN_SECRET=generate-a-random-secret +ACCESS_TOKEN_EXP=60m +REFRESH_TOKEN_EXP=1d + +CORS_ORIGIN=https://your-frontend-domain.com diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 0000000..f5ab64b --- /dev/null +++ b/docker/Dockerfile @@ -0,0 +1,29 @@ +FROM node:20-alpine AS deps +WORKDIR /app +COPY package*.json ./ +RUN npm ci --omit=dev + +FROM node:20-alpine AS runner +WORKDIR /app +ENV NODE_ENV=production + +RUN addgroup --system --gid 1001 nodejs && \ + adduser --system --uid 1001 express + +COPY --from=deps /app/node_modules ./node_modules +COPY . . + +RUN mkdir -p public/images && chown -R express:nodejs /app + +COPY docker/seed/ /app/seed/ +COPY docker/entrypoint.sh /app/entrypoint.sh +RUN chmod +x /app/entrypoint.sh + +USER express +EXPOSE 4000 + +HEALTHCHECK --interval=30s --timeout=5s --start-period=15s --retries=3 \ + CMD wget --no-verbose --tries=1 --spider http://localhost:4000/auth/me || exit 1 + +ENTRYPOINT ["/app/entrypoint.sh"] +CMD ["node", "index.js"] diff --git a/docker/Dockerfile.db b/docker/Dockerfile.db new file mode 100644 index 0000000..3d1b9b8 --- /dev/null +++ b/docker/Dockerfile.db @@ -0,0 +1,2 @@ +FROM mysql:8.0 +COPY init.sql /docker-entrypoint-initdb.d/ diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml new file mode 100644 index 0000000..e8e0f3f --- /dev/null +++ b/docker/docker-compose.yml @@ -0,0 +1,37 @@ +services: + app: + build: + context: .. + dockerfile: docker/Dockerfile + container_name: intellisight-api + ports: + - "4000:4000" + volumes: + - uploads:/app/public/images + depends_on: + db: + condition: service_healthy + restart: unless-stopped + + db: + build: + context: . + dockerfile: Dockerfile.db + container_name: intellisight-db + environment: + MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASS} + MYSQL_DATABASE: ${DB_NAME} + MYSQL_USER: ${DB_USER} + MYSQL_PASSWORD: ${DB_PASS} + volumes: + - mysql_data:/var/lib/mysql + healthcheck: + test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] + interval: 10s + timeout: 5s + retries: 5 + restart: unless-stopped + +volumes: + mysql_data: + uploads: diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh new file mode 100644 index 0000000..aad6778 --- /dev/null +++ b/docker/entrypoint.sh @@ -0,0 +1,21 @@ +#!/bin/sh +set -e + +SEED_MARKER="/app/public/images/.seeded" +SEED_SRC="/app/seed/images" +DEST="/app/public/images" + +if [ ! -f "$SEED_MARKER" ]; then + echo "First run — seeding existing uploads..." + if [ -d "$SEED_SRC" ]; then + cp -r "$SEED_SRC"/* "$DEST/" + echo "Seed complete." + else + echo "No seed directory found — skipping." + fi + touch "$SEED_MARKER" +else + echo "Uploads already seeded — skipping." +fi + +exec "$@" diff --git a/docker/init.sql b/docker/init.sql new file mode 100644 index 0000000..e56a1db --- /dev/null +++ b/docker/init.sql @@ -0,0 +1,106 @@ +/*M!999999\- enable the sandbox mode */ +-- MariaDB dump 10.19 Distrib 10.6.25-MariaDB, for Linux (x86_64) +-- +-- Host: localhost Database: humicpro_intellisight +-- ------------------------------------------------------ +-- Server version 10.6.25-MariaDB + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8mb4 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `examination` +-- + +DROP TABLE IF EXISTS `examination`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8mb4 */; +CREATE TABLE `examination` ( + `examination_id` int(11) NOT NULL AUTO_INCREMENT, + `patient_id` int(11) DEFAULT NULL, + `doctor_id` int(11) DEFAULT NULL, + `examination_date` date NOT NULL, + `eye_pic` varchar(100) NOT NULL, + `complaints` text DEFAULT NULL, + `diagnosis` text NOT NULL, + `doctors_note` text DEFAULT NULL, + `status` enum('ongoing','complete') NOT NULL, + `created_at` datetime NOT NULL, + `updated_at` datetime NOT NULL, + PRIMARY KEY (`examination_id`), + KEY `patient_id` (`patient_id`), + KEY `doctor_id` (`doctor_id`), + CONSTRAINT `examination_ibfk_1` FOREIGN KEY (`patient_id`) REFERENCES `user` (`user_id`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `examination_ibfk_2` FOREIGN KEY (`doctor_id`) REFERENCES `user` (`user_id`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB AUTO_INCREMENT=72 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `examination` +-- + +LOCK TABLES `examination` WRITE; +/*!40000 ALTER TABLE `examination` DISABLE KEYS */; +INSERT INTO `examination` (`examination_id`, `patient_id`, `doctor_id`, `examination_date`, `eye_pic`, `complaints`, `diagnosis`, `doctors_note`, `status`, `created_at`, `updated_at`) VALUES (71,13,46,'2026-04-22','eye-13-1776826301933.jpg','-','Possible cataract','-','ongoing','2026-04-22 09:51:42','2026-04-22 09:51:42'); +/*!40000 ALTER TABLE `examination` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `user` +-- + +DROP TABLE IF EXISTS `user`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8mb4 */; +CREATE TABLE `user` ( + `user_id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(100) NOT NULL, + `email` varchar(100) NOT NULL, + `password` varchar(100) NOT NULL, + `birthdate` date NOT NULL, + `role` enum('pasien','dokter') NOT NULL, + `profile_pic` varchar(100) DEFAULT NULL, + `refresh_token` varchar(255) DEFAULT NULL, + `created_at` datetime NOT NULL, + `updated_at` datetime NOT NULL, + PRIMARY KEY (`user_id`), + UNIQUE KEY `email` (`email`) +) ENGINE=InnoDB AUTO_INCREMENT=47 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `user` +-- + +LOCK TABLES `user` WRITE; +/*!40000 ALTER TABLE `user` DISABLE KEYS */; +INSERT INTO `user` (`user_id`, `name`, `email`, `password`, `birthdate`, `role`, `profile_pic`, `refresh_token`, `created_at`, `updated_at`) VALUES (1,'diaspasienedited','dias@gmail.com','$2b$10$irRKnKGpH9QP5w7Ui2rLje9ftLxACYhlij4bpbdyb80EVUWImxAl2','2001-09-11','pasien','blank-profile-pic.png','eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxLCJyb2xlIjoicGFzaWVuIiwiaWF0IjoxNzQ4NDE2NjExLCJleHAiOjE3NDg1MDMwMTF9.5Jd39_PcL2NYA-eLIeND14P-z4mw-ZyOPNVmFjGOeQw','2025-04-30 15:36:18','2025-05-28 14:16:51'),(3,'Akbar','akbar@gmail.com','$2b$10$R7gdEiN1H4xJDDssSKiK0eNEQnC2rYuspFo8w8MmRZ7MFf9m6Uq06','2004-05-18','pasien','profile-3-1748081062431.jpg','eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjozLCJyb2xlIjoicGFzaWVuIiwiaWF0IjoxNzQ4NTk5NTMwLCJleHAiOjE3NDg2ODU5MzB9.dQK03Bee6vKKdgxq9K-zXG5busTTJzIkCxb6GK0zg08','2025-04-30 19:34:12','2025-05-30 17:05:30'),(4,'diaspasienn','diaspasien@gmail.com','$2b$10$K8K1wnMLzeK9GbSKZWQGPuBgKt4pxsI5N/ny7851bAFK2Jvy/2Cqa','2001-09-11','pasien','blank-profile-pic.png',NULL,'2025-04-30 20:03:12','2025-05-09 22:14:57'),(5,'123456','asd123@gmail.com','$2b$10$83TceXdqwBE5WBHyc0kIl.79y1DnwF5E2CzRi.ez1uChOTmurv8v2','2000-01-01','pasien','profile-5-1746716864232.jpg',NULL,'2025-05-07 12:47:31','2025-05-20 15:28:26'),(7,'rendii','rendi@gmail.com','$2b$10$O/p1Vr38yexbe48d/woBnuuLd4d8cIDzxPGXZWKleNEokzPJQlcBS','2007-05-26','pasien','profile-7-1747223446863.jpg','eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjo3LCJyb2xlIjoicGFzaWVuIiwiaWF0IjoxNzQ3MjIzMzk2LCJleHAiOjE3NDczMDk3OTZ9.7H85B0pyWxzs7nP7g6vK-wNqh4wM0GNaxlsf3XDrAXI','2025-05-14 18:49:40','2025-05-14 18:54:06'),(8,'georgio','geor@gmail.com','$2b$10$7T8VpvmejexrVboXVAFUh.wcul.eFtBKcF/TLzl1U/4Hr5/FXkfJy','2007-05-24','pasien','blank-profile-pic.png',NULL,'2025-05-19 10:37:08','2025-05-23 04:52:18'),(9,'Achmad Rafly Khatami Zain','raflyzainn1@gmail.com','$2b$10$Ke7EX5x2BhFeGG4xGdJF2ePyW4f8XRU3ryhZPpWBv1lFZyn2.xOd.','2005-01-22','pasien','blank-profile-pic.png','eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjo5LCJyb2xlIjoicGFzaWVuIiwiaWF0IjoxNzQ5OTk0MjgxLCJleHAiOjE3NTAwODA2ODF9.Q6LbDG-7pGVeXXpgc9fi4L4YfCbJTTAFCEyN6hnKUO8','2025-05-19 11:41:49','2025-06-15 20:31:21'),(12,'Rivaldo Tandoko','rtrivaldo05@gmail.com','$2b$10$Xl0IU6RYcdFBq/Iw4W9WneBExWD2Wkn65prz0i34GMWo2JAiVF8vu','2025-05-11','pasien','blank-profile-pic.png','eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxMiwicm9sZSI6InBhc2llbiIsImlhdCI6MTc0ODQwNjUxMCwiZXhwIjoxNzQ4NDkyOTEwfQ.BddJSca3puLecgaf3urnL86CivonYE_gMXzsIec-tQU','2025-05-19 13:42:05','2025-05-28 11:28:30'),(13,'HUMIC ENGINEERING','humicengineering@gmail.com','$2b$10$3hK31MkWirwBMMmskV6/6eWJoUUNuSUn2fZ/X.p88IAmMIWtdio02','2003-06-24','pasien','blank-profile-pic.png','eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxMywicm9sZSI6InBhc2llbiIsImlhdCI6MTc3ODQ4MzAxMSwiZXhwIjoxNzc4NTY5NDExfQ.a7Jq3qDaQr-Z7g5W7aK-7d0m_FIPQ9oszaHTXW09pQw','2025-05-20 11:06:31','2026-05-11 14:03:31'),(14,'adam','adam35046@gmail.com','$2b$10$ktET2uCOVDn7GY26YLsPp.RYbRl.bdIxAHIfq2qtGPUoPy1kx6sba','2003-12-28','pasien','blank-profile-pic.png','eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxNCwicm9sZSI6InBhc2llbiIsImlhdCI6MTc0NzgzMDEyMywiZXhwIjoxNzQ3OTE2NTIzfQ.uN9zcswPpCcyqs5ijLM2xoEMENzQcqa7cgA5rNA6qAQ','2025-05-21 19:21:44','2025-05-21 19:22:03'),(16,'Isteu Amelia','isteuamla@gmail.com','$2b$10$s3Jx9t1UjYmY900lrkw0iupqxuQ.yoEOjqJDI9V74ao8hpv39tfjm','2004-10-05','pasien','blank-profile-pic.png','eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxNiwicm9sZSI6InBhc2llbiIsImlhdCI6MTc0ODE4Mzk5MCwiZXhwIjoxNzQ4MjcwMzkwfQ.5_g4KflHq0N43sVa_xe2EeT-aR9HyWmZu3qysNXpBgI','2025-05-25 21:39:46','2025-05-25 21:39:50'),(17,'Nathan','dummyemail@gmail.com','$2b$10$wjXGQx1SVRF.ahnYmOTc0e/DM0T4VlXXAnGFxsF1MYXkp5vWaiNYy','2000-04-01','pasien','blank-profile-pic.png',NULL,'2025-05-27 11:55:15','2025-05-27 11:58:42'),(18,'Dr Nat','dummydoctor@gmail.com','$2b$10$OLLm8tXds9aWsNZwST8eX.Zeq5fCTeYTGtwE1gzMLS0Z2glDy26ia','2025-05-27','pasien','blank-profile-pic.png',NULL,'2025-05-27 11:59:20','2025-05-27 11:59:40'),(19,'inaya','inaya@gmail.com','$2b$10$YvR7Gbf2to81z0v1fgi1m.GVC7oXCL8x3vF8DaaU8c/yjTzJ0XjoO','2004-05-02','pasien','blank-profile-pic.png','eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxOSwicm9sZSI6InBhc2llbiIsImlhdCI6MTc0ODMyMjAwOCwiZXhwIjoxNzQ4NDA4NDA4fQ.sUNYvNdbuMwHVX5JHtUBad8vb1h1IJkk_9FfIwXInlo','2025-05-27 11:59:53','2025-05-27 12:00:08'),(20,'rakha','rakha@gmail.com','$2b$10$InA6Hfc63ccCMsp/l6iWa.dYt/f0Y0EI0Kn7pd78l4UVs5aQPSsLu','2025-05-27','pasien','blank-profile-pic.png','eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoyMCwicm9sZSI6InBhc2llbiIsImlhdCI6MTc0ODMyMjk3MSwiZXhwIjoxNzQ4NDA5MzcxfQ.zPiXVveDFxfkPQZj6ueATvTwqhjHjYBmpazjW_hpmQI','2025-05-27 12:15:53','2025-05-27 12:16:11'),(21,'Syauqi Du','maxvers@gmail.com','$2b$10$vOiRN.Xx9UR14Ckcc.WOKOZrEQY1tcggvmIuXhHTjxmigMqxLL2WS','2003-02-25','pasien','blank-profile-pic.png',NULL,'2025-05-27 12:17:11','2025-05-27 12:31:48'),(22,'Saya Akbar','orang.jawa@gmail.com','$2b$10$JlQuoQzFYfAJKjX9nfQGKejsO1Zq280s57V/EF3dFr3wE4YHGkZFS','1986-01-01','pasien','blank-profile-pic.png','eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoyMiwicm9sZSI6InBhc2llbiIsImlhdCI6MTc0ODMyMzQxNywiZXhwIjoxNzQ4NDA5ODE3fQ.wIrngrv2Svuvpovaumv2ngmZVt8SasUvphD-DtmsFX4','2025-05-27 12:23:30','2025-05-27 12:23:37'),(23,'Shodiq','sodikpasien@gmail.com','$2b$10$HYzjuU7Q7HBK.Hpz6LBIPOt3Qz9oxPs43aGoNm9Tjsoy.5WUcBkF6','2025-05-27','pasien','blank-profile-pic.png',NULL,'2025-05-27 12:31:29','2025-05-27 21:15:10'),(24,'cici','abcd@xyz.com','$2b$10$/HS6FV.kFKI3/N1QdlV.r.6HdR/Aq36/e12Cj3P.u0/HDXizqFjxC','1990-01-01','pasien','blank-profile-pic.png','eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoyNCwicm9sZSI6InBhc2llbiIsImlhdCI6MTc0ODMyNDA0MSwiZXhwIjoxNzQ4NDEwNDQxfQ.HPIri5EUC-uSuLGU9Il0vbQqk6u7J9AOlS1SkvIoqJ4','2025-05-27 12:31:44','2025-05-27 12:34:01'),(25,'Andin Ahmad Arrodad','tkuda513@gmail.com','$2b$10$bijb.3corMT1R5VVlyuyU.ze1OiDRcQW/G7CIr63DLickwgL7CrOG','2005-03-04','pasien','blank-profile-pic.png',NULL,'2025-05-27 12:55:41','2025-05-27 13:04:39'),(26,'Arinza Aurelvia','arinzav1@gmail.com','$2b$10$Z4YCCTiBjZvqYhVvaMEqcOJDft7GSBOTO2RlXtmZNkrRXNq7Rj.EC','2025-05-27','pasien','blank-profile-pic.png','eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoyNiwicm9sZSI6InBhc2llbiIsImlhdCI6MTc0ODMzNTMzMiwiZXhwIjoxNzQ4NDIxNzMyfQ.q9h_NmizOxkqz41EXvUVoF9i69X6GOEja-d9TQWJaLc','2025-05-27 15:36:33','2025-05-27 15:42:12'),(27,'Achmad Rafly Khatami Zain','raflyzainn122@gmail.com','$2b$10$YVOlW33o086oeN2WBuOJdO/x24BL0QFa5GgTSAVKYhPtqiuSj8SyO','2020-01-28','pasien','blank-profile-pic.png',NULL,'2025-05-28 11:21:29','2025-05-28 11:21:29'),(28,'Achmad Rafly Khatami Zain','raflyzainn11@gmail.com','$2b$10$IRHwDgG41AYR5e/wx9TLdeIjH.jqYQ7R61zy1DmL0LWAGUK32Xkfm','2022-01-19','pasien','blank-profile-pic.png',NULL,'2025-05-28 11:25:19','2025-05-28 11:25:19'),(29,'protoneus','garis11meter@gmail.com','$2b$10$gS4azgPZfJcDhdsDjGVGjuQbzVUN5D6t0M4IxALnuYALYmwuA3vmG','1999-12-28','pasien','blank-profile-pic.png','eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoyOSwicm9sZSI6InBhc2llbiIsImlhdCI6MTc0ODQ0NDk4NSwiZXhwIjoxNzQ4NTMxMzg1fQ.dPV-i28rBADYSUiEz-W9J6jSz4_ZUHmhn0KJrJ_Y9-A','2025-05-28 22:09:34','2025-05-28 22:09:45'),(30,'Ryan Satria','ryansatria@gmail.com','$2b$10$LougwveVieTtB/qEZpEZbOTcVjaNjDbER8K2xfxjlrFqz4kbOn6ti','2005-02-08','pasien','blank-profile-pic.png',NULL,'2025-05-31 19:15:36','2025-05-31 19:19:22'),(31,'Nicky Stefen','nickstef@gmail.com','$2b$10$doTgFTT2u42enZ7QJt7kCOwRJ4aXgZw6lZZh25HMgJ21znvnX35a2','2005-04-23','pasien','blank-profile-pic.png',NULL,'2025-05-31 19:19:56','2025-05-31 19:21:28'),(32,'Samuel Joendy Willim','sammyjw@gmail.com','$2b$10$ogaP8wIdGul0QVjp5pqJieF6vkPatmuMG8/MK.h7aG9rU.aEVEwVO','2005-06-15','pasien','blank-profile-pic.png',NULL,'2025-05-31 19:22:03','2025-05-31 19:23:11'),(33,'Steven Willim','stevenw@gmail.com','$2b$10$bpMjrm.s.jHtjyznt/gKIe8WvIijFKG8bKcUkuMDOaCIXJQ8i28sO','2005-03-18','pasien','blank-profile-pic.png','eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjozMywicm9sZSI6InBhc2llbiIsImlhdCI6MTc0OTEzMDUyMCwiZXhwIjoxNzQ5MjE2OTIwfQ.s7woazU-YlEhO3RDJ4pfYWWLbhT2gMwC3qGxBkeazQY','2025-05-31 19:23:53','2025-06-05 20:35:20'),(34,'Jessica Halim','jessicahalim@gmail.com','$2b$10$H/FiHLiFt27miwOzC97vOuPBNvixl7ffDxE4Z44RrdbKMTVdW16Va','2005-10-11','pasien','blank-profile-pic.png','eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjozNCwicm9sZSI6InBhc2llbiIsImlhdCI6MTc0OTA0MzIwOCwiZXhwIjoxNzQ5MTI5NjA4fQ.As6Vl7-r3dNh2yksc2yN6LxvZaE80JbCWfjlOtWEkI4','2025-05-31 19:25:51','2025-06-04 20:20:08'),(35,'rendi','rendii@gmail.com','$2b$10$tRQtMQ./uMhn5RSvqd4aLOgmKABGKzqw.mHToPDxpe518K4saAOkS','2007-06-06','pasien','blank-profile-pic.png','eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjozNSwicm9sZSI6InBhc2llbiIsImlhdCI6MTc0ODc1NjcyNCwiZXhwIjoxNzQ4ODQzMTI0fQ.vvo1-EmR9Y9PDCb8YGLxJ7bSbAmT-EaZYCvEafJUnjQ','2025-06-01 12:45:03','2025-06-01 12:45:24'),(36,'abc','abc@gmail.com','$2b$10$pTDzUUJAtNnaKJ.em6uYp.WAMM1jSeb1fr//.UQDBflH01WeCOWOy','2003-05-30','pasien','blank-profile-pic.png',NULL,'2025-06-10 22:54:38','2025-06-10 22:57:21'),(37,'ff','f@gmail.com','$2b$10$Q0zjUC.QZCv8tk9gIjnu/OPrbL32Eq1cGwYJO9OQ0RgdzV3oTau4C','2007-07-03','pasien','profile-37-1751795462054.jpg',NULL,'2025-07-06 16:44:45','2025-07-06 16:52:06'),(38,'Soraya Haidar Salma','sorayahaidars14@gmail.com','$2b$10$wubVwrakzbr8o3s1JKIFOuZKNZKH4Clw9QbIHPORDYfLRV0H/r2Cy','2004-01-14','pasien','blank-profile-pic.png',NULL,'2025-12-01 00:11:28','2025-12-01 06:23:20'),(39,'halo','halo@gmail.com','$2b$10$YvWOOV8Jq615D.UpWDVF5.hwg/WTSMLo5.lNZ54rAhxMBSUCbSOXK','2020-02-01','pasien','blank-profile-pic.png','eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjozOSwicm9sZSI6InBhc2llbiIsImlhdCI6MTc2NDU2NDQ2NCwiZXhwIjoxNzY0NjUwODY0fQ.eoappP0yjh7R8wf1xtMHu1MC95itDUsPoiR0T5sJ1nw','2025-12-01 02:00:31','2025-12-01 11:47:44'),(40,'hai','hai@gmail.com','$2b$10$7IvdwWWixH6xjfvVhvpDmOMCKQdh0Wmn7BNrLDkJqOb7RkFdCT.um','2010-05-15','pasien','blank-profile-pic.png',NULL,'2025-12-01 02:03:29','2025-12-01 02:04:00'),(41,'Nurfadhilah Putri Bumi','nfadhilah741@gmail.com','$2b$10$1MGEXuzhbc1LEwP7S6wNc.aBADkQIkwm20O4YIv4.VVZ83iK/vDuq','2002-05-19','pasien','blank-profile-pic.png','eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjo0MSwicm9sZSI6InBhc2llbiIsImlhdCI6MTc2NDU2NjQ5OCwiZXhwIjoxNzY0NjUyODk4fQ.sdPUAmdzsOWe6og2NwFeMMWkB01jdxlaPKdK77vMyZM','2025-12-01 12:21:27','2025-12-01 12:21:38'),(42,'budi','budi@gmail.com','$2b$10$HdzQrTLhC3zr9chhslBbn.jAPoegbEhPfKXEUou9TH8yZ44zAiO4K','2000-01-01','pasien','blank-profile-pic.png',NULL,'2025-12-28 01:49:28','2026-01-19 10:26:59'),(43,'dokter super','doktersuper@gmail.com','$2b$10$EkbHYG4Wihiq82J38bSsAOG.J5C/Ht8pOoLGeoKLzV.cwLR7GtC4y','1995-01-31','pasien','blank-profile-pic.png',NULL,'2026-01-19 10:28:00','2026-01-19 10:28:34'),(45,'abjjith','abijiths467@gmail.com','$2b$10$ZaU8OTSUwDxaMwQ.9V5ElupWhmjIUJIXBE.ArcPAet6mkj72X9J9q','2009-01-25','pasien','blank-profile-pic.png','eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjo0NSwicm9sZSI6InBhc2llbiIsImlhdCI6MTc3MDcwMDc4NywiZXhwIjoxNzcwNzg3MTg3fQ.oEZEKmoWaKv24ocqL8jziW_rShJvr6MnsejtLm_YWdM','2026-02-10 12:18:33','2026-02-10 12:19:47'),(46,'Raya Taufik','rayataufik4@gmail.com','$2b$10$R4FQ6NzSMcFsBCB/tp9UVOCwkKeg1STKtTfUcqoAlfCFx4B2QVO8C','2003-06-24','dokter','blank-profile-pic.png',NULL,'2026-04-22 09:48:54','2026-04-22 09:51:07'); +/*!40000 ALTER TABLE `user` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Dumping events for database 'humicpro_intellisight' +-- + +-- +-- Dumping routines for database 'humicpro_intellisight' +-- +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2026-05-12 16:17:40 diff --git a/docker/seed/images/eye-scans/eye-1-1746603939908.jpg b/docker/seed/images/eye-scans/eye-1-1746603939908.jpg new file mode 100644 index 0000000..864d5f4 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-1-1746603939908.jpg differ diff --git a/docker/seed/images/eye-scans/eye-1-1747638202673.jpg b/docker/seed/images/eye-scans/eye-1-1747638202673.jpg new file mode 100644 index 0000000..864d5f4 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-1-1747638202673.jpg differ diff --git a/docker/seed/images/eye-scans/eye-1-1748104777555.jpg b/docker/seed/images/eye-scans/eye-1-1748104777555.jpg new file mode 100644 index 0000000..864d5f4 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-1-1748104777555.jpg differ diff --git a/docker/seed/images/eye-scans/eye-1-1748104791775.jpg b/docker/seed/images/eye-scans/eye-1-1748104791775.jpg new file mode 100644 index 0000000..864d5f4 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-1-1748104791775.jpg differ diff --git a/docker/seed/images/eye-scans/eye-11-1747630437329.jpg b/docker/seed/images/eye-scans/eye-11-1747630437329.jpg new file mode 100644 index 0000000..644c6cf Binary files /dev/null and b/docker/seed/images/eye-scans/eye-11-1747630437329.jpg differ diff --git a/docker/seed/images/eye-scans/eye-11-1747635943178.jpg b/docker/seed/images/eye-scans/eye-11-1747635943178.jpg new file mode 100644 index 0000000..644c6cf Binary files /dev/null and b/docker/seed/images/eye-scans/eye-11-1747635943178.jpg differ diff --git a/docker/seed/images/eye-scans/eye-11-1753341105248.jpg b/docker/seed/images/eye-scans/eye-11-1753341105248.jpg new file mode 100644 index 0000000..7cf9b56 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-11-1753341105248.jpg differ diff --git a/docker/seed/images/eye-scans/eye-12-1747636999269.jpeg b/docker/seed/images/eye-scans/eye-12-1747636999269.jpeg new file mode 100644 index 0000000..ae58c57 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-12-1747636999269.jpeg differ diff --git a/docker/seed/images/eye-scans/eye-12-1748407166492.jpeg b/docker/seed/images/eye-scans/eye-12-1748407166492.jpeg new file mode 100644 index 0000000..20055a6 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-12-1748407166492.jpeg differ diff --git a/docker/seed/images/eye-scans/eye-13-1747714157381.png b/docker/seed/images/eye-scans/eye-13-1747714157381.png new file mode 100644 index 0000000..ae59c86 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-13-1747714157381.png differ diff --git a/docker/seed/images/eye-scans/eye-13-1747721135543.jpg b/docker/seed/images/eye-scans/eye-13-1747721135543.jpg new file mode 100644 index 0000000..60782b3 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-13-1747721135543.jpg differ diff --git a/docker/seed/images/eye-scans/eye-13-1747721258581.jpg b/docker/seed/images/eye-scans/eye-13-1747721258581.jpg new file mode 100644 index 0000000..ebcb707 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-13-1747721258581.jpg differ diff --git a/docker/seed/images/eye-scans/eye-13-1747721313466.jpg b/docker/seed/images/eye-scans/eye-13-1747721313466.jpg new file mode 100644 index 0000000..c719398 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-13-1747721313466.jpg differ diff --git a/docker/seed/images/eye-scans/eye-13-1747721376526.jpg b/docker/seed/images/eye-scans/eye-13-1747721376526.jpg new file mode 100644 index 0000000..0b2ce63 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-13-1747721376526.jpg differ diff --git a/docker/seed/images/eye-scans/eye-13-1747721462046.jpg b/docker/seed/images/eye-scans/eye-13-1747721462046.jpg new file mode 100644 index 0000000..b84450c Binary files /dev/null and b/docker/seed/images/eye-scans/eye-13-1747721462046.jpg differ diff --git a/docker/seed/images/eye-scans/eye-13-1749344534940.jpg b/docker/seed/images/eye-scans/eye-13-1749344534940.jpg new file mode 100644 index 0000000..64bc838 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-13-1749344534940.jpg differ diff --git a/docker/seed/images/eye-scans/eye-13-1749459258929.jpg b/docker/seed/images/eye-scans/eye-13-1749459258929.jpg new file mode 100644 index 0000000..02250be Binary files /dev/null and b/docker/seed/images/eye-scans/eye-13-1749459258929.jpg differ diff --git a/docker/seed/images/eye-scans/eye-13-1749459269018.jpg b/docker/seed/images/eye-scans/eye-13-1749459269018.jpg new file mode 100644 index 0000000..02250be Binary files /dev/null and b/docker/seed/images/eye-scans/eye-13-1749459269018.jpg differ diff --git a/docker/seed/images/eye-scans/eye-13-1749459333356.jpeg b/docker/seed/images/eye-scans/eye-13-1749459333356.jpeg new file mode 100644 index 0000000..2b0c759 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-13-1749459333356.jpeg differ diff --git a/docker/seed/images/eye-scans/eye-13-1749460655110.jpeg b/docker/seed/images/eye-scans/eye-13-1749460655110.jpeg new file mode 100644 index 0000000..2b0c759 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-13-1749460655110.jpeg differ diff --git a/docker/seed/images/eye-scans/eye-13-1749460664415.jpeg b/docker/seed/images/eye-scans/eye-13-1749460664415.jpeg new file mode 100644 index 0000000..2b0c759 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-13-1749460664415.jpeg differ diff --git a/docker/seed/images/eye-scans/eye-13-1749460720210.jpeg b/docker/seed/images/eye-scans/eye-13-1749460720210.jpeg new file mode 100644 index 0000000..2b0c759 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-13-1749460720210.jpeg differ diff --git a/docker/seed/images/eye-scans/eye-13-1749460740714.jpeg b/docker/seed/images/eye-scans/eye-13-1749460740714.jpeg new file mode 100644 index 0000000..2b0c759 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-13-1749460740714.jpeg differ diff --git a/docker/seed/images/eye-scans/eye-13-1749460752598.jpeg b/docker/seed/images/eye-scans/eye-13-1749460752598.jpeg new file mode 100644 index 0000000..2b0c759 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-13-1749460752598.jpeg differ diff --git a/docker/seed/images/eye-scans/eye-13-1749460877643.jpg b/docker/seed/images/eye-scans/eye-13-1749460877643.jpg new file mode 100644 index 0000000..e4e02bd Binary files /dev/null and b/docker/seed/images/eye-scans/eye-13-1749460877643.jpg differ diff --git a/docker/seed/images/eye-scans/eye-13-1756961274053.jpg b/docker/seed/images/eye-scans/eye-13-1756961274053.jpg new file mode 100644 index 0000000..7cf9b56 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-13-1756961274053.jpg differ diff --git a/docker/seed/images/eye-scans/eye-13-1757907628078.jpg b/docker/seed/images/eye-scans/eye-13-1757907628078.jpg new file mode 100644 index 0000000..75afd54 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-13-1757907628078.jpg differ diff --git a/docker/seed/images/eye-scans/eye-13-1764507155226.jpg b/docker/seed/images/eye-scans/eye-13-1764507155226.jpg new file mode 100644 index 0000000..1c50b11 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-13-1764507155226.jpg differ diff --git a/docker/seed/images/eye-scans/eye-13-1776825776736.jpg b/docker/seed/images/eye-scans/eye-13-1776825776736.jpg new file mode 100644 index 0000000..644c6cf Binary files /dev/null and b/docker/seed/images/eye-scans/eye-13-1776825776736.jpg differ diff --git a/docker/seed/images/eye-scans/eye-13-1776826301933.jpg b/docker/seed/images/eye-scans/eye-13-1776826301933.jpg new file mode 100644 index 0000000..644c6cf Binary files /dev/null and b/docker/seed/images/eye-scans/eye-13-1776826301933.jpg differ diff --git a/docker/seed/images/eye-scans/eye-15-1748104743502.jpg b/docker/seed/images/eye-scans/eye-15-1748104743502.jpg new file mode 100644 index 0000000..864d5f4 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-15-1748104743502.jpg differ diff --git a/docker/seed/images/eye-scans/eye-16-1748184175929.jpg b/docker/seed/images/eye-scans/eye-16-1748184175929.jpg new file mode 100644 index 0000000..6ae211b Binary files /dev/null and b/docker/seed/images/eye-scans/eye-16-1748184175929.jpg differ diff --git a/docker/seed/images/eye-scans/eye-17-1748321790413.jpg b/docker/seed/images/eye-scans/eye-17-1748321790413.jpg new file mode 100644 index 0000000..073180d Binary files /dev/null and b/docker/seed/images/eye-scans/eye-17-1748321790413.jpg differ diff --git a/docker/seed/images/eye-scans/eye-19-1748322117967.jpg b/docker/seed/images/eye-scans/eye-19-1748322117967.jpg new file mode 100644 index 0000000..b120826 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-19-1748322117967.jpg differ diff --git a/docker/seed/images/eye-scans/eye-20-1748323577474.jpeg b/docker/seed/images/eye-scans/eye-20-1748323577474.jpeg new file mode 100644 index 0000000..af1e6c7 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-20-1748323577474.jpeg differ diff --git a/docker/seed/images/eye-scans/eye-21-1748323268415.png b/docker/seed/images/eye-scans/eye-21-1748323268415.png new file mode 100644 index 0000000..3e4f5ca Binary files /dev/null and b/docker/seed/images/eye-scans/eye-21-1748323268415.png differ diff --git a/docker/seed/images/eye-scans/eye-22-1748323785040.png b/docker/seed/images/eye-scans/eye-22-1748323785040.png new file mode 100644 index 0000000..1be9dcc Binary files /dev/null and b/docker/seed/images/eye-scans/eye-22-1748323785040.png differ diff --git a/docker/seed/images/eye-scans/eye-23-1748355275508.jpeg b/docker/seed/images/eye-scans/eye-23-1748355275508.jpeg new file mode 100644 index 0000000..ef85764 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-23-1748355275508.jpeg differ diff --git a/docker/seed/images/eye-scans/eye-25-1748325470185.png b/docker/seed/images/eye-scans/eye-25-1748325470185.png new file mode 100644 index 0000000..00b2cb5 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-25-1748325470185.png differ diff --git a/docker/seed/images/eye-scans/eye-26-1748335390328.png b/docker/seed/images/eye-scans/eye-26-1748335390328.png new file mode 100644 index 0000000..08c6cd1 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-26-1748335390328.png differ diff --git a/docker/seed/images/eye-scans/eye-3-1746880654372.jpg b/docker/seed/images/eye-scans/eye-3-1746880654372.jpg new file mode 100644 index 0000000..9bfa157 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-3-1746880654372.jpg differ diff --git a/docker/seed/images/eye-scans/eye-3-1746934704652.jpg b/docker/seed/images/eye-scans/eye-3-1746934704652.jpg new file mode 100644 index 0000000..8ed44fc Binary files /dev/null and b/docker/seed/images/eye-scans/eye-3-1746934704652.jpg differ diff --git a/docker/seed/images/eye-scans/eye-3-1747138514393.jpg b/docker/seed/images/eye-scans/eye-3-1747138514393.jpg new file mode 100644 index 0000000..0216e03 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-3-1747138514393.jpg differ diff --git a/docker/seed/images/eye-scans/eye-3-1747140383150.jpg b/docker/seed/images/eye-scans/eye-3-1747140383150.jpg new file mode 100644 index 0000000..a1e7b57 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-3-1747140383150.jpg differ diff --git a/docker/seed/images/eye-scans/eye-3-1747578124889.jpg b/docker/seed/images/eye-scans/eye-3-1747578124889.jpg new file mode 100644 index 0000000..1b383f0 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-3-1747578124889.jpg differ diff --git a/docker/seed/images/eye-scans/eye-3-1747581815129.jpg b/docker/seed/images/eye-scans/eye-3-1747581815129.jpg new file mode 100644 index 0000000..6947731 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-3-1747581815129.jpg differ diff --git a/docker/seed/images/eye-scans/eye-3-1747719621883.png b/docker/seed/images/eye-scans/eye-3-1747719621883.png new file mode 100644 index 0000000..698d28e Binary files /dev/null and b/docker/seed/images/eye-scans/eye-3-1747719621883.png differ diff --git a/docker/seed/images/eye-scans/eye-30-1748693882385.jpg b/docker/seed/images/eye-scans/eye-30-1748693882385.jpg new file mode 100644 index 0000000..d3fc21d Binary files /dev/null and b/docker/seed/images/eye-scans/eye-30-1748693882385.jpg differ diff --git a/docker/seed/images/eye-scans/eye-31-1748694025317.jpg b/docker/seed/images/eye-scans/eye-31-1748694025317.jpg new file mode 100644 index 0000000..a7af1d0 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-31-1748694025317.jpg differ diff --git a/docker/seed/images/eye-scans/eye-32-1748694145642.jpg b/docker/seed/images/eye-scans/eye-32-1748694145642.jpg new file mode 100644 index 0000000..426de53 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-32-1748694145642.jpg differ diff --git a/docker/seed/images/eye-scans/eye-33-1748694256824.jpg b/docker/seed/images/eye-scans/eye-33-1748694256824.jpg new file mode 100644 index 0000000..6b189ea Binary files /dev/null and b/docker/seed/images/eye-scans/eye-33-1748694256824.jpg differ diff --git a/docker/seed/images/eye-scans/eye-34-1748694474917.jpg b/docker/seed/images/eye-scans/eye-34-1748694474917.jpg new file mode 100644 index 0000000..13c88b6 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-34-1748694474917.jpg differ diff --git a/docker/seed/images/eye-scans/eye-36-1749570952911.jpg b/docker/seed/images/eye-scans/eye-36-1749570952911.jpg new file mode 100644 index 0000000..e977606 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-36-1749570952911.jpg differ diff --git a/docker/seed/images/eye-scans/eye-38-1764522930780.jpg b/docker/seed/images/eye-scans/eye-38-1764522930780.jpg new file mode 100644 index 0000000..778072b Binary files /dev/null and b/docker/seed/images/eye-scans/eye-38-1764522930780.jpg differ diff --git a/docker/seed/images/eye-scans/eye-38-1764522987381.jpeg b/docker/seed/images/eye-scans/eye-38-1764522987381.jpeg new file mode 100644 index 0000000..0b9f889 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-38-1764522987381.jpeg differ diff --git a/docker/seed/images/eye-scans/eye-39-1764529319665.jpg b/docker/seed/images/eye-scans/eye-39-1764529319665.jpg new file mode 100644 index 0000000..5258389 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-39-1764529319665.jpg differ diff --git a/docker/seed/images/eye-scans/eye-39-1764531305428.jpg b/docker/seed/images/eye-scans/eye-39-1764531305428.jpg new file mode 100644 index 0000000..5258389 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-39-1764531305428.jpg differ diff --git a/docker/seed/images/eye-scans/eye-39-1764564530102.jpg b/docker/seed/images/eye-scans/eye-39-1764564530102.jpg new file mode 100644 index 0000000..1f37090 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-39-1764564530102.jpg differ diff --git a/docker/seed/images/eye-scans/eye-4-1746801130977.jpg b/docker/seed/images/eye-scans/eye-4-1746801130977.jpg new file mode 100644 index 0000000..5553b69 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-4-1746801130977.jpg differ diff --git a/docker/seed/images/eye-scans/eye-4-1746801342768.jpg b/docker/seed/images/eye-scans/eye-4-1746801342768.jpg new file mode 100644 index 0000000..07d2b85 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-4-1746801342768.jpg differ diff --git a/docker/seed/images/eye-scans/eye-41-1764566667976.jpg b/docker/seed/images/eye-scans/eye-41-1764566667976.jpg new file mode 100644 index 0000000..c144a51 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-41-1764566667976.jpg differ diff --git a/docker/seed/images/eye-scans/eye-41-1764566839347.jpg b/docker/seed/images/eye-scans/eye-41-1764566839347.jpg new file mode 100644 index 0000000..670af01 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-41-1764566839347.jpg differ diff --git a/docker/seed/images/eye-scans/eye-43-1768793306564.jpg b/docker/seed/images/eye-scans/eye-43-1768793306564.jpg new file mode 100644 index 0000000..864d5f4 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-43-1768793306564.jpg differ diff --git a/docker/seed/images/eye-scans/eye-45-1770700899959.jpg b/docker/seed/images/eye-scans/eye-45-1770700899959.jpg new file mode 100644 index 0000000..6a03a9c Binary files /dev/null and b/docker/seed/images/eye-scans/eye-45-1770700899959.jpg differ diff --git a/docker/seed/images/eye-scans/eye-5-1746610839414.jpeg b/docker/seed/images/eye-scans/eye-5-1746610839414.jpeg new file mode 100644 index 0000000..a16dcc7 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-5-1746610839414.jpeg differ diff --git a/docker/seed/images/eye-scans/eye-5-1746613043377.jpg b/docker/seed/images/eye-scans/eye-5-1746613043377.jpg new file mode 100644 index 0000000..d136a5b Binary files /dev/null and b/docker/seed/images/eye-scans/eye-5-1746613043377.jpg differ diff --git a/docker/seed/images/eye-scans/eye-5-1746613119751.jpg b/docker/seed/images/eye-scans/eye-5-1746613119751.jpg new file mode 100644 index 0000000..d136a5b Binary files /dev/null and b/docker/seed/images/eye-scans/eye-5-1746613119751.jpg differ diff --git a/docker/seed/images/eye-scans/eye-5-1746637578724.jpg b/docker/seed/images/eye-scans/eye-5-1746637578724.jpg new file mode 100644 index 0000000..a16dcc7 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-5-1746637578724.jpg differ diff --git a/docker/seed/images/eye-scans/eye-5-1746695774945.jpg b/docker/seed/images/eye-scans/eye-5-1746695774945.jpg new file mode 100644 index 0000000..a16dcc7 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-5-1746695774945.jpg differ diff --git a/docker/seed/images/eye-scans/eye-5-1746699850546.jpg b/docker/seed/images/eye-scans/eye-5-1746699850546.jpg new file mode 100644 index 0000000..a16dcc7 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-5-1746699850546.jpg differ diff --git a/docker/seed/images/eye-scans/eye-5-1746701536802.jpg b/docker/seed/images/eye-scans/eye-5-1746701536802.jpg new file mode 100644 index 0000000..a16dcc7 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-5-1746701536802.jpg differ diff --git a/docker/seed/images/eye-scans/eye-5-1746701536969.jpg b/docker/seed/images/eye-scans/eye-5-1746701536969.jpg new file mode 100644 index 0000000..a16dcc7 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-5-1746701536969.jpg differ diff --git a/docker/seed/images/eye-scans/eye-5-1746799649547.jpg b/docker/seed/images/eye-scans/eye-5-1746799649547.jpg new file mode 100644 index 0000000..a16dcc7 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-5-1746799649547.jpg differ diff --git a/docker/seed/images/eye-scans/eye-5-1747134278864.jpg b/docker/seed/images/eye-scans/eye-5-1747134278864.jpg new file mode 100644 index 0000000..a16dcc7 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-5-1747134278864.jpg differ diff --git a/docker/seed/images/eye-scans/eye-5-1747581476451.jpg b/docker/seed/images/eye-scans/eye-5-1747581476451.jpg new file mode 100644 index 0000000..a16dcc7 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-5-1747581476451.jpg differ diff --git a/docker/seed/images/eye-scans/eye-6-1746780977020.jpeg b/docker/seed/images/eye-scans/eye-6-1746780977020.jpeg new file mode 100644 index 0000000..a16dcc7 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-6-1746780977020.jpeg differ diff --git a/docker/seed/images/eye-scans/eye-6-1746781016341.jpeg b/docker/seed/images/eye-scans/eye-6-1746781016341.jpeg new file mode 100644 index 0000000..a16dcc7 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-6-1746781016341.jpeg differ diff --git a/docker/seed/images/eye-scans/eye-9-1747630412642.jpg b/docker/seed/images/eye-scans/eye-9-1747630412642.jpg new file mode 100644 index 0000000..8eb7eff Binary files /dev/null and b/docker/seed/images/eye-scans/eye-9-1747630412642.jpg differ diff --git a/docker/seed/images/eye-scans/eye-9-1747636159710.jpg b/docker/seed/images/eye-scans/eye-9-1747636159710.jpg new file mode 100644 index 0000000..8eb7eff Binary files /dev/null and b/docker/seed/images/eye-scans/eye-9-1747636159710.jpg differ diff --git a/docker/seed/images/eye-scans/eye-9-1747648014127.jpg b/docker/seed/images/eye-scans/eye-9-1747648014127.jpg new file mode 100644 index 0000000..5c35ed9 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-9-1747648014127.jpg differ diff --git a/docker/seed/images/eye-scans/eye-9-1747648119757.jpg b/docker/seed/images/eye-scans/eye-9-1747648119757.jpg new file mode 100644 index 0000000..9d1e224 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-9-1747648119757.jpg differ diff --git a/docker/seed/images/eye-scans/eye-9-1747648172573.jpg b/docker/seed/images/eye-scans/eye-9-1747648172573.jpg new file mode 100644 index 0000000..92e1c85 Binary files /dev/null and b/docker/seed/images/eye-scans/eye-9-1747648172573.jpg differ diff --git a/docker/seed/images/profile-pics/blank-profile-pic.png b/docker/seed/images/profile-pics/blank-profile-pic.png new file mode 100644 index 0000000..1f8e665 Binary files /dev/null and b/docker/seed/images/profile-pics/blank-profile-pic.png differ diff --git a/docker/seed/images/profile-pics/profile-15-1748104697394.png b/docker/seed/images/profile-pics/profile-15-1748104697394.png new file mode 100644 index 0000000..0c16bed Binary files /dev/null and b/docker/seed/images/profile-pics/profile-15-1748104697394.png differ diff --git a/docker/seed/images/profile-pics/profile-2-1748708600159.png b/docker/seed/images/profile-pics/profile-2-1748708600159.png new file mode 100644 index 0000000..b315457 Binary files /dev/null and b/docker/seed/images/profile-pics/profile-2-1748708600159.png differ diff --git a/docker/seed/images/profile-pics/profile-3-1748081062431.jpg b/docker/seed/images/profile-pics/profile-3-1748081062431.jpg new file mode 100644 index 0000000..a5cdb62 Binary files /dev/null and b/docker/seed/images/profile-pics/profile-3-1748081062431.jpg differ diff --git a/docker/seed/images/profile-pics/profile-37-1751795462054.jpg b/docker/seed/images/profile-pics/profile-37-1751795462054.jpg new file mode 100644 index 0000000..e502e4c Binary files /dev/null and b/docker/seed/images/profile-pics/profile-37-1751795462054.jpg differ diff --git a/docker/seed/images/profile-pics/profile-5-1746716864232.jpg b/docker/seed/images/profile-pics/profile-5-1746716864232.jpg new file mode 100644 index 0000000..820cd69 Binary files /dev/null and b/docker/seed/images/profile-pics/profile-5-1746716864232.jpg differ diff --git a/docker/seed/images/profile-pics/profile-7-1747223446863.jpg b/docker/seed/images/profile-pics/profile-7-1747223446863.jpg new file mode 100644 index 0000000..00a29a0 Binary files /dev/null and b/docker/seed/images/profile-pics/profile-7-1747223446863.jpg differ diff --git a/humicpro_intellisight.sql b/humicpro_intellisight.sql new file mode 100644 index 0000000..e56a1db --- /dev/null +++ b/humicpro_intellisight.sql @@ -0,0 +1,106 @@ +/*M!999999\- enable the sandbox mode */ +-- MariaDB dump 10.19 Distrib 10.6.25-MariaDB, for Linux (x86_64) +-- +-- Host: localhost Database: humicpro_intellisight +-- ------------------------------------------------------ +-- Server version 10.6.25-MariaDB + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8mb4 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `examination` +-- + +DROP TABLE IF EXISTS `examination`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8mb4 */; +CREATE TABLE `examination` ( + `examination_id` int(11) NOT NULL AUTO_INCREMENT, + `patient_id` int(11) DEFAULT NULL, + `doctor_id` int(11) DEFAULT NULL, + `examination_date` date NOT NULL, + `eye_pic` varchar(100) NOT NULL, + `complaints` text DEFAULT NULL, + `diagnosis` text NOT NULL, + `doctors_note` text DEFAULT NULL, + `status` enum('ongoing','complete') NOT NULL, + `created_at` datetime NOT NULL, + `updated_at` datetime NOT NULL, + PRIMARY KEY (`examination_id`), + KEY `patient_id` (`patient_id`), + KEY `doctor_id` (`doctor_id`), + CONSTRAINT `examination_ibfk_1` FOREIGN KEY (`patient_id`) REFERENCES `user` (`user_id`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `examination_ibfk_2` FOREIGN KEY (`doctor_id`) REFERENCES `user` (`user_id`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB AUTO_INCREMENT=72 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `examination` +-- + +LOCK TABLES `examination` WRITE; +/*!40000 ALTER TABLE `examination` DISABLE KEYS */; +INSERT INTO `examination` (`examination_id`, `patient_id`, `doctor_id`, `examination_date`, `eye_pic`, `complaints`, `diagnosis`, `doctors_note`, `status`, `created_at`, `updated_at`) VALUES (71,13,46,'2026-04-22','eye-13-1776826301933.jpg','-','Possible cataract','-','ongoing','2026-04-22 09:51:42','2026-04-22 09:51:42'); +/*!40000 ALTER TABLE `examination` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `user` +-- + +DROP TABLE IF EXISTS `user`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8mb4 */; +CREATE TABLE `user` ( + `user_id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(100) NOT NULL, + `email` varchar(100) NOT NULL, + `password` varchar(100) NOT NULL, + `birthdate` date NOT NULL, + `role` enum('pasien','dokter') NOT NULL, + `profile_pic` varchar(100) DEFAULT NULL, + `refresh_token` varchar(255) DEFAULT NULL, + `created_at` datetime NOT NULL, + `updated_at` datetime NOT NULL, + PRIMARY KEY (`user_id`), + UNIQUE KEY `email` (`email`) +) ENGINE=InnoDB AUTO_INCREMENT=47 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `user` +-- + +LOCK TABLES `user` WRITE; +/*!40000 ALTER TABLE `user` DISABLE KEYS */; +INSERT INTO `user` (`user_id`, `name`, `email`, `password`, `birthdate`, `role`, `profile_pic`, `refresh_token`, `created_at`, `updated_at`) VALUES (1,'diaspasienedited','dias@gmail.com','$2b$10$irRKnKGpH9QP5w7Ui2rLje9ftLxACYhlij4bpbdyb80EVUWImxAl2','2001-09-11','pasien','blank-profile-pic.png','eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxLCJyb2xlIjoicGFzaWVuIiwiaWF0IjoxNzQ4NDE2NjExLCJleHAiOjE3NDg1MDMwMTF9.5Jd39_PcL2NYA-eLIeND14P-z4mw-ZyOPNVmFjGOeQw','2025-04-30 15:36:18','2025-05-28 14:16:51'),(3,'Akbar','akbar@gmail.com','$2b$10$R7gdEiN1H4xJDDssSKiK0eNEQnC2rYuspFo8w8MmRZ7MFf9m6Uq06','2004-05-18','pasien','profile-3-1748081062431.jpg','eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjozLCJyb2xlIjoicGFzaWVuIiwiaWF0IjoxNzQ4NTk5NTMwLCJleHAiOjE3NDg2ODU5MzB9.dQK03Bee6vKKdgxq9K-zXG5busTTJzIkCxb6GK0zg08','2025-04-30 19:34:12','2025-05-30 17:05:30'),(4,'diaspasienn','diaspasien@gmail.com','$2b$10$K8K1wnMLzeK9GbSKZWQGPuBgKt4pxsI5N/ny7851bAFK2Jvy/2Cqa','2001-09-11','pasien','blank-profile-pic.png',NULL,'2025-04-30 20:03:12','2025-05-09 22:14:57'),(5,'123456','asd123@gmail.com','$2b$10$83TceXdqwBE5WBHyc0kIl.79y1DnwF5E2CzRi.ez1uChOTmurv8v2','2000-01-01','pasien','profile-5-1746716864232.jpg',NULL,'2025-05-07 12:47:31','2025-05-20 15:28:26'),(7,'rendii','rendi@gmail.com','$2b$10$O/p1Vr38yexbe48d/woBnuuLd4d8cIDzxPGXZWKleNEokzPJQlcBS','2007-05-26','pasien','profile-7-1747223446863.jpg','eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjo3LCJyb2xlIjoicGFzaWVuIiwiaWF0IjoxNzQ3MjIzMzk2LCJleHAiOjE3NDczMDk3OTZ9.7H85B0pyWxzs7nP7g6vK-wNqh4wM0GNaxlsf3XDrAXI','2025-05-14 18:49:40','2025-05-14 18:54:06'),(8,'georgio','geor@gmail.com','$2b$10$7T8VpvmejexrVboXVAFUh.wcul.eFtBKcF/TLzl1U/4Hr5/FXkfJy','2007-05-24','pasien','blank-profile-pic.png',NULL,'2025-05-19 10:37:08','2025-05-23 04:52:18'),(9,'Achmad Rafly Khatami Zain','raflyzainn1@gmail.com','$2b$10$Ke7EX5x2BhFeGG4xGdJF2ePyW4f8XRU3ryhZPpWBv1lFZyn2.xOd.','2005-01-22','pasien','blank-profile-pic.png','eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjo5LCJyb2xlIjoicGFzaWVuIiwiaWF0IjoxNzQ5OTk0MjgxLCJleHAiOjE3NTAwODA2ODF9.Q6LbDG-7pGVeXXpgc9fi4L4YfCbJTTAFCEyN6hnKUO8','2025-05-19 11:41:49','2025-06-15 20:31:21'),(12,'Rivaldo Tandoko','rtrivaldo05@gmail.com','$2b$10$Xl0IU6RYcdFBq/Iw4W9WneBExWD2Wkn65prz0i34GMWo2JAiVF8vu','2025-05-11','pasien','blank-profile-pic.png','eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxMiwicm9sZSI6InBhc2llbiIsImlhdCI6MTc0ODQwNjUxMCwiZXhwIjoxNzQ4NDkyOTEwfQ.BddJSca3puLecgaf3urnL86CivonYE_gMXzsIec-tQU','2025-05-19 13:42:05','2025-05-28 11:28:30'),(13,'HUMIC ENGINEERING','humicengineering@gmail.com','$2b$10$3hK31MkWirwBMMmskV6/6eWJoUUNuSUn2fZ/X.p88IAmMIWtdio02','2003-06-24','pasien','blank-profile-pic.png','eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxMywicm9sZSI6InBhc2llbiIsImlhdCI6MTc3ODQ4MzAxMSwiZXhwIjoxNzc4NTY5NDExfQ.a7Jq3qDaQr-Z7g5W7aK-7d0m_FIPQ9oszaHTXW09pQw','2025-05-20 11:06:31','2026-05-11 14:03:31'),(14,'adam','adam35046@gmail.com','$2b$10$ktET2uCOVDn7GY26YLsPp.RYbRl.bdIxAHIfq2qtGPUoPy1kx6sba','2003-12-28','pasien','blank-profile-pic.png','eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxNCwicm9sZSI6InBhc2llbiIsImlhdCI6MTc0NzgzMDEyMywiZXhwIjoxNzQ3OTE2NTIzfQ.uN9zcswPpCcyqs5ijLM2xoEMENzQcqa7cgA5rNA6qAQ','2025-05-21 19:21:44','2025-05-21 19:22:03'),(16,'Isteu Amelia','isteuamla@gmail.com','$2b$10$s3Jx9t1UjYmY900lrkw0iupqxuQ.yoEOjqJDI9V74ao8hpv39tfjm','2004-10-05','pasien','blank-profile-pic.png','eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxNiwicm9sZSI6InBhc2llbiIsImlhdCI6MTc0ODE4Mzk5MCwiZXhwIjoxNzQ4MjcwMzkwfQ.5_g4KflHq0N43sVa_xe2EeT-aR9HyWmZu3qysNXpBgI','2025-05-25 21:39:46','2025-05-25 21:39:50'),(17,'Nathan','dummyemail@gmail.com','$2b$10$wjXGQx1SVRF.ahnYmOTc0e/DM0T4VlXXAnGFxsF1MYXkp5vWaiNYy','2000-04-01','pasien','blank-profile-pic.png',NULL,'2025-05-27 11:55:15','2025-05-27 11:58:42'),(18,'Dr Nat','dummydoctor@gmail.com','$2b$10$OLLm8tXds9aWsNZwST8eX.Zeq5fCTeYTGtwE1gzMLS0Z2glDy26ia','2025-05-27','pasien','blank-profile-pic.png',NULL,'2025-05-27 11:59:20','2025-05-27 11:59:40'),(19,'inaya','inaya@gmail.com','$2b$10$YvR7Gbf2to81z0v1fgi1m.GVC7oXCL8x3vF8DaaU8c/yjTzJ0XjoO','2004-05-02','pasien','blank-profile-pic.png','eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxOSwicm9sZSI6InBhc2llbiIsImlhdCI6MTc0ODMyMjAwOCwiZXhwIjoxNzQ4NDA4NDA4fQ.sUNYvNdbuMwHVX5JHtUBad8vb1h1IJkk_9FfIwXInlo','2025-05-27 11:59:53','2025-05-27 12:00:08'),(20,'rakha','rakha@gmail.com','$2b$10$InA6Hfc63ccCMsp/l6iWa.dYt/f0Y0EI0Kn7pd78l4UVs5aQPSsLu','2025-05-27','pasien','blank-profile-pic.png','eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoyMCwicm9sZSI6InBhc2llbiIsImlhdCI6MTc0ODMyMjk3MSwiZXhwIjoxNzQ4NDA5MzcxfQ.zPiXVveDFxfkPQZj6ueATvTwqhjHjYBmpazjW_hpmQI','2025-05-27 12:15:53','2025-05-27 12:16:11'),(21,'Syauqi Du','maxvers@gmail.com','$2b$10$vOiRN.Xx9UR14Ckcc.WOKOZrEQY1tcggvmIuXhHTjxmigMqxLL2WS','2003-02-25','pasien','blank-profile-pic.png',NULL,'2025-05-27 12:17:11','2025-05-27 12:31:48'),(22,'Saya Akbar','orang.jawa@gmail.com','$2b$10$JlQuoQzFYfAJKjX9nfQGKejsO1Zq280s57V/EF3dFr3wE4YHGkZFS','1986-01-01','pasien','blank-profile-pic.png','eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoyMiwicm9sZSI6InBhc2llbiIsImlhdCI6MTc0ODMyMzQxNywiZXhwIjoxNzQ4NDA5ODE3fQ.wIrngrv2Svuvpovaumv2ngmZVt8SasUvphD-DtmsFX4','2025-05-27 12:23:30','2025-05-27 12:23:37'),(23,'Shodiq','sodikpasien@gmail.com','$2b$10$HYzjuU7Q7HBK.Hpz6LBIPOt3Qz9oxPs43aGoNm9Tjsoy.5WUcBkF6','2025-05-27','pasien','blank-profile-pic.png',NULL,'2025-05-27 12:31:29','2025-05-27 21:15:10'),(24,'cici','abcd@xyz.com','$2b$10$/HS6FV.kFKI3/N1QdlV.r.6HdR/Aq36/e12Cj3P.u0/HDXizqFjxC','1990-01-01','pasien','blank-profile-pic.png','eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoyNCwicm9sZSI6InBhc2llbiIsImlhdCI6MTc0ODMyNDA0MSwiZXhwIjoxNzQ4NDEwNDQxfQ.HPIri5EUC-uSuLGU9Il0vbQqk6u7J9AOlS1SkvIoqJ4','2025-05-27 12:31:44','2025-05-27 12:34:01'),(25,'Andin Ahmad Arrodad','tkuda513@gmail.com','$2b$10$bijb.3corMT1R5VVlyuyU.ze1OiDRcQW/G7CIr63DLickwgL7CrOG','2005-03-04','pasien','blank-profile-pic.png',NULL,'2025-05-27 12:55:41','2025-05-27 13:04:39'),(26,'Arinza Aurelvia','arinzav1@gmail.com','$2b$10$Z4YCCTiBjZvqYhVvaMEqcOJDft7GSBOTO2RlXtmZNkrRXNq7Rj.EC','2025-05-27','pasien','blank-profile-pic.png','eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoyNiwicm9sZSI6InBhc2llbiIsImlhdCI6MTc0ODMzNTMzMiwiZXhwIjoxNzQ4NDIxNzMyfQ.q9h_NmizOxkqz41EXvUVoF9i69X6GOEja-d9TQWJaLc','2025-05-27 15:36:33','2025-05-27 15:42:12'),(27,'Achmad Rafly Khatami Zain','raflyzainn122@gmail.com','$2b$10$YVOlW33o086oeN2WBuOJdO/x24BL0QFa5GgTSAVKYhPtqiuSj8SyO','2020-01-28','pasien','blank-profile-pic.png',NULL,'2025-05-28 11:21:29','2025-05-28 11:21:29'),(28,'Achmad Rafly Khatami Zain','raflyzainn11@gmail.com','$2b$10$IRHwDgG41AYR5e/wx9TLdeIjH.jqYQ7R61zy1DmL0LWAGUK32Xkfm','2022-01-19','pasien','blank-profile-pic.png',NULL,'2025-05-28 11:25:19','2025-05-28 11:25:19'),(29,'protoneus','garis11meter@gmail.com','$2b$10$gS4azgPZfJcDhdsDjGVGjuQbzVUN5D6t0M4IxALnuYALYmwuA3vmG','1999-12-28','pasien','blank-profile-pic.png','eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoyOSwicm9sZSI6InBhc2llbiIsImlhdCI6MTc0ODQ0NDk4NSwiZXhwIjoxNzQ4NTMxMzg1fQ.dPV-i28rBADYSUiEz-W9J6jSz4_ZUHmhn0KJrJ_Y9-A','2025-05-28 22:09:34','2025-05-28 22:09:45'),(30,'Ryan Satria','ryansatria@gmail.com','$2b$10$LougwveVieTtB/qEZpEZbOTcVjaNjDbER8K2xfxjlrFqz4kbOn6ti','2005-02-08','pasien','blank-profile-pic.png',NULL,'2025-05-31 19:15:36','2025-05-31 19:19:22'),(31,'Nicky Stefen','nickstef@gmail.com','$2b$10$doTgFTT2u42enZ7QJt7kCOwRJ4aXgZw6lZZh25HMgJ21znvnX35a2','2005-04-23','pasien','blank-profile-pic.png',NULL,'2025-05-31 19:19:56','2025-05-31 19:21:28'),(32,'Samuel Joendy Willim','sammyjw@gmail.com','$2b$10$ogaP8wIdGul0QVjp5pqJieF6vkPatmuMG8/MK.h7aG9rU.aEVEwVO','2005-06-15','pasien','blank-profile-pic.png',NULL,'2025-05-31 19:22:03','2025-05-31 19:23:11'),(33,'Steven Willim','stevenw@gmail.com','$2b$10$bpMjrm.s.jHtjyznt/gKIe8WvIijFKG8bKcUkuMDOaCIXJQ8i28sO','2005-03-18','pasien','blank-profile-pic.png','eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjozMywicm9sZSI6InBhc2llbiIsImlhdCI6MTc0OTEzMDUyMCwiZXhwIjoxNzQ5MjE2OTIwfQ.s7woazU-YlEhO3RDJ4pfYWWLbhT2gMwC3qGxBkeazQY','2025-05-31 19:23:53','2025-06-05 20:35:20'),(34,'Jessica Halim','jessicahalim@gmail.com','$2b$10$H/FiHLiFt27miwOzC97vOuPBNvixl7ffDxE4Z44RrdbKMTVdW16Va','2005-10-11','pasien','blank-profile-pic.png','eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjozNCwicm9sZSI6InBhc2llbiIsImlhdCI6MTc0OTA0MzIwOCwiZXhwIjoxNzQ5MTI5NjA4fQ.As6Vl7-r3dNh2yksc2yN6LxvZaE80JbCWfjlOtWEkI4','2025-05-31 19:25:51','2025-06-04 20:20:08'),(35,'rendi','rendii@gmail.com','$2b$10$tRQtMQ./uMhn5RSvqd4aLOgmKABGKzqw.mHToPDxpe518K4saAOkS','2007-06-06','pasien','blank-profile-pic.png','eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjozNSwicm9sZSI6InBhc2llbiIsImlhdCI6MTc0ODc1NjcyNCwiZXhwIjoxNzQ4ODQzMTI0fQ.vvo1-EmR9Y9PDCb8YGLxJ7bSbAmT-EaZYCvEafJUnjQ','2025-06-01 12:45:03','2025-06-01 12:45:24'),(36,'abc','abc@gmail.com','$2b$10$pTDzUUJAtNnaKJ.em6uYp.WAMM1jSeb1fr//.UQDBflH01WeCOWOy','2003-05-30','pasien','blank-profile-pic.png',NULL,'2025-06-10 22:54:38','2025-06-10 22:57:21'),(37,'ff','f@gmail.com','$2b$10$Q0zjUC.QZCv8tk9gIjnu/OPrbL32Eq1cGwYJO9OQ0RgdzV3oTau4C','2007-07-03','pasien','profile-37-1751795462054.jpg',NULL,'2025-07-06 16:44:45','2025-07-06 16:52:06'),(38,'Soraya Haidar Salma','sorayahaidars14@gmail.com','$2b$10$wubVwrakzbr8o3s1JKIFOuZKNZKH4Clw9QbIHPORDYfLRV0H/r2Cy','2004-01-14','pasien','blank-profile-pic.png',NULL,'2025-12-01 00:11:28','2025-12-01 06:23:20'),(39,'halo','halo@gmail.com','$2b$10$YvWOOV8Jq615D.UpWDVF5.hwg/WTSMLo5.lNZ54rAhxMBSUCbSOXK','2020-02-01','pasien','blank-profile-pic.png','eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjozOSwicm9sZSI6InBhc2llbiIsImlhdCI6MTc2NDU2NDQ2NCwiZXhwIjoxNzY0NjUwODY0fQ.eoappP0yjh7R8wf1xtMHu1MC95itDUsPoiR0T5sJ1nw','2025-12-01 02:00:31','2025-12-01 11:47:44'),(40,'hai','hai@gmail.com','$2b$10$7IvdwWWixH6xjfvVhvpDmOMCKQdh0Wmn7BNrLDkJqOb7RkFdCT.um','2010-05-15','pasien','blank-profile-pic.png',NULL,'2025-12-01 02:03:29','2025-12-01 02:04:00'),(41,'Nurfadhilah Putri Bumi','nfadhilah741@gmail.com','$2b$10$1MGEXuzhbc1LEwP7S6wNc.aBADkQIkwm20O4YIv4.VVZ83iK/vDuq','2002-05-19','pasien','blank-profile-pic.png','eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjo0MSwicm9sZSI6InBhc2llbiIsImlhdCI6MTc2NDU2NjQ5OCwiZXhwIjoxNzY0NjUyODk4fQ.sdPUAmdzsOWe6og2NwFeMMWkB01jdxlaPKdK77vMyZM','2025-12-01 12:21:27','2025-12-01 12:21:38'),(42,'budi','budi@gmail.com','$2b$10$HdzQrTLhC3zr9chhslBbn.jAPoegbEhPfKXEUou9TH8yZ44zAiO4K','2000-01-01','pasien','blank-profile-pic.png',NULL,'2025-12-28 01:49:28','2026-01-19 10:26:59'),(43,'dokter super','doktersuper@gmail.com','$2b$10$EkbHYG4Wihiq82J38bSsAOG.J5C/Ht8pOoLGeoKLzV.cwLR7GtC4y','1995-01-31','pasien','blank-profile-pic.png',NULL,'2026-01-19 10:28:00','2026-01-19 10:28:34'),(45,'abjjith','abijiths467@gmail.com','$2b$10$ZaU8OTSUwDxaMwQ.9V5ElupWhmjIUJIXBE.ArcPAet6mkj72X9J9q','2009-01-25','pasien','blank-profile-pic.png','eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjo0NSwicm9sZSI6InBhc2llbiIsImlhdCI6MTc3MDcwMDc4NywiZXhwIjoxNzcwNzg3MTg3fQ.oEZEKmoWaKv24ocqL8jziW_rShJvr6MnsejtLm_YWdM','2026-02-10 12:18:33','2026-02-10 12:19:47'),(46,'Raya Taufik','rayataufik4@gmail.com','$2b$10$R4FQ6NzSMcFsBCB/tp9UVOCwkKeg1STKtTfUcqoAlfCFx4B2QVO8C','2003-06-24','dokter','blank-profile-pic.png',NULL,'2026-04-22 09:48:54','2026-04-22 09:51:07'); +/*!40000 ALTER TABLE `user` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Dumping events for database 'humicpro_intellisight' +-- + +-- +-- Dumping routines for database 'humicpro_intellisight' +-- +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2026-05-12 16:17:40 diff --git a/index.js b/index.js new file mode 100644 index 0000000..961e730 --- /dev/null +++ b/index.js @@ -0,0 +1,49 @@ +require('dotenv').config(); +const PORT = process.env.PORT || 4000; +const express = require('express'); +const app = express(); +const cors = require('cors'); +const db = require('./src/configs/database.js'); +const cookieParser = require('cookie-parser'); +const verifyJWT = require('./src/middleware/verifyJWT.js'); + +app.use( + cors({ + origin: process.env.CORS_ORIGIN, + credentials: true, + methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'], + allowedHeaders: ['Content-Type', 'Authorization'], + }) +); + +app.options('*', cors({ + origin: process.env.CORS_ORIGIN, + credentials: true, + methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'], + allowedHeaders: ['Content-Type', 'Authorization'], +})); + +app.use(express.json()); +app.use(cookieParser()); +app.use(express.static('public')); + +// Sync table pada database +(async () => { + try { + await db.sync(); + console.log('Database synced'); + } catch (err) { + console.error('DB Sync Error:', err); + } +})(); + +app.use('/auth', require('./src/routes/AuthRoutes.js')); +app.use('/user', verifyJWT, require('./src/routes/UserRoutes.js')); +app.use('/exam', verifyJWT, require('./src/routes/ExaminationRoutes.js')); +app.use((req, res) => { + res.status(404).json({ message: 'Endpoint tidak ditemukan' }); +}); + +app.listen(PORT, () => { + console.log(`Server is running on http://localhost:${PORT}`); +}); diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..c3dd9ce --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2214 @@ +{ + "name": "backend-opticscan", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "backend-opticscan", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "axios": "^1.8.4", + "bcrypt": "^5.1.1", + "cookie-parser": "^1.4.7", + "cors": "^2.8.5", + "dotenv": "^16.4.7", + "express": "^4.21.2", + "form-data": "^4.0.2", + "jsonwebtoken": "^9.0.2", + "multer": "^1.4.5-lts.2", + "mysql2": "^3.13.0", + "sequelize": "^6.37.6" + } + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "license": "BSD-3-Clause", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.13.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.10.tgz", + "integrity": "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.20.0" + } + }, + "node_modules/@types/validator": { + "version": "13.12.2", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.12.2.tgz", + "integrity": "sha512-6SlHBzUW8Jhf3liqrGGXyTJSIFe4nqlJ5A5KaMZ2l/vbM3Wh3KSybots/wfWVzNLK4D1NZluDlSQIbIEPx6oyA==", + "license": "MIT" + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "license": "ISC" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agent-base/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/agent-base/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==", + "license": "MIT" + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "license": "ISC" + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/aws-ssl-profiles": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz", + "integrity": "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/axios": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz", + "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/bcrypt": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz", + "integrity": "sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.11", + "node-addon-api": "^5.0.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "license": "BSD-3-Clause" + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "license": "ISC", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concat-stream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/concat-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/concat-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "license": "ISC" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-parser": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.7.tgz", + "integrity": "sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw==", + "license": "MIT", + "dependencies": { + "cookie": "0.7.2", + "cookie-signature": "1.0.6" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "license": "MIT" + }, + "node_modules/denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "16.4.7", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", + "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dottie": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.6.tgz", + "integrity": "sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA==", + "license": "MIT" + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "license": "MIT", + "dependencies": { + "is-property": "^1.0.2" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "license": "ISC" + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inflection": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.4.tgz", + "integrity": "sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw==", + "engines": [ + "node >= 0.4.0" + ], + "license": "MIT" + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==", + "license": "MIT" + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "license": "MIT", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jsonwebtoken/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "license": "MIT", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "license": "MIT" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "license": "MIT" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "license": "MIT" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "license": "MIT" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "license": "MIT" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "license": "MIT" + }, + "node_modules/long": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.1.tgz", + "integrity": "sha512-ka87Jz3gcx/I7Hal94xaN2tZEOPoUOEVftkQqZx2EeQRN7LGdfLlI3FvZ+7WDplm+vK2Urx9ULrvSowtdCieng==", + "license": "Apache-2.0" + }, + "node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/lru.min": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.2.tgz", + "integrity": "sha512-Nv9KddBcQSlQopmBHXSsZVY5xsdlZkdH/Iey0BlcBYggMd4two7cZnKOK9vmy3nY0O5RGH99z1PCeTpPqszUYg==", + "license": "MIT", + "engines": { + "bun": ">=1.0.0", + "deno": ">=1.30.0", + "node": ">=8.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wellwelwel" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/moment-timezone": { + "version": "0.5.47", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.47.tgz", + "integrity": "sha512-UbNt/JAWS0m/NJOebR0QMRHBk0hu03r5dx9GK8Cs0AS3I81yDcOc9k+DytPItgVvBP7J6Mf6U2n3BPAacAV9oA==", + "license": "MIT", + "dependencies": { + "moment": "^2.29.4" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/multer": { + "version": "1.4.5-lts.2", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.2.tgz", + "integrity": "sha512-VzGiVigcG9zUAoCNU+xShztrlr1auZOlurXynNvO9GiWD1/mTBbUljOKY+qMeazBqXgRnjzeEgJI/wyjJUHg9A==", + "license": "MIT", + "dependencies": { + "append-field": "^1.0.0", + "busboy": "^1.0.0", + "concat-stream": "^1.5.2", + "mkdirp": "^0.5.4", + "object-assign": "^4.1.1", + "type-is": "^1.6.4", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/multer/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mysql2": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.13.0.tgz", + "integrity": "sha512-M6DIQjTqKeqXH5HLbLMxwcK5XfXHw30u5ap6EZmu7QVmcF/gnh2wS/EOiQ4MTbXz/vQeoXrmycPlVRM00WSslg==", + "license": "MIT", + "dependencies": { + "aws-ssl-profiles": "^1.1.1", + "denque": "^2.1.0", + "generate-function": "^2.3.1", + "iconv-lite": "^0.6.3", + "long": "^5.2.1", + "lru.min": "^1.0.0", + "named-placeholders": "^1.1.3", + "seq-queue": "^0.0.5", + "sqlstring": "^2.3.2" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/mysql2/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/named-placeholders": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz", + "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==", + "license": "MIT", + "dependencies": { + "lru-cache": "^7.14.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-addon-api": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==", + "license": "MIT" + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "license": "ISC", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" + }, + "node_modules/pg-connection-string": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.7.0.tgz", + "integrity": "sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA==", + "license": "MIT" + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/retry-as-promised": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-7.1.1.tgz", + "integrity": "sha512-hMD7odLOt3LkTjcif8aRZqi/hybjpLNgSk5oF5FCowfCjok6LukpN2bDX7R5wDmbgBQFn7YoBxSagmtXHaJYJw==", + "license": "MIT" + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/seq-queue": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", + "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==" + }, + "node_modules/sequelize": { + "version": "6.37.6", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.37.6.tgz", + "integrity": "sha512-4Slqjqpktofs7AVqWviFOInzP9w8ZRQDhF+DnRtm4WKIdIATpyzGgedyseP3xbgpBxapvfQcJv6CeIdZe4ZL2A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/sequelize" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.1.8", + "@types/validator": "^13.7.17", + "debug": "^4.3.4", + "dottie": "^2.0.6", + "inflection": "^1.13.4", + "lodash": "^4.17.21", + "moment": "^2.29.4", + "moment-timezone": "^0.5.43", + "pg-connection-string": "^2.6.1", + "retry-as-promised": "^7.0.4", + "semver": "^7.5.4", + "sequelize-pool": "^7.1.0", + "toposort-class": "^1.0.1", + "uuid": "^8.3.2", + "validator": "^13.9.0", + "wkx": "^0.5.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependenciesMeta": { + "ibm_db": { + "optional": true + }, + "mariadb": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "oracledb": { + "optional": true + }, + "pg": { + "optional": true + }, + "pg-hstore": { + "optional": true + }, + "snowflake-sdk": { + "optional": true + }, + "sqlite3": { + "optional": true + }, + "tedious": { + "optional": true + } + } + }, + "node_modules/sequelize-pool": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-7.1.0.tgz", + "integrity": "sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/sequelize/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/sequelize/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "license": "ISC" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/sqlstring": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz", + "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/toposort-class": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz", + "integrity": "sha512-OsLcGGbYF3rMjPUf8oKktyvCiUxSbqMMS39m33MAjLTC1DVIH6x3WSt63/M77ihI09+Sdfk1AXvfhCEeUmC7mg==", + "license": "MIT" + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "license": "MIT" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/validator": { + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.12.0.tgz", + "integrity": "sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "license": "ISC", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wkx": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz", + "integrity": "sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..7fc9701 --- /dev/null +++ b/package.json @@ -0,0 +1,32 @@ +{ + "name": "backend-opticscan", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "dev": "nodemon index.js" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/optic-scan/backend-optic-scan.git" + }, + "author": "diasdigital", + "license": "ISC", + "bugs": { + "url": "https://github.com/optic-scan/backend-optic-scan/issues" + }, + "homepage": "https://github.com/optic-scan/backend-optic-scan#readme", + "dependencies": { + "axios": "^1.8.4", + "bcrypt": "^5.1.1", + "cookie-parser": "^1.4.7", + "cors": "^2.8.5", + "dotenv": "^16.4.7", + "express": "^4.21.2", + "form-data": "^4.0.2", + "jsonwebtoken": "^9.0.2", + "multer": "^1.4.5-lts.2", + "mysql2": "^3.13.0", + "sequelize": "^6.37.6" + } +} diff --git a/public/images/eye-scans/eye-1-1746603939908.jpg b/public/images/eye-scans/eye-1-1746603939908.jpg new file mode 100644 index 0000000..864d5f4 Binary files /dev/null and b/public/images/eye-scans/eye-1-1746603939908.jpg differ diff --git a/public/images/eye-scans/eye-1-1747638202673.jpg b/public/images/eye-scans/eye-1-1747638202673.jpg new file mode 100644 index 0000000..864d5f4 Binary files /dev/null and b/public/images/eye-scans/eye-1-1747638202673.jpg differ diff --git a/public/images/eye-scans/eye-1-1748104777555.jpg b/public/images/eye-scans/eye-1-1748104777555.jpg new file mode 100644 index 0000000..864d5f4 Binary files /dev/null and b/public/images/eye-scans/eye-1-1748104777555.jpg differ diff --git a/public/images/eye-scans/eye-1-1748104791775.jpg b/public/images/eye-scans/eye-1-1748104791775.jpg new file mode 100644 index 0000000..864d5f4 Binary files /dev/null and b/public/images/eye-scans/eye-1-1748104791775.jpg differ diff --git a/public/images/eye-scans/eye-11-1747630437329.jpg b/public/images/eye-scans/eye-11-1747630437329.jpg new file mode 100644 index 0000000..644c6cf Binary files /dev/null and b/public/images/eye-scans/eye-11-1747630437329.jpg differ diff --git a/public/images/eye-scans/eye-11-1747635943178.jpg b/public/images/eye-scans/eye-11-1747635943178.jpg new file mode 100644 index 0000000..644c6cf Binary files /dev/null and b/public/images/eye-scans/eye-11-1747635943178.jpg differ diff --git a/public/images/eye-scans/eye-11-1753341105248.jpg b/public/images/eye-scans/eye-11-1753341105248.jpg new file mode 100644 index 0000000..7cf9b56 Binary files /dev/null and b/public/images/eye-scans/eye-11-1753341105248.jpg differ diff --git a/public/images/eye-scans/eye-12-1747636999269.jpeg b/public/images/eye-scans/eye-12-1747636999269.jpeg new file mode 100644 index 0000000..ae58c57 Binary files /dev/null and b/public/images/eye-scans/eye-12-1747636999269.jpeg differ diff --git a/public/images/eye-scans/eye-12-1748407166492.jpeg b/public/images/eye-scans/eye-12-1748407166492.jpeg new file mode 100644 index 0000000..20055a6 Binary files /dev/null and b/public/images/eye-scans/eye-12-1748407166492.jpeg differ diff --git a/public/images/eye-scans/eye-13-1747714157381.png b/public/images/eye-scans/eye-13-1747714157381.png new file mode 100644 index 0000000..ae59c86 Binary files /dev/null and b/public/images/eye-scans/eye-13-1747714157381.png differ diff --git a/public/images/eye-scans/eye-13-1747721135543.jpg b/public/images/eye-scans/eye-13-1747721135543.jpg new file mode 100644 index 0000000..60782b3 Binary files /dev/null and b/public/images/eye-scans/eye-13-1747721135543.jpg differ diff --git a/public/images/eye-scans/eye-13-1747721258581.jpg b/public/images/eye-scans/eye-13-1747721258581.jpg new file mode 100644 index 0000000..ebcb707 Binary files /dev/null and b/public/images/eye-scans/eye-13-1747721258581.jpg differ diff --git a/public/images/eye-scans/eye-13-1747721313466.jpg b/public/images/eye-scans/eye-13-1747721313466.jpg new file mode 100644 index 0000000..c719398 Binary files /dev/null and b/public/images/eye-scans/eye-13-1747721313466.jpg differ diff --git a/public/images/eye-scans/eye-13-1747721376526.jpg b/public/images/eye-scans/eye-13-1747721376526.jpg new file mode 100644 index 0000000..0b2ce63 Binary files /dev/null and b/public/images/eye-scans/eye-13-1747721376526.jpg differ diff --git a/public/images/eye-scans/eye-13-1747721462046.jpg b/public/images/eye-scans/eye-13-1747721462046.jpg new file mode 100644 index 0000000..b84450c Binary files /dev/null and b/public/images/eye-scans/eye-13-1747721462046.jpg differ diff --git a/public/images/eye-scans/eye-13-1749344534940.jpg b/public/images/eye-scans/eye-13-1749344534940.jpg new file mode 100644 index 0000000..64bc838 Binary files /dev/null and b/public/images/eye-scans/eye-13-1749344534940.jpg differ diff --git a/public/images/eye-scans/eye-13-1749459258929.jpg b/public/images/eye-scans/eye-13-1749459258929.jpg new file mode 100644 index 0000000..02250be Binary files /dev/null and b/public/images/eye-scans/eye-13-1749459258929.jpg differ diff --git a/public/images/eye-scans/eye-13-1749459269018.jpg b/public/images/eye-scans/eye-13-1749459269018.jpg new file mode 100644 index 0000000..02250be Binary files /dev/null and b/public/images/eye-scans/eye-13-1749459269018.jpg differ diff --git a/public/images/eye-scans/eye-13-1749459333356.jpeg b/public/images/eye-scans/eye-13-1749459333356.jpeg new file mode 100644 index 0000000..2b0c759 Binary files /dev/null and b/public/images/eye-scans/eye-13-1749459333356.jpeg differ diff --git a/public/images/eye-scans/eye-13-1749460655110.jpeg b/public/images/eye-scans/eye-13-1749460655110.jpeg new file mode 100644 index 0000000..2b0c759 Binary files /dev/null and b/public/images/eye-scans/eye-13-1749460655110.jpeg differ diff --git a/public/images/eye-scans/eye-13-1749460664415.jpeg b/public/images/eye-scans/eye-13-1749460664415.jpeg new file mode 100644 index 0000000..2b0c759 Binary files /dev/null and b/public/images/eye-scans/eye-13-1749460664415.jpeg differ diff --git a/public/images/eye-scans/eye-13-1749460720210.jpeg b/public/images/eye-scans/eye-13-1749460720210.jpeg new file mode 100644 index 0000000..2b0c759 Binary files /dev/null and b/public/images/eye-scans/eye-13-1749460720210.jpeg differ diff --git a/public/images/eye-scans/eye-13-1749460740714.jpeg b/public/images/eye-scans/eye-13-1749460740714.jpeg new file mode 100644 index 0000000..2b0c759 Binary files /dev/null and b/public/images/eye-scans/eye-13-1749460740714.jpeg differ diff --git a/public/images/eye-scans/eye-13-1749460752598.jpeg b/public/images/eye-scans/eye-13-1749460752598.jpeg new file mode 100644 index 0000000..2b0c759 Binary files /dev/null and b/public/images/eye-scans/eye-13-1749460752598.jpeg differ diff --git a/public/images/eye-scans/eye-13-1749460877643.jpg b/public/images/eye-scans/eye-13-1749460877643.jpg new file mode 100644 index 0000000..e4e02bd Binary files /dev/null and b/public/images/eye-scans/eye-13-1749460877643.jpg differ diff --git a/public/images/eye-scans/eye-13-1756961274053.jpg b/public/images/eye-scans/eye-13-1756961274053.jpg new file mode 100644 index 0000000..7cf9b56 Binary files /dev/null and b/public/images/eye-scans/eye-13-1756961274053.jpg differ diff --git a/public/images/eye-scans/eye-13-1757907628078.jpg b/public/images/eye-scans/eye-13-1757907628078.jpg new file mode 100644 index 0000000..75afd54 Binary files /dev/null and b/public/images/eye-scans/eye-13-1757907628078.jpg differ diff --git a/public/images/eye-scans/eye-13-1764507155226.jpg b/public/images/eye-scans/eye-13-1764507155226.jpg new file mode 100644 index 0000000..1c50b11 Binary files /dev/null and b/public/images/eye-scans/eye-13-1764507155226.jpg differ diff --git a/public/images/eye-scans/eye-13-1776825776736.jpg b/public/images/eye-scans/eye-13-1776825776736.jpg new file mode 100644 index 0000000..644c6cf Binary files /dev/null and b/public/images/eye-scans/eye-13-1776825776736.jpg differ diff --git a/public/images/eye-scans/eye-13-1776826301933.jpg b/public/images/eye-scans/eye-13-1776826301933.jpg new file mode 100644 index 0000000..644c6cf Binary files /dev/null and b/public/images/eye-scans/eye-13-1776826301933.jpg differ diff --git a/public/images/eye-scans/eye-15-1748104743502.jpg b/public/images/eye-scans/eye-15-1748104743502.jpg new file mode 100644 index 0000000..864d5f4 Binary files /dev/null and b/public/images/eye-scans/eye-15-1748104743502.jpg differ diff --git a/public/images/eye-scans/eye-16-1748184175929.jpg b/public/images/eye-scans/eye-16-1748184175929.jpg new file mode 100644 index 0000000..6ae211b Binary files /dev/null and b/public/images/eye-scans/eye-16-1748184175929.jpg differ diff --git a/public/images/eye-scans/eye-17-1748321790413.jpg b/public/images/eye-scans/eye-17-1748321790413.jpg new file mode 100644 index 0000000..073180d Binary files /dev/null and b/public/images/eye-scans/eye-17-1748321790413.jpg differ diff --git a/public/images/eye-scans/eye-19-1748322117967.jpg b/public/images/eye-scans/eye-19-1748322117967.jpg new file mode 100644 index 0000000..b120826 Binary files /dev/null and b/public/images/eye-scans/eye-19-1748322117967.jpg differ diff --git a/public/images/eye-scans/eye-20-1748323577474.jpeg b/public/images/eye-scans/eye-20-1748323577474.jpeg new file mode 100644 index 0000000..af1e6c7 Binary files /dev/null and b/public/images/eye-scans/eye-20-1748323577474.jpeg differ diff --git a/public/images/eye-scans/eye-21-1748323268415.png b/public/images/eye-scans/eye-21-1748323268415.png new file mode 100644 index 0000000..3e4f5ca Binary files /dev/null and b/public/images/eye-scans/eye-21-1748323268415.png differ diff --git a/public/images/eye-scans/eye-22-1748323785040.png b/public/images/eye-scans/eye-22-1748323785040.png new file mode 100644 index 0000000..1be9dcc Binary files /dev/null and b/public/images/eye-scans/eye-22-1748323785040.png differ diff --git a/public/images/eye-scans/eye-23-1748355275508.jpeg b/public/images/eye-scans/eye-23-1748355275508.jpeg new file mode 100644 index 0000000..ef85764 Binary files /dev/null and b/public/images/eye-scans/eye-23-1748355275508.jpeg differ diff --git a/public/images/eye-scans/eye-25-1748325470185.png b/public/images/eye-scans/eye-25-1748325470185.png new file mode 100644 index 0000000..00b2cb5 Binary files /dev/null and b/public/images/eye-scans/eye-25-1748325470185.png differ diff --git a/public/images/eye-scans/eye-26-1748335390328.png b/public/images/eye-scans/eye-26-1748335390328.png new file mode 100644 index 0000000..08c6cd1 Binary files /dev/null and b/public/images/eye-scans/eye-26-1748335390328.png differ diff --git a/public/images/eye-scans/eye-3-1746880654372.jpg b/public/images/eye-scans/eye-3-1746880654372.jpg new file mode 100644 index 0000000..9bfa157 Binary files /dev/null and b/public/images/eye-scans/eye-3-1746880654372.jpg differ diff --git a/public/images/eye-scans/eye-3-1746934704652.jpg b/public/images/eye-scans/eye-3-1746934704652.jpg new file mode 100644 index 0000000..8ed44fc Binary files /dev/null and b/public/images/eye-scans/eye-3-1746934704652.jpg differ diff --git a/public/images/eye-scans/eye-3-1747138514393.jpg b/public/images/eye-scans/eye-3-1747138514393.jpg new file mode 100644 index 0000000..0216e03 Binary files /dev/null and b/public/images/eye-scans/eye-3-1747138514393.jpg differ diff --git a/public/images/eye-scans/eye-3-1747140383150.jpg b/public/images/eye-scans/eye-3-1747140383150.jpg new file mode 100644 index 0000000..a1e7b57 Binary files /dev/null and b/public/images/eye-scans/eye-3-1747140383150.jpg differ diff --git a/public/images/eye-scans/eye-3-1747578124889.jpg b/public/images/eye-scans/eye-3-1747578124889.jpg new file mode 100644 index 0000000..1b383f0 Binary files /dev/null and b/public/images/eye-scans/eye-3-1747578124889.jpg differ diff --git a/public/images/eye-scans/eye-3-1747581815129.jpg b/public/images/eye-scans/eye-3-1747581815129.jpg new file mode 100644 index 0000000..6947731 Binary files /dev/null and b/public/images/eye-scans/eye-3-1747581815129.jpg differ diff --git a/public/images/eye-scans/eye-3-1747719621883.png b/public/images/eye-scans/eye-3-1747719621883.png new file mode 100644 index 0000000..698d28e Binary files /dev/null and b/public/images/eye-scans/eye-3-1747719621883.png differ diff --git a/public/images/eye-scans/eye-30-1748693882385.jpg b/public/images/eye-scans/eye-30-1748693882385.jpg new file mode 100644 index 0000000..d3fc21d Binary files /dev/null and b/public/images/eye-scans/eye-30-1748693882385.jpg differ diff --git a/public/images/eye-scans/eye-31-1748694025317.jpg b/public/images/eye-scans/eye-31-1748694025317.jpg new file mode 100644 index 0000000..a7af1d0 Binary files /dev/null and b/public/images/eye-scans/eye-31-1748694025317.jpg differ diff --git a/public/images/eye-scans/eye-32-1748694145642.jpg b/public/images/eye-scans/eye-32-1748694145642.jpg new file mode 100644 index 0000000..426de53 Binary files /dev/null and b/public/images/eye-scans/eye-32-1748694145642.jpg differ diff --git a/public/images/eye-scans/eye-33-1748694256824.jpg b/public/images/eye-scans/eye-33-1748694256824.jpg new file mode 100644 index 0000000..6b189ea Binary files /dev/null and b/public/images/eye-scans/eye-33-1748694256824.jpg differ diff --git a/public/images/eye-scans/eye-34-1748694474917.jpg b/public/images/eye-scans/eye-34-1748694474917.jpg new file mode 100644 index 0000000..13c88b6 Binary files /dev/null and b/public/images/eye-scans/eye-34-1748694474917.jpg differ diff --git a/public/images/eye-scans/eye-36-1749570952911.jpg b/public/images/eye-scans/eye-36-1749570952911.jpg new file mode 100644 index 0000000..e977606 Binary files /dev/null and b/public/images/eye-scans/eye-36-1749570952911.jpg differ diff --git a/public/images/eye-scans/eye-38-1764522930780.jpg b/public/images/eye-scans/eye-38-1764522930780.jpg new file mode 100644 index 0000000..778072b Binary files /dev/null and b/public/images/eye-scans/eye-38-1764522930780.jpg differ diff --git a/public/images/eye-scans/eye-38-1764522987381.jpeg b/public/images/eye-scans/eye-38-1764522987381.jpeg new file mode 100644 index 0000000..0b9f889 Binary files /dev/null and b/public/images/eye-scans/eye-38-1764522987381.jpeg differ diff --git a/public/images/eye-scans/eye-39-1764529319665.jpg b/public/images/eye-scans/eye-39-1764529319665.jpg new file mode 100644 index 0000000..5258389 Binary files /dev/null and b/public/images/eye-scans/eye-39-1764529319665.jpg differ diff --git a/public/images/eye-scans/eye-39-1764531305428.jpg b/public/images/eye-scans/eye-39-1764531305428.jpg new file mode 100644 index 0000000..5258389 Binary files /dev/null and b/public/images/eye-scans/eye-39-1764531305428.jpg differ diff --git a/public/images/eye-scans/eye-39-1764564530102.jpg b/public/images/eye-scans/eye-39-1764564530102.jpg new file mode 100644 index 0000000..1f37090 Binary files /dev/null and b/public/images/eye-scans/eye-39-1764564530102.jpg differ diff --git a/public/images/eye-scans/eye-4-1746801130977.jpg b/public/images/eye-scans/eye-4-1746801130977.jpg new file mode 100644 index 0000000..5553b69 Binary files /dev/null and b/public/images/eye-scans/eye-4-1746801130977.jpg differ diff --git a/public/images/eye-scans/eye-4-1746801342768.jpg b/public/images/eye-scans/eye-4-1746801342768.jpg new file mode 100644 index 0000000..07d2b85 Binary files /dev/null and b/public/images/eye-scans/eye-4-1746801342768.jpg differ diff --git a/public/images/eye-scans/eye-41-1764566667976.jpg b/public/images/eye-scans/eye-41-1764566667976.jpg new file mode 100644 index 0000000..c144a51 Binary files /dev/null and b/public/images/eye-scans/eye-41-1764566667976.jpg differ diff --git a/public/images/eye-scans/eye-41-1764566839347.jpg b/public/images/eye-scans/eye-41-1764566839347.jpg new file mode 100644 index 0000000..670af01 Binary files /dev/null and b/public/images/eye-scans/eye-41-1764566839347.jpg differ diff --git a/public/images/eye-scans/eye-43-1768793306564.jpg b/public/images/eye-scans/eye-43-1768793306564.jpg new file mode 100644 index 0000000..864d5f4 Binary files /dev/null and b/public/images/eye-scans/eye-43-1768793306564.jpg differ diff --git a/public/images/eye-scans/eye-45-1770700899959.jpg b/public/images/eye-scans/eye-45-1770700899959.jpg new file mode 100644 index 0000000..6a03a9c Binary files /dev/null and b/public/images/eye-scans/eye-45-1770700899959.jpg differ diff --git a/public/images/eye-scans/eye-5-1746610839414.jpeg b/public/images/eye-scans/eye-5-1746610839414.jpeg new file mode 100644 index 0000000..a16dcc7 Binary files /dev/null and b/public/images/eye-scans/eye-5-1746610839414.jpeg differ diff --git a/public/images/eye-scans/eye-5-1746613043377.jpg b/public/images/eye-scans/eye-5-1746613043377.jpg new file mode 100644 index 0000000..d136a5b Binary files /dev/null and b/public/images/eye-scans/eye-5-1746613043377.jpg differ diff --git a/public/images/eye-scans/eye-5-1746613119751.jpg b/public/images/eye-scans/eye-5-1746613119751.jpg new file mode 100644 index 0000000..d136a5b Binary files /dev/null and b/public/images/eye-scans/eye-5-1746613119751.jpg differ diff --git a/public/images/eye-scans/eye-5-1746637578724.jpg b/public/images/eye-scans/eye-5-1746637578724.jpg new file mode 100644 index 0000000..a16dcc7 Binary files /dev/null and b/public/images/eye-scans/eye-5-1746637578724.jpg differ diff --git a/public/images/eye-scans/eye-5-1746695774945.jpg b/public/images/eye-scans/eye-5-1746695774945.jpg new file mode 100644 index 0000000..a16dcc7 Binary files /dev/null and b/public/images/eye-scans/eye-5-1746695774945.jpg differ diff --git a/public/images/eye-scans/eye-5-1746699850546.jpg b/public/images/eye-scans/eye-5-1746699850546.jpg new file mode 100644 index 0000000..a16dcc7 Binary files /dev/null and b/public/images/eye-scans/eye-5-1746699850546.jpg differ diff --git a/public/images/eye-scans/eye-5-1746701536802.jpg b/public/images/eye-scans/eye-5-1746701536802.jpg new file mode 100644 index 0000000..a16dcc7 Binary files /dev/null and b/public/images/eye-scans/eye-5-1746701536802.jpg differ diff --git a/public/images/eye-scans/eye-5-1746701536969.jpg b/public/images/eye-scans/eye-5-1746701536969.jpg new file mode 100644 index 0000000..a16dcc7 Binary files /dev/null and b/public/images/eye-scans/eye-5-1746701536969.jpg differ diff --git a/public/images/eye-scans/eye-5-1746799649547.jpg b/public/images/eye-scans/eye-5-1746799649547.jpg new file mode 100644 index 0000000..a16dcc7 Binary files /dev/null and b/public/images/eye-scans/eye-5-1746799649547.jpg differ diff --git a/public/images/eye-scans/eye-5-1747134278864.jpg b/public/images/eye-scans/eye-5-1747134278864.jpg new file mode 100644 index 0000000..a16dcc7 Binary files /dev/null and b/public/images/eye-scans/eye-5-1747134278864.jpg differ diff --git a/public/images/eye-scans/eye-5-1747581476451.jpg b/public/images/eye-scans/eye-5-1747581476451.jpg new file mode 100644 index 0000000..a16dcc7 Binary files /dev/null and b/public/images/eye-scans/eye-5-1747581476451.jpg differ diff --git a/public/images/eye-scans/eye-6-1746780977020.jpeg b/public/images/eye-scans/eye-6-1746780977020.jpeg new file mode 100644 index 0000000..a16dcc7 Binary files /dev/null and b/public/images/eye-scans/eye-6-1746780977020.jpeg differ diff --git a/public/images/eye-scans/eye-6-1746781016341.jpeg b/public/images/eye-scans/eye-6-1746781016341.jpeg new file mode 100644 index 0000000..a16dcc7 Binary files /dev/null and b/public/images/eye-scans/eye-6-1746781016341.jpeg differ diff --git a/public/images/eye-scans/eye-9-1747630412642.jpg b/public/images/eye-scans/eye-9-1747630412642.jpg new file mode 100644 index 0000000..8eb7eff Binary files /dev/null and b/public/images/eye-scans/eye-9-1747630412642.jpg differ diff --git a/public/images/eye-scans/eye-9-1747636159710.jpg b/public/images/eye-scans/eye-9-1747636159710.jpg new file mode 100644 index 0000000..8eb7eff Binary files /dev/null and b/public/images/eye-scans/eye-9-1747636159710.jpg differ diff --git a/public/images/eye-scans/eye-9-1747648014127.jpg b/public/images/eye-scans/eye-9-1747648014127.jpg new file mode 100644 index 0000000..5c35ed9 Binary files /dev/null and b/public/images/eye-scans/eye-9-1747648014127.jpg differ diff --git a/public/images/eye-scans/eye-9-1747648119757.jpg b/public/images/eye-scans/eye-9-1747648119757.jpg new file mode 100644 index 0000000..9d1e224 Binary files /dev/null and b/public/images/eye-scans/eye-9-1747648119757.jpg differ diff --git a/public/images/eye-scans/eye-9-1747648172573.jpg b/public/images/eye-scans/eye-9-1747648172573.jpg new file mode 100644 index 0000000..92e1c85 Binary files /dev/null and b/public/images/eye-scans/eye-9-1747648172573.jpg differ diff --git a/public/images/profile-pics/blank-profile-pic.png b/public/images/profile-pics/blank-profile-pic.png new file mode 100644 index 0000000..1f8e665 Binary files /dev/null and b/public/images/profile-pics/blank-profile-pic.png differ diff --git a/public/images/profile-pics/profile-15-1748104697394.png b/public/images/profile-pics/profile-15-1748104697394.png new file mode 100644 index 0000000..0c16bed Binary files /dev/null and b/public/images/profile-pics/profile-15-1748104697394.png differ diff --git a/public/images/profile-pics/profile-2-1748708600159.png b/public/images/profile-pics/profile-2-1748708600159.png new file mode 100644 index 0000000..b315457 Binary files /dev/null and b/public/images/profile-pics/profile-2-1748708600159.png differ diff --git a/public/images/profile-pics/profile-3-1748081062431.jpg b/public/images/profile-pics/profile-3-1748081062431.jpg new file mode 100644 index 0000000..a5cdb62 Binary files /dev/null and b/public/images/profile-pics/profile-3-1748081062431.jpg differ diff --git a/public/images/profile-pics/profile-37-1751795462054.jpg b/public/images/profile-pics/profile-37-1751795462054.jpg new file mode 100644 index 0000000..e502e4c Binary files /dev/null and b/public/images/profile-pics/profile-37-1751795462054.jpg differ diff --git a/public/images/profile-pics/profile-5-1746716864232.jpg b/public/images/profile-pics/profile-5-1746716864232.jpg new file mode 100644 index 0000000..820cd69 Binary files /dev/null and b/public/images/profile-pics/profile-5-1746716864232.jpg differ diff --git a/public/images/profile-pics/profile-7-1747223446863.jpg b/public/images/profile-pics/profile-7-1747223446863.jpg new file mode 100644 index 0000000..00a29a0 Binary files /dev/null and b/public/images/profile-pics/profile-7-1747223446863.jpg differ diff --git a/src/configs/database.js b/src/configs/database.js new file mode 100644 index 0000000..1a15cca --- /dev/null +++ b/src/configs/database.js @@ -0,0 +1,19 @@ +const { Sequelize } = require('sequelize'); + +const db = new Sequelize( + process.env.DB_NAME, + process.env.DB_USER, + process.env.DB_PASS, + { + host: process.env.DB_HOST, + dialect: 'mysql', + timezone: '+07:00', + define: { + freezeTableName: true, + createdAt: 'created_at', + updatedAt: 'updated_at', + }, + } +); + +module.exports = db; diff --git a/src/controllers/auth/AuthenticateUserController.js b/src/controllers/auth/AuthenticateUserController.js new file mode 100644 index 0000000..b43399b --- /dev/null +++ b/src/controllers/auth/AuthenticateUserController.js @@ -0,0 +1,18 @@ +const { User } = require('../../models'); + +const handleAuthenticateUser = async (req, res) => { + const token = req.cookies.jwt; + + if (!token) { + return res.status(401).json({ authenticated: false }); + } + + isTokenValid = User.findOne({ where: { refresh_token: token } }); + if (!isTokenValid) { + return res.status(401).json({ authenticated: false }); + } + + return res.json({ authenticated: true }); +}; + +module.exports = handleAuthenticateUser; diff --git a/src/controllers/auth/LoginController.js b/src/controllers/auth/LoginController.js new file mode 100644 index 0000000..77613dc --- /dev/null +++ b/src/controllers/auth/LoginController.js @@ -0,0 +1,71 @@ +const { User } = require('../../models'); +const bcrypt = require('bcrypt'); +const jwt = require('jsonwebtoken'); +const { + generateAccessToken, + generateRefreshToken, +} = require('../../utils/jwt.js'); +require('dotenv').config(); + +const handleLogin = async (req, res) => { + const { email, password } = req.body; + if (!email || !password) { + return res + .status(400) + .json({ message: 'Email dan password wajib ada' }); + } + + try { + const userFound = await User.findOne({ + where: { email }, + attributes: ['user_id', 'email', 'password', 'role'], + }); + if (!userFound) { + return res + .status(401) + .json({ message: 'Email atau password salah' }); + } + const isPasswordMatch = await bcrypt.compare( + password, + userFound.password + ); + if (!isPasswordMatch) { + return res + .status(401) + .json({ message: 'Email atau password salah' }); + } + + const accessToken = generateAccessToken({ + user_id: userFound.user_id, + role: userFound.role, + }); + const refreshToken = generateRefreshToken({ + user_id: userFound.user_id, + role: userFound.role, + }); + + await User.update( + { refresh_token: refreshToken }, + { where: { user_id: userFound.user_id } } + ); + + res.cookie('jwt', refreshToken, { + httpOnly: true, + maxAge: 24 * 60 * 60 * 1000, + sameSite: 'Lax', + secure: false, + }); + return res.status(200).json({ + message: 'Login berhasil', + role: userFound.role, + accessToken, + }); + } catch (error) { + console.error(error); + return res.status(500).json({ + message: 'Terjadi kesalahan saat login pada server', + }); + } +}; + +module.exports = handleLogin; diff --git a/src/controllers/auth/LogoutController.js b/src/controllers/auth/LogoutController.js new file mode 100644 index 0000000..9b2da90 --- /dev/null +++ b/src/controllers/auth/LogoutController.js @@ -0,0 +1,39 @@ +const { User } = require('../../models'); + +const handleLogout = async (req, res) => { + const refreshToken = req.cookies?.jwt; + if (!refreshToken) { + return res + .status(200) + .json({ message: 'Tidak ada token pada cookie, sudah logout' }); + } + + try { + const userFound = await User.findOne({ + where: { refresh_token: refreshToken }, + }); + if (!userFound) { + res.clearCookie('jwt', { + httpOnly: true, + maxAge: 24 * 60 * 60 * 1000, + sameSite: 'Lax', + secure: false, + }); + return res.status(200).json({ + message: 'User tidak ditemukan, cookie sudah dibersihkan', + }); + } + + await userFound.update({ refresh_token: null }); + res.clearCookie('jwt', refreshToken, { + httpOnly: true, + maxAge: 24 * 60 * 60 * 1000, + }); + return res.status(200).json({ message: 'Logout berhasil' }); + } catch (error) { + console.error(error); + return res.status(500).json({ message: 'Gagal logout' }); + } +}; + +module.exports = handleLogout; diff --git a/src/controllers/auth/RefreshTokenController.js b/src/controllers/auth/RefreshTokenController.js new file mode 100644 index 0000000..ac384c5 --- /dev/null +++ b/src/controllers/auth/RefreshTokenController.js @@ -0,0 +1,49 @@ +const jwt = require('jsonwebtoken'); +const { User } = require('../../models'); +const { generateAccessToken } = require('../../utils/jwt'); +require('dotenv').config(); + +const handleRefreshToken = async (req, res) => { + const cookies = req.cookies; + if (!cookies?.jwt) + return res.status(401).json({ message: 'Token refresh tidak ada' }); + + const refreshToken = cookies.jwt; + + try { + const userFound = await User.findOne({ + where: { refresh_token: refreshToken }, + }); + + if (!userFound) + return res + .status(403) + .json({ message: 'Akses ditolak. Silakan login kembali.' }); + + jwt.verify( + refreshToken, + process.env.REFRESH_TOKEN_SECRET, + (err, decoded) => { + if (err || decoded.user_id !== userFound.user_id) + return res.status(403).json({ + message: 'Token tidak valid. Silakan login kembali', + }); + + const accessToken = generateAccessToken({ + user_id: userFound.user_id, + role: userFound.role, + }); + + return res.status(200).json({ + message: 'Access token terbaru berhasil dibuat', + accessToken, + }); + } + ); + } catch (error) { + console.error(error); + return res.status(500).json({ message: 'Gagal memperbarui token' }); + } +}; + +module.exports = handleRefreshToken; diff --git a/src/controllers/auth/RegisterController.js b/src/controllers/auth/RegisterController.js new file mode 100644 index 0000000..1f1ef7d --- /dev/null +++ b/src/controllers/auth/RegisterController.js @@ -0,0 +1,45 @@ +const { User } = require('../../models'); +const bcrypt = require('bcrypt'); + +const handleRegister = async (req, res) => { + const { name, email, birthdate, role, password } = req.body; + if (!name || !email || !birthdate || !role || !password) { + return res.status(400).json({ message: 'Data tidak lengkap' }); + } + + if (role !== 'pasien' && role !== 'dokter') { + return res.status(400).json({ message: 'Role tidak valid' }); + } + + const isEmail = (email) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email); + + if (!isEmail(email)) { + return res.status(400).json({ message: 'Format email tidak valid' }); + } + + const duplicate = await User.findOne({ + where: { email }, + }); + if (duplicate) + return res.status(409).json({ message: 'Email sudah terdaftar' }); + + try { + const hashedPwd = await bcrypt.hash(password, 10); + const newUser = { + name, + email, + birthdate, + role, + password: hashedPwd, + profile_pic: 'blank-profile-pic.png', + refresh_token: null, + }; + await User.create(newUser); + return res.status(201).json({ message: 'User baru berhasil dibuat' }); + } catch (error) { + console.error(error); + return res.status(500).json({ message: error.message }); + } +}; + +module.exports = handleRegister; diff --git a/src/controllers/exam/ExaminationController.js b/src/controllers/exam/ExaminationController.js new file mode 100644 index 0000000..71fe74e --- /dev/null +++ b/src/controllers/exam/ExaminationController.js @@ -0,0 +1,177 @@ +const { Op } = require('sequelize'); +const axios = require('axios'); +const path = require('path'); +const fs = require('fs'); +const FormData = require('form-data'); +const { User, Examination } = require('../../models'); + +const getExamResult = async (req, res) => { + const user_id = req.user_id; + + try { + const response = await Examination.findAll({ + where: { + [Op.or]: [{ patient_id: user_id }, { doctor_id: user_id }], + }, + include: [ + { + model: User, + as: 'patient', + attributes: ['name', 'birthdate'], + }, + { model: User, as: 'doctor', attributes: ['name'] }, + ], + order: [['created_at', 'DESC']], + }); + return res.status(200).json({ + message: `Data hasil pemeriksaan berdasarkan user login berhasil diambil`, + data: response, + }); + } catch (error) { + return res.status(500).json({ message: error.message, data: null }); + } +}; + +const submitExam = async (req, res) => { + if (req.fileValidationError) { + return res.status(400).json({ message: req.fileValidationError }); + } + + if (!req.file) { + return res.status(400).json({ message: 'Gambar mata tidak ditemukan' }); + } + + if (req.role != 'pasien') { + return res + .status(403) + .json({ message: 'Submit foto mata harus seorang pasien' }); + } + + const patientId = req.user_id; + const { complaints } = req.body; + const eyePicFilename = req.file.filename; + const eyePicPath = path.join( + __dirname, + '../../../public/images/eye-scans/', + eyePicFilename + ); + + try { + const doctors = await User.findAll({ + where: { role: 'dokter' }, + }); + + if (doctors.length === 0) { + return res + .status(500) + .json({ message: 'Dokter tidak tersedia saat ini' }); + } + + const randomDoctor = + doctors[Math.floor(Math.random() * doctors.length)]; + + const form = new FormData(); + form.append('file', fs.createReadStream(eyePicPath)); + + const aiResponse = await axios.post( + 'https://opticscan.humicprototypingapi.online/predict', + form, + { + headers: form.getHeaders(), + } + ); + + let aiDiagnosis = + aiResponse.data?.predicted_class.replace(/_/g, ' ') || + 'Tidak ada hasil dari AI'; + + aiDiagnosis = aiDiagnosis.replace(/_/g, ' '); + aiDiagnosis = 'Possible ' + aiDiagnosis; + + const newExam = await Examination.create({ + patient_id: patientId, + doctor_id: randomDoctor.user_id, + examination_date: new Date(), + eye_pic: req.file.filename, + complaints: complaints || '-', + diagnosis: aiDiagnosis, + doctors_note: '-', + status: 'ongoing', + }); + + return res.status(201).json({ + message: 'Pemeriksaan berhasil diajukan', + data: newExam, + }); + } catch (error) { + let errorMessage = 'Gagal mengajukan pemeriksaan'; + + if (error.response) { + errorMessage = error.response.data?.message || errorMessage; + } else if (error.request) { + errorMessage = 'Tidak dapat menghubungi server AI'; + } else { + errorMessage = error.message; + } + + return res.status(500).json({ + message: errorMessage, + error: error.message, + }); + } +}; + +const diagnosisDokter = async (req, res) => { + const user_id = req.user_id; + const { examination_id, diagnosis, doctors_note } = req.body; + if (!examination_id || !diagnosis) { + return res.status(400).json({ + message: 'Semua field wajib diisi', + }); + } + + try { + const user = await User.findByPk(user_id); + if (user.role != 'dokter') { + return res.status(403).json({ + message: 'Hanya dokter yang bisa memberikan diagnosa', + }); + } + + const examination = await Examination.findByPk(examination_id); + if (!examination) { + return res + .status(404) + .json({ message: 'Hasil pemeriksaan tidak ditemukan' }); + } + + if (examination.doctor_id !== user_id) { + return res.status(403).json({ + message: + 'Anda bukan dokter yang ditugaskan untuk pemeriksaan ini', + }); + } + + await examination.update({ + diagnosis: diagnosis, + doctors_note: doctors_note || '-', + status: 'complete', + }); + + return res.status(200).json({ + message: 'Diagnosa berhasil diperbarui', + data: examination, + }); + } catch (error) { + return res.status(500).json({ + message: 'Gagal memberikan diagnosa', + error: error.message, + }); + } +}; + +module.exports = { + getExamResult, + submitExam, + diagnosisDokter, +}; diff --git a/src/controllers/user/ChangePasswordController.js b/src/controllers/user/ChangePasswordController.js new file mode 100644 index 0000000..ea1ae64 --- /dev/null +++ b/src/controllers/user/ChangePasswordController.js @@ -0,0 +1,33 @@ +const bcrypt = require('bcrypt'); +const { User } = require('../../models'); + +const changePassword = async (req, res) => { + const user_id = req.user_id; + + const { oldPassword, newPassword } = req.body; + try { + const userFound = await User.findByPk(user_id); + if (!userFound) { + return res.status(401).json({ message: 'User tidak ditemukan' }); + } + const verifikasi = await bcrypt.compare( + oldPassword, + userFound.password + ); + if (!verifikasi) { + return res.status(401).json({ message: 'Password lama salah' }); + } + + const hashedPwd = await bcrypt.hash(newPassword, 10); + + await User.update({ password: hashedPwd }, { where: { user_id } }); + return res.status(200).json({ message: 'Password berhasil diubah' }); + } catch (error) { + console.error(error); + return res.status(500).json({ + message: 'Terjadi kesalahan saat merubah password', + }); + } +}; + +module.exports = changePassword; diff --git a/src/controllers/user/ChangeProfilePicController.js b/src/controllers/user/ChangeProfilePicController.js new file mode 100644 index 0000000..2bac111 --- /dev/null +++ b/src/controllers/user/ChangeProfilePicController.js @@ -0,0 +1,53 @@ +const { User } = require('../../models'); +const path = require('path'); +const { deleteFileIfExists } = require('../../utils/fileHelper'); +const fs = require('fs').promises; + +const changeProfilePic = async (req, res) => { + if (req.fileValidationError) { + return res.status(400).json({ message: req.fileValidationError }); + } + + if (!req.file) { + return res.status(400).json({ message: 'File gambar tidak ditemukan' }); + } + + const user_id = req.user_id; + + try { + const user = await User.findByPk(user_id); + const oldProfilePic = user.profile_pic; + + if (oldProfilePic && oldProfilePic !== 'blank-profile-pic.png') { + const oldFilePath = path.join( + __dirname, + '../../../public/images/profile-pics', + oldProfilePic + ); + await deleteFileIfExists(oldFilePath); + } + + await user.update({ profile_pic: req.file.filename }); + + return res.status(200).json({ + message: 'Foto profil berhasil diperbarui', + file: req.file.filename, + }); + } catch (error) { + if (req.file) { + const newFilePath = path.join( + __dirname, + '../../../public/images/profile-pics', + req.file.filename + ); + await deleteFileIfExists(newFilePath); + } + + return res.status(500).json({ + message: 'Gagal memperbarui foto profil', + error: error.message, + }); + } +}; + +module.exports = changeProfilePic; diff --git a/src/controllers/user/UserController.js b/src/controllers/user/UserController.js new file mode 100644 index 0000000..6383cf4 --- /dev/null +++ b/src/controllers/user/UserController.js @@ -0,0 +1,44 @@ +const { User } = require('../../models'); + +const getUserProfile = async (req, res) => { + const user_id = req.user_id; + + try { + const response = await User.findByPk(user_id, { + attributes: ['name', 'email', 'birthdate', 'role', 'profile_pic'], + }); + return res.status(200).json({ + message: `Data user yang login berhasil diambil`, + data: response, + }); + } catch (error) { + return res.status(500).json({ message: error.message, data: null }); + } +}; + +const updateUserProfile = async (req, res) => { + const user_id = req.user_id; + const { name, email, birthdate } = req.body; + + try { + const user = await User.findByPk(user_id); + + await user.update({ + name: name || user.name, + email: email || user.email, + birthdate: birthdate || user.birthdate, + }); + + return res.status(200).json({ message: 'Profil berhasil diperbarui' }); + } catch (error) { + console.error(error); + return res.status(500).json({ + message: 'Terjadi kesalahan saat update profil', + }); + } +}; + +module.exports = { + getUserProfile, + updateUserProfile, +}; diff --git a/src/controllers/user/statsController.js b/src/controllers/user/statsController.js new file mode 100644 index 0000000..2002a48 --- /dev/null +++ b/src/controllers/user/statsController.js @@ -0,0 +1,25 @@ +const { User } = require('../../models'); + +const getTotalPatientsAndDoctors = async (req, res) => { + try { + const totalPatients = await User.count({ where: { role: 'pasien' } }); + const totalDoctors = await User.count({ where: { role: 'dokter' } }); + + return res.status(200).json({ + message: 'Berhasil mengambil data total pasien dan dokter', + data: { + total_pasien: totalPatients, + total_dokter: totalDoctors, + }, + }); + } catch (error) { + return res.status(500).json({ + message: 'Gagal mengambil data total pasien dan dokter', + error: error.message, + }); + } +}; + +module.exports = { + getTotalPatientsAndDoctors, +}; diff --git a/src/middleware/createImageUploader.js b/src/middleware/createImageUploader.js new file mode 100644 index 0000000..d56aab7 --- /dev/null +++ b/src/middleware/createImageUploader.js @@ -0,0 +1,41 @@ +const multer = require('multer'); +const path = require('path'); +const fs = require('fs'); + +const createImageUploader = ({ folderName, filePrefix, fileKey }) => { + const uploadDir = path.join(__dirname, `../../public/images/${folderName}`); + if (!fs.existsSync(uploadDir)) { + fs.mkdirSync(uploadDir, { recursive: true }); + } + + const storage = multer.diskStorage({ + destination: (req, file, cb) => { + cb(null, uploadDir); + }, + filename: (req, file, cb) => { + const timestamp = Date.now(); + const userId = req.user_id; + const ext = path.extname(file.originalname); + cb(null, `${filePrefix}-${userId}-${timestamp}${ext}`); + }, + }); + + const fileFilter = (req, file, cb) => { + const allowedTypes = ['image/jpeg', 'image/jpg', 'image/png']; + if (allowedTypes.includes(file.mimetype)) { + cb(null, true); + } else { + const errMsg = 'Hanya boleh upload gambar (jpeg, jpg, png)'; + req.fileValidationError = errMsg; + cb(new Error(errMsg), false); + } + }; + + return multer({ + storage, + fileFilter, + limits: { fileSize: 1 * 1024 * 1024 }, // 1MB + }).single(fileKey); +}; + +module.exports = createImageUploader; diff --git a/src/middleware/eyePic.js b/src/middleware/eyePic.js new file mode 100644 index 0000000..a93076b --- /dev/null +++ b/src/middleware/eyePic.js @@ -0,0 +1,23 @@ +const createImageUploader = require('./createImageUploader'); +const multer = require('multer'); +const eyePicUpload = createImageUploader({ + folderName: 'eye-scans', + filePrefix: 'eye', + fileKey: 'eye_pic', +}); + +module.exports = (req, res, next) => { + eyePicUpload(req, res, function (err) { + if ( + err instanceof multer.MulterError && + err.code == 'LIMIT_FILE_SIZE' + ) { + return res + .status(400) + .json({ message: 'Ukuran file terlalu besar' }); + } + + // No error + next(); + }); +}; diff --git a/src/middleware/profilePic.js b/src/middleware/profilePic.js new file mode 100644 index 0000000..844b15a --- /dev/null +++ b/src/middleware/profilePic.js @@ -0,0 +1,25 @@ +const createImageUploader = require('./createImageUploader'); +const multer = require('multer'); +const profilePicUpload = createImageUploader({ + folderName: 'profile-pics', + filePrefix: 'profile', + fileKey: 'profile_pic', +}); + +const handleEyePicUpload = (req, res, next) => { + profilePicUpload(req, res, function (err) { + if ( + err instanceof multer.MulterError && + err.code == 'LIMIT_FILE_SIZE' + ) { + return res + .status(400) + .json({ message: 'Ukuran file terlalu besar' }); + } + + // No error + next(); + }); +}; + +module.exports = handleEyePicUpload; diff --git a/src/middleware/verifyJWT.js b/src/middleware/verifyJWT.js new file mode 100644 index 0000000..8d9be3d --- /dev/null +++ b/src/middleware/verifyJWT.js @@ -0,0 +1,49 @@ +const { User } = require('../models'); +const jwt = require('jsonwebtoken'); +require('dotenv').config(); + +const verifyJWT = (req, res, next) => { + const authHeader = req.headers['authorization']; + if (!authHeader) + return res + .status(401) + .json({ message: 'Authorization header tidak ada' }); + + if (!authHeader.startsWith('Bearer ')) { + return res + .status(401) + .json({ message: 'Format token salah (harus Bearer)' }); + } + + const token = authHeader.split(' ')[1]; + if (!token) { + return res.status(401).json({ message: 'Token akses tidak ada' }); + } + + jwt.verify(token, process.env.ACCESS_TOKEN_SECRET, async (err, decoded) => { + if (err) + return res + .status(403) + .json({ message: 'Token akses tidak valid atau kadaluwarsa' }); + + try { + const userFound = await User.findByPk(decoded.user_id); + if (!userFound) { + return res + .status(401) + .json({ message: 'User tidak ditemukan' }); + } + + req.user_id = decoded.user_id; + req.role = decoded.role; + next(); + } catch (error) { + console.error(error); + res.status(500).json({ + message: 'Terjadi kesalahan saat verifikasi token', + }); + } + }); +}; + +module.exports = verifyJWT; diff --git a/src/models/Examination.js b/src/models/Examination.js new file mode 100644 index 0000000..db72a4a --- /dev/null +++ b/src/models/Examination.js @@ -0,0 +1,34 @@ +const { Sequelize } = require('sequelize'); +const db = require('../configs/database.js'); + +const { DataTypes } = Sequelize; + +const Examination = db.define('examination', { + examination_id: { + type: DataTypes.INTEGER, + primaryKey: true, + autoIncrement: true, + }, + patient_id: { + type: DataTypes.INTEGER, + references: { + model: 'User', + key: 'user_id', + }, + }, + doctor_id: { + type: DataTypes.INTEGER, + references: { + model: 'User', + key: 'user_id', + }, + }, + examination_date: { type: DataTypes.DATEONLY, allowNull: false }, + eye_pic: { type: DataTypes.STRING(100), allowNull: false }, + complaints: { type: DataTypes.TEXT, allowNull: true }, + diagnosis: { type: DataTypes.TEXT, allowNull: false }, + doctors_note: { type: DataTypes.TEXT, allowNull: true }, + status: { type: DataTypes.ENUM('ongoing', 'complete'), allowNull: false }, +}); + +module.exports = Examination; diff --git a/src/models/User.js b/src/models/User.js new file mode 100644 index 0000000..9b688c4 --- /dev/null +++ b/src/models/User.js @@ -0,0 +1,40 @@ +const { Sequelize } = require('sequelize'); +const db = require('../configs/database.js'); + +const { DataTypes } = Sequelize; + +const User = db.define('user', { + user_id: { + type: DataTypes.INTEGER, + primaryKey: true, + autoIncrement: true, + }, + name: { + type: DataTypes.STRING(100), + allowNull: false, + }, + email: { + type: DataTypes.STRING(100), + allowNull: false, + unique: true, + }, + password: { + type: DataTypes.STRING(100), + allowNull: false, + }, + birthdate: { + type: DataTypes.DATEONLY, + allowNull: false, + }, + role: { + type: DataTypes.ENUM('pasien', 'dokter'), + allowNull: false, + }, + profile_pic: { + type: DataTypes.STRING(100), + defaultValue: null, // ini nanti ubah pake foto profil default kalau user belom upload + }, + refresh_token: DataTypes.STRING, +}); + +module.exports = User; diff --git a/src/models/index.js b/src/models/index.js new file mode 100644 index 0000000..02584b0 --- /dev/null +++ b/src/models/index.js @@ -0,0 +1,24 @@ +const Sequelize = require('sequelize'); +const db = require('../configs/database'); + +const User = require('./User'); +const Examination = require('./Examination'); + +User.hasMany(Examination, { + foreignKey: 'patient_id', + as: 'patient_examinations', +}); +User.hasMany(Examination, { + foreignKey: 'doctor_id', + as: 'doctor_examinations', +}); + +Examination.belongsTo(User, { foreignKey: 'patient_id', as: 'patient' }); +Examination.belongsTo(User, { foreignKey: 'doctor_id', as: 'doctor' }); + +module.exports = { + Sequelize, + db, + User, + Examination, +}; diff --git a/src/routes/AuthRoutes.js b/src/routes/AuthRoutes.js new file mode 100644 index 0000000..25b9b75 --- /dev/null +++ b/src/routes/AuthRoutes.js @@ -0,0 +1,16 @@ +const express = require('express'); +const router = express.Router(); + +const registerController = require('../controllers/auth/RegisterController.js'); +const loginController = require('../controllers/auth/LoginController.js'); +const logoutController = require('../controllers/auth/LogoutController.js'); +const authenticatedUserController = require('../controllers/auth/AuthenticateUserController.js'); +const handleRefreshToken = require('../controllers/auth/RefreshTokenController'); + +router.post('/register', registerController); +router.post('/login', loginController); +router.get('/logout', logoutController); +router.get('/me', authenticatedUserController); +router.get('/refresh', handleRefreshToken); + +module.exports = router; diff --git a/src/routes/ExaminationRoutes.js b/src/routes/ExaminationRoutes.js new file mode 100644 index 0000000..0b487f2 --- /dev/null +++ b/src/routes/ExaminationRoutes.js @@ -0,0 +1,15 @@ +const express = require('express'); +const router = express.Router(); +const upload = require('../middleware/eyePic.js'); + +const { + getExamResult, + submitExam, + diagnosisDokter, +} = require('../controllers/exam/ExaminationController.js'); + +router.get('/my-result', getExamResult); +router.post('/submit-exam', upload, submitExam); +router.post('/diagnosis-dokter', diagnosisDokter); + +module.exports = router; diff --git a/src/routes/UserRoutes.js b/src/routes/UserRoutes.js new file mode 100644 index 0000000..ef40764 --- /dev/null +++ b/src/routes/UserRoutes.js @@ -0,0 +1,20 @@ +const express = require('express'); +const router = express.Router(); +const upload = require('../middleware/profilePic.js'); +const { + getUserProfile, + updateUserProfile, +} = require('../controllers/user/UserController.js'); +const changePasswordController = require('../controllers/user/ChangePasswordController'); +const changeProfilePicController = require('../controllers/user/ChangeProfilePicController'); +const { + getTotalPatientsAndDoctors, +} = require('../controllers/user/statsController.js'); + +router.get('/profile', getUserProfile); +router.patch('/profile', updateUserProfile); +router.patch('/change-password', changePasswordController); +router.patch('/change-profile-pic', upload, changeProfilePicController); +router.get('/users-count', getTotalPatientsAndDoctors); + +module.exports = router; diff --git a/src/utils/fileHelper.js b/src/utils/fileHelper.js new file mode 100644 index 0000000..6c381da --- /dev/null +++ b/src/utils/fileHelper.js @@ -0,0 +1,15 @@ +const fs = require('fs').promises; + +async function deleteFileIfExists(filePath) { + try { + await fs.access(filePath); + await fs.unlink(filePath); + console.log(`File dihapus: ${filePath}`); + } catch (err) { + console.warn(`Gagal menghapus file (${filePath}):`, err.message); + } +} + +module.exports = { + deleteFileIfExists, +}; diff --git a/src/utils/jwt.js b/src/utils/jwt.js new file mode 100644 index 0000000..2afd59e --- /dev/null +++ b/src/utils/jwt.js @@ -0,0 +1,16 @@ +const jwt = require('jsonwebtoken'); +require('dotenv').config(); + +const generateAccessToken = (payload) => { + return jwt.sign(payload, process.env.ACCESS_TOKEN_SECRET, { + expiresIn: process.env.ACCESS_TOKEN_EXP || '60m', + }); +}; + +const generateRefreshToken = (payload) => { + return jwt.sign(payload, process.env.REFRESH_TOKEN_SECRET, { + expiresIn: process.env.REFRESH_TOKEN_EXP || '1d', + }); +}; + +module.exports = { generateAccessToken, generateRefreshToken };