diff --git a/.env b/.env index 7b4b474..84fedbd 100644 --- a/.env +++ b/.env @@ -1 +1,2 @@ -SERVER_PORT=8000 \ No newline at end of file +SERVER_PORT=8000 +USE_API_URL_PREFIX=api \ No newline at end of file diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..46f5c53 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +src/data/data.json filter=lfs diff=lfs merge=lfs -text diff --git a/.gitignore b/.gitignore index b512c09..ab05030 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -node_modules \ No newline at end of file +node_modules +*.log \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..16aae8f --- /dev/null +++ b/README.md @@ -0,0 +1,163 @@ +# Local Mock API Framework + +## Purpose + +The purpose of this project is to provide a quick-to-set-up standalone local mock API framework to develop API endpoints running on localhost. + +This can be used for testing API code and logic before deploying to live servers or quickly producing API endpoints for rapid prototyping for developing frontend clients for web or mobile. + +The project is built using MSW and can be run directly on a local machine or in docker containers. + +## Set-up + +Clone the repo or use the template button directly in GitHub to set-up a new repo using this one as a template. + +Install dependencies. + +#### Git LFS + +Use git LFS to handle large files such as the database files or image files. + +Use LFS to track database files by running the command below + +``` +git lfs track --filename src/data/data.json +``` + +To track other types of files such as images or videos run the command below with the desired file type + +``` +git lfs track "*.png" +``` + +## Starting + +#### Docker + +To start in docker run + +``` +npm start +``` + +Your apis will be available on localhost:8000/api byt default but this can be customised - see later. + +To stop and remove containers run + +``` +npm stop +``` + +To rebuild containers run : + +``` +npm run rebuild +``` + +To destroy everything and then rebuild the project (removing node modules, caches and all docker resources) run: + +``` +npm run nuke +``` + +#### Local Machine + +To run directly on your local machine not using docker + +``` +npm run dev + +``` + +## Using the Mock API Framework + +To create a new api path (E.g api/users) + +1. Create a **new folder** within the api folder the api path name you want: + + ``` + mkdir src/api/users + ``` + +2. Create an **api.ts** file in this new folder and add handler logic here - see https://github.com/mswjs/msw for information on writing handlers. + + Also take a look at the example handlers in the api folder. + + The mock api framework uses the msw-data utility - see https://github.com/mswjs/data and a full rest or graphql api can be automatically set-up from this without having to define each handler using the format below + + ``` + ...db.user.toHandlers('rest') + ``` + +3. Create a database + + Database models are held in **/models** directory. + + a. Create new models in this directory as required - see the users.ts and posts.ts examples. + + b. Import the new model into the db.ts file and add to the factory function - https://github.com/mswjs/data for more details + +4. Seeding the database + + Data can be manually added to the database json file or added via POST requests to the relevant REST endpoint. + + It is also possible to seed the database with random data using seeder functions. + + Database seeders are located in the seeders folder. + + **Note**: New seeders should be created here and added to the index.ts file in the same folder in order to be automatically imported and executed on server start. + +5. Making Http Requests + + Given the "user" model definition above, the following request handlers are generated and connected to the respective database operations: + + GET /users/:id (where "id" is your model's primary key), returns a user by ID; + GET /users, returns all users (supports pagination); + POST /users, creates a new user; + PUT /users/:id, updates an existing user by ID; + DELETE /users/:id, deletes an existing user by ID; + + The "/user" part of the route is derived from your model name. For example, if you had a "post" model defined in your factory, then the generated handlers would be /posts, /posts/:id, etc. + + For **custom handlers** then requests will be as defined in the individual handler. + + Url parameters can be extracted using + + ``` + url.searchParams.get('type') + ``` + + where type is a url parameter (/api/bikes/?type=KawasakiNinja) + +6. Available endpoints + + Available endpoints are listed at the url root + + ``` + http://localhost:8000 + ``` + +## Customisation + +### Change api url prefix + +By default the api paths with be prefixed with "api/" this can be modified with the +USE_API_URL_PREFIX environment variable in the .env file. + +By setting this to blank then the path will just be the api name E.g localhost:8000/users + +You can set this to any value E.g + +``` +USE_API_URL_PREFIX=things +``` + +will give localhost:8000/things/users + +### Change port number + +By default this is set to 8000 but can be changed by setting the SERVER_PORT in the .env file: + +``` +SERVER_PORT=1234 +``` diff --git a/docker-compose.yml b/docker-compose.yml index 7028cf7..a06bb0c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -7,5 +7,7 @@ services: environment: NODE_ENV: development HUSKY: 0 + SERVER_PORT: ${SERVER_PORT} + USE_API_URL_PREFIX: ${USE_API_URL_PREFIX} ports: - 8000:8000 diff --git a/nuke-it.log b/nuke-it.log deleted file mode 100644 index 5b3ea34..0000000 --- a/nuke-it.log +++ /dev/null @@ -1,57 +0,0 @@ - -> prepare -> husky || true - - -added 762 packages, and audited 763 packages in 50s - -210 packages are looking for funding - run `npm fund` for details - -found 0 vulnerabilities -#0 building with "default" instance using docker driver - -#1 [mswtest internal] load build definition from Dockerfile -#1 transferring dockerfile: 444B done -#1 DONE 0.1s - -#2 [mswtest internal] load metadata for docker.io/library/node:lts-alpine -#2 DONE 0.9s - -#3 [mswtest internal] load .dockerignore -#3 transferring context: 375B done -#3 DONE 0.1s - -#4 [mswtest 1/6] FROM docker.io/library/node:lts-alpine@sha256:291e84d956f1aff38454bbd3da38941461ad569a185c20aa289f71f37ea08e23 -#4 DONE 0.0s - -#5 [mswtest 2/6] WORKDIR /usr/src/app -#5 CACHED - -#6 [mswtest internal] load build context -#6 transferring context: 405.60kB 0.0s done -#6 DONE 0.1s - -#7 [mswtest 3/6] COPY [package.json, package-lock.json*, npm-shrinkwrap.json*, ./] -#7 DONE 0.4s - -#8 [mswtest 4/6] RUN npm install --silent && mv node_modules ../ -#8 15.12 .git can't be foundnpm notice -#8 15.13 npm notice New minor version of npm available! 10.5.2 -> 10.7.0 -#8 15.13 npm notice Changelog: -#8 15.13 npm notice Run `npm install -g npm@10.7.0` to update! -#8 15.13 npm notice -#8 DONE 15.5s - -#9 [mswtest 5/6] COPY . . -#9 DONE 0.1s - -#10 [mswtest 6/6] RUN chown -R node /usr/src/app -#10 DONE 0.7s - -#11 [mswtest] exporting to image -#11 exporting layers -#11 exporting layers 2.7s done -#11 writing image sha256:9fd470faf10c2ad089e9a204f4f99dc05674bd6e0317e996e9ed0fc40f4741c4 done -#11 naming to docker.io/library/mswtest 0.0s done -#11 DONE 2.7s diff --git a/package.json b/package.json index 4aa0c6b..94d8ff6 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "dev": "tsx watch ./src/server.ts", "start": "docker compose up -d --force-recreate", "stop": "docker compose down --volumes", + "rebuild": "docker compose down --volumes && docker compose up -d --force-recreate --build", "restart": "npm stop && npm start", "nuke": "bash nuke.sh", "prepare": "husky || true", diff --git a/src/api/posts/api.ts b/src/api/posts/api.ts index 99dfc15..952190e 100644 --- a/src/api/posts/api.ts +++ b/src/api/posts/api.ts @@ -2,11 +2,15 @@ import { db } from '../../models/db.js'; // Example of msw data auto REST handler generation function handler(pathName: string) { - return [...db.post.toHandlers('rest')]; + // Need to add a prefix here for automatic REST handler generation to a specific path + const prefix = process.env?.USE_API_URL_PREFIX + ? '/' + process.env.USE_API_URL_PREFIX + : ''; + return [...db.post.toHandlers('rest', prefix)]; } export default handler; -// To test localhost:9090/posts - to see all posts +// To test localhost:9090/api/posts - to see all posts // to add post send POST request to localhost:9090/posts with body {"userId": 101, "title": "new post title", "body": "new post body"} // to check its been added visit localhost:9090/posts/101 diff --git a/src/api/users/api.ts b/src/api/users/api.ts index cdd2053..9bf774e 100644 --- a/src/api/users/api.ts +++ b/src/api/users/api.ts @@ -2,7 +2,11 @@ import { db } from '../../models/db.js'; // Example of msw data auto REST handler generation function handler(pathName: string) { - return [...db.user.toHandlers('rest')]; + // Need to add a prefix here for automatic REST handler generation to a specific path + const prefix = process.env?.USE_API_URL_PREFIX + ? '/' + process.env.USE_API_URL_PREFIX + : ''; + return [...db.user.toHandlers('rest', prefix)]; } export default handler; diff --git a/src/data/data.json b/src/data/data.json index e782ec7..51bed82 100644 --- a/src/data/data.json +++ b/src/data/data.json @@ -1,602 +1,3 @@ -[ - { - "userId": 1, - "id": 1, - "title": "IMPORTED", - "body": "THIS IS AN IMPORTED POST" - }, - { - "userId": 1, - "id": 2, - "title": "qui est esse", - "body": "est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla" - }, - { - "userId": 1, - "id": 3, - "title": "ea molestias quasi exercitationem repellat qui ipsa sit aut", - "body": "et iusto sed quo iure\nvoluptatem occaecati omnis eligendi aut ad\nvoluptatem doloribus vel accusantium quis pariatur\nmolestiae porro eius odio et labore et velit aut" - }, - { - "userId": 1, - "id": 4, - "title": "eum et est occaecati", - "body": "ullam et saepe reiciendis voluptatem adipisci\nsit amet autem assumenda provident rerum culpa\nquis hic commodi nesciunt rem tenetur doloremque ipsam iure\nquis sunt voluptatem rerum illo velit" - }, - { - "userId": 1, - "id": 5, - "title": "nesciunt quas odio", - "body": "repudiandae veniam quaerat sunt sed\nalias aut fugiat sit autem sed est\nvoluptatem omnis possimus esse voluptatibus quis\nest aut tenetur dolor neque" - }, - { - "userId": 1, - "id": 6, - "title": "dolorem eum magni eos aperiam quia", - "body": "ut aspernatur corporis harum nihil quis provident sequi\nmollitia nobis aliquid molestiae\nperspiciatis et ea nemo ab reprehenderit accusantium quas\nvoluptate dolores velit et doloremque molestiae" - }, - { - "userId": 1, - "id": 7, - "title": "magnam facilis autem", - "body": "dolore placeat quibusdam ea quo vitae\nmagni quis enim qui quis quo nemo aut saepe\nquidem repellat excepturi ut quia\nsunt ut sequi eos ea sed quas" - }, - { - "userId": 1, - "id": 8, - "title": "dolorem dolore est ipsam", - "body": "dignissimos aperiam dolorem qui eum\nfacilis quibusdam animi sint suscipit qui sint possimus cum\nquaerat magni maiores excepturi\nipsam ut commodi dolor voluptatum modi aut vitae" - }, - { - "userId": 1, - "id": 9, - "title": "nesciunt iure omnis dolorem tempora et accusantium", - "body": "consectetur animi nesciunt iure dolore\nenim quia ad\nveniam autem ut quam aut nobis\net est aut quod aut provident voluptas autem voluptas" - }, - { - "userId": 1, - "id": 10, - "title": "optio molestias id quia eum", - "body": "quo et expedita modi cum officia vel magni\ndoloribus qui repudiandae\nvero nisi sit\nquos veniam quod sed accusamus veritatis error" - }, - { - "userId": 2, - "id": 11, - "title": "et ea vero quia laudantium autem", - "body": "delectus reiciendis molestiae occaecati non minima eveniet qui voluptatibus\naccusamus in eum beatae sit\nvel qui neque voluptates ut commodi qui incidunt\nut animi commodi" - }, - { - "userId": 2, - "id": 12, - "title": "in quibusdam tempore odit est dolorem", - "body": "itaque id aut magnam\npraesentium quia et ea odit et ea voluptas et\nsapiente quia nihil amet occaecati quia id voluptatem\nincidunt ea est distinctio odio" - }, - { - "userId": 2, - "id": 13, - "title": "dolorum ut in voluptas mollitia et saepe quo animi", - "body": "aut dicta possimus sint mollitia voluptas commodi quo doloremque\niste corrupti reiciendis voluptatem eius rerum\nsit cumque quod eligendi laborum minima\nperferendis recusandae assumenda consectetur porro architecto ipsum ipsam" - }, - { - "userId": 2, - "id": 14, - "title": "voluptatem eligendi optio", - "body": "fuga et accusamus dolorum perferendis illo voluptas\nnon doloremque neque facere\nad qui dolorum molestiae beatae\nsed aut voluptas totam sit illum" - }, - { - "userId": 2, - "id": 15, - "title": "eveniet quod temporibus", - "body": "reprehenderit quos placeat\nvelit minima officia dolores impedit repudiandae molestiae nam\nvoluptas recusandae quis delectus\nofficiis harum fugiat vitae" - }, - { - "userId": 2, - "id": 16, - "title": "sint suscipit perspiciatis velit dolorum rerum ipsa laboriosam odio", - "body": "suscipit nam nisi quo aperiam aut\nasperiores eos fugit maiores voluptatibus quia\nvoluptatem quis ullam qui in alias quia est\nconsequatur magni mollitia accusamus ea nisi voluptate dicta" - }, - { - "userId": 2, - "id": 17, - "title": "fugit voluptas sed molestias voluptatem provident", - "body": "eos voluptas et aut odit natus earum\naspernatur fuga molestiae ullam\ndeserunt ratione qui eos\nqui nihil ratione nemo velit ut aut id quo" - }, - { - "userId": 2, - "id": 18, - "title": "voluptate et itaque vero tempora molestiae", - "body": "eveniet quo quis\nlaborum totam consequatur non dolor\nut et est repudiandae\nest voluptatem vel debitis et magnam" - }, - { - "userId": 2, - "id": 19, - "title": "adipisci placeat illum aut reiciendis qui", - "body": "illum quis cupiditate provident sit magnam\nea sed aut omnis\nveniam maiores ullam consequatur atque\nadipisci quo iste expedita sit quos voluptas" - }, - { - "userId": 2, - "id": 20, - "title": "doloribus ad provident suscipit at", - "body": "qui consequuntur ducimus possimus quisquam amet similique\nsuscipit porro ipsam amet\neos veritatis officiis exercitationem vel fugit aut necessitatibus totam\nomnis rerum consequatur expedita quidem cumque explicabo" - }, - { - "userId": 3, - "id": 21, - "title": "asperiores ea ipsam voluptatibus modi minima quia sint", - "body": "repellat aliquid praesentium dolorem quo\nsed totam minus non itaque\nnihil labore molestiae sunt dolor eveniet hic recusandae veniam\ntempora et tenetur expedita sunt" - }, - { - "userId": 3, - "id": 22, - "title": "dolor sint quo a velit explicabo quia nam", - "body": "eos qui et ipsum ipsam suscipit aut\nsed omnis non odio\nexpedita earum mollitia molestiae aut atque rem suscipit\nnam impedit esse" - }, - { - "userId": 3, - "id": 23, - "title": "maxime id vitae nihil numquam", - "body": "veritatis unde neque eligendi\nquae quod architecto quo neque vitae\nest illo sit tempora doloremque fugit quod\net et vel beatae sequi ullam sed tenetur perspiciatis" - }, - { - "userId": 3, - "id": 24, - "title": "autem hic labore sunt dolores incidunt", - "body": "enim et ex nulla\nomnis voluptas quia qui\nvoluptatem consequatur numquam aliquam sunt\ntotam recusandae id dignissimos aut sed asperiores deserunt" - }, - { - "userId": 3, - "id": 25, - "title": "rem alias distinctio quo quis", - "body": "ullam consequatur ut\nomnis quis sit vel consequuntur\nipsa eligendi ipsum molestiae et omnis error nostrum\nmolestiae illo tempore quia et distinctio" - }, - { - "userId": 3, - "id": 26, - "title": "est et quae odit qui non", - "body": "similique esse doloribus nihil accusamus\nomnis dolorem fuga consequuntur reprehenderit fugit recusandae temporibus\nperspiciatis cum ut laudantium\nomnis aut molestiae vel vero" - }, - { - "userId": 3, - "id": 27, - "title": "quasi id et eos tenetur aut quo autem", - "body": "eum sed dolores ipsam sint possimus debitis occaecati\ndebitis qui qui et\nut placeat enim earum aut odit facilis\nconsequatur suscipit necessitatibus rerum sed inventore temporibus consequatur" - }, - { - "userId": 3, - "id": 28, - "title": "delectus ullam et corporis nulla voluptas sequi", - "body": "non et quaerat ex quae ad maiores\nmaiores recusandae totam aut blanditiis mollitia quas illo\nut voluptatibus voluptatem\nsimilique nostrum eum" - }, - { - "userId": 3, - "id": 29, - "title": "iusto eius quod necessitatibus culpa ea", - "body": "odit magnam ut saepe sed non qui\ntempora atque nihil\naccusamus illum doloribus illo dolor\neligendi repudiandae odit magni similique sed cum maiores" - }, - { - "userId": 3, - "id": 30, - "title": "a quo magni similique perferendis", - "body": "alias dolor cumque\nimpedit blanditiis non eveniet odio maxime\nblanditiis amet eius quis tempora quia autem rem\na provident perspiciatis quia" - }, - { - "userId": 4, - "id": 31, - "title": "ullam ut quidem id aut vel consequuntur", - "body": "debitis eius sed quibusdam non quis consectetur vitae\nimpedit ut qui consequatur sed aut in\nquidem sit nostrum et maiores adipisci atque\nquaerat voluptatem adipisci repudiandae" - }, - { - "userId": 4, - "id": 32, - "title": "doloremque illum aliquid sunt", - "body": "deserunt eos nobis asperiores et hic\nest debitis repellat molestiae optio\nnihil ratione ut eos beatae quibusdam distinctio maiores\nearum voluptates et aut adipisci ea maiores voluptas maxime" - }, - { - "userId": 4, - "id": 33, - "title": "qui explicabo molestiae dolorem", - "body": "rerum ut et numquam laborum odit est sit\nid qui sint in\nquasi tenetur tempore aperiam et quaerat qui in\nrerum officiis sequi cumque quod" - }, - { - "userId": 4, - "id": 34, - "title": "magnam ut rerum iure", - "body": "ea velit perferendis earum ut voluptatem voluptate itaque iusto\ntotam pariatur in\nnemo voluptatem voluptatem autem magni tempora minima in\nest distinctio qui assumenda accusamus dignissimos officia nesciunt nobis" - }, - { - "userId": 4, - "id": 35, - "title": "id nihil consequatur molestias animi provident", - "body": "nisi error delectus possimus ut eligendi vitae\nplaceat eos harum cupiditate facilis reprehenderit voluptatem beatae\nmodi ducimus quo illum voluptas eligendi\net nobis quia fugit" - }, - { - "userId": 4, - "id": 36, - "title": "fuga nam accusamus voluptas reiciendis itaque", - "body": "ad mollitia et omnis minus architecto odit\nvoluptas doloremque maxime aut non ipsa qui alias veniam\nblanditiis culpa aut quia nihil cumque facere et occaecati\nqui aspernatur quia eaque ut aperiam inventore" - }, - { - "userId": 4, - "id": 37, - "title": "provident vel ut sit ratione est", - "body": "debitis et eaque non officia sed nesciunt pariatur vel\nvoluptatem iste vero et ea\nnumquam aut expedita ipsum nulla in\nvoluptates omnis consequatur aut enim officiis in quam qui" - }, - { - "userId": 4, - "id": 38, - "title": "explicabo et eos deleniti nostrum ab id repellendus", - "body": "animi esse sit aut sit nesciunt assumenda eum voluptas\nquia voluptatibus provident quia necessitatibus ea\nrerum repudiandae quia voluptatem delectus fugit aut id quia\nratione optio eos iusto veniam iure" - }, - { - "userId": 4, - "id": 39, - "title": "eos dolorem iste accusantium est eaque quam", - "body": "corporis rerum ducimus vel eum accusantium\nmaxime aspernatur a porro possimus iste omnis\nest in deleniti asperiores fuga aut\nvoluptas sapiente vel dolore minus voluptatem incidunt ex" - }, - { - "userId": 4, - "id": 40, - "title": "enim quo cumque", - "body": "ut voluptatum aliquid illo tenetur nemo sequi quo facilis\nipsum rem optio mollitia quas\nvoluptatem eum voluptas qui\nunde omnis voluptatem iure quasi maxime voluptas nam" - }, - { - "userId": 5, - "id": 41, - "title": "non est facere", - "body": "molestias id nostrum\nexcepturi molestiae dolore omnis repellendus quaerat saepe\nconsectetur iste quaerat tenetur asperiores accusamus ex ut\nnam quidem est ducimus sunt debitis saepe" - }, - { - "userId": 5, - "id": 42, - "title": "commodi ullam sint et excepturi error explicabo praesentium voluptas", - "body": "odio fugit voluptatum ducimus earum autem est incidunt voluptatem\nodit reiciendis aliquam sunt sequi nulla dolorem\nnon facere repellendus voluptates quia\nratione harum vitae ut" - }, - { - "userId": 5, - "id": 43, - "title": "eligendi iste nostrum consequuntur adipisci praesentium sit beatae perferendis", - "body": "similique fugit est\nillum et dolorum harum et voluptate eaque quidem\nexercitationem quos nam commodi possimus cum odio nihil nulla\ndolorum exercitationem magnam ex et a et distinctio debitis" - }, - { - "userId": 5, - "id": 44, - "title": "optio dolor molestias sit", - "body": "temporibus est consectetur dolore\net libero debitis vel velit laboriosam quia\nipsum quibusdam qui itaque fuga rem aut\nea et iure quam sed maxime ut distinctio quae" - }, - { - "userId": 5, - "id": 45, - "title": "ut numquam possimus omnis eius suscipit laudantium iure", - "body": "est natus reiciendis nihil possimus aut provident\nex et dolor\nrepellat pariatur est\nnobis rerum repellendus dolorem autem" - }, - { - "userId": 5, - "id": 46, - "title": "aut quo modi neque nostrum ducimus", - "body": "voluptatem quisquam iste\nvoluptatibus natus officiis facilis dolorem\nquis quas ipsam\nvel et voluptatum in aliquid" - }, - { - "userId": 5, - "id": 47, - "title": "quibusdam cumque rem aut deserunt", - "body": "voluptatem assumenda ut qui ut cupiditate aut impedit veniam\noccaecati nemo illum voluptatem laudantium\nmolestiae beatae rerum ea iure soluta nostrum\neligendi et voluptate" - }, - { - "userId": 5, - "id": 48, - "title": "ut voluptatem illum ea doloribus itaque eos", - "body": "voluptates quo voluptatem facilis iure occaecati\nvel assumenda rerum officia et\nillum perspiciatis ab deleniti\nlaudantium repellat ad ut et autem reprehenderit" - }, - { - "userId": 5, - "id": 49, - "title": "laborum non sunt aut ut assumenda perspiciatis voluptas", - "body": "inventore ab sint\nnatus fugit id nulla sequi architecto nihil quaerat\neos tenetur in in eum veritatis non\nquibusdam officiis aspernatur cumque aut commodi aut" - }, - { - "userId": 5, - "id": 50, - "title": "repellendus qui recusandae incidunt voluptates tenetur qui omnis exercitationem", - "body": "error suscipit maxime adipisci consequuntur recusandae\nvoluptas eligendi et est et voluptates\nquia distinctio ab amet quaerat molestiae et vitae\nadipisci impedit sequi nesciunt quis consectetur" - }, - { - "userId": 6, - "id": 51, - "title": "soluta aliquam aperiam consequatur illo quis voluptas", - "body": "sunt dolores aut doloribus\ndolore doloribus voluptates tempora et\ndoloremque et quo\ncum asperiores sit consectetur dolorem" - }, - { - "userId": 6, - "id": 52, - "title": "qui enim et consequuntur quia animi quis voluptate quibusdam", - "body": "iusto est quibusdam fuga quas quaerat molestias\na enim ut sit accusamus enim\ntemporibus iusto accusantium provident architecto\nsoluta esse reprehenderit qui laborum" - }, - { - "userId": 6, - "id": 53, - "title": "ut quo aut ducimus alias", - "body": "minima harum praesentium eum rerum illo dolore\nquasi exercitationem rerum nam\nporro quis neque quo\nconsequatur minus dolor quidem veritatis sunt non explicabo similique" - }, - { - "userId": 6, - "id": 54, - "title": "sit asperiores ipsam eveniet odio non quia", - "body": "totam corporis dignissimos\nvitae dolorem ut occaecati accusamus\nex velit deserunt\net exercitationem vero incidunt corrupti mollitia" - }, - { - "userId": 6, - "id": 55, - "title": "sit vel voluptatem et non libero", - "body": "debitis excepturi ea perferendis harum libero optio\neos accusamus cum fuga ut sapiente repudiandae\net ut incidunt omnis molestiae\nnihil ut eum odit" - }, - { - "userId": 6, - "id": 56, - "title": "qui et at rerum necessitatibus", - "body": "aut est omnis dolores\nneque rerum quod ea rerum velit pariatur beatae excepturi\net provident voluptas corrupti\ncorporis harum reprehenderit dolores eligendi" - }, - { - "userId": 6, - "id": 57, - "title": "sed ab est est", - "body": "at pariatur consequuntur earum quidem\nquo est laudantium soluta voluptatem\nqui ullam et est\net cum voluptas voluptatum repellat est" - }, - { - "userId": 6, - "id": 58, - "title": "voluptatum itaque dolores nisi et quasi", - "body": "veniam voluptatum quae adipisci id\net id quia eos ad et dolorem\naliquam quo nisi sunt eos impedit error\nad similique veniam" - }, - { - "userId": 6, - "id": 59, - "title": "qui commodi dolor at maiores et quis id accusantium", - "body": "perspiciatis et quam ea autem temporibus non voluptatibus qui\nbeatae a earum officia nesciunt dolores suscipit voluptas et\nanimi doloribus cum rerum quas et magni\net hic ut ut commodi expedita sunt" - }, - { - "userId": 6, - "id": 60, - "title": "consequatur placeat omnis quisquam quia reprehenderit fugit veritatis facere", - "body": "asperiores sunt ab assumenda cumque modi velit\nqui esse omnis\nvoluptate et fuga perferendis voluptas\nillo ratione amet aut et omnis" - }, - { - "userId": 7, - "id": 61, - "title": "voluptatem doloribus consectetur est ut ducimus", - "body": "ab nemo optio odio\ndelectus tenetur corporis similique nobis repellendus rerum omnis facilis\nvero blanditiis debitis in nesciunt doloribus dicta dolores\nmagnam minus velit" - }, - { - "userId": 7, - "id": 62, - "title": "beatae enim quia vel", - "body": "enim aspernatur illo distinctio quae praesentium\nbeatae alias amet delectus qui voluptate distinctio\nodit sint accusantium autem omnis\nquo molestiae omnis ea eveniet optio" - }, - { - "userId": 7, - "id": 63, - "title": "voluptas blanditiis repellendus animi ducimus error sapiente et suscipit", - "body": "enim adipisci aspernatur nemo\nnumquam omnis facere dolorem dolor ex quis temporibus incidunt\nab delectus culpa quo reprehenderit blanditiis asperiores\naccusantium ut quam in voluptatibus voluptas ipsam dicta" - }, - { - "userId": 7, - "id": 64, - "title": "et fugit quas eum in in aperiam quod", - "body": "id velit blanditiis\neum ea voluptatem\nmolestiae sint occaecati est eos perspiciatis\nincidunt a error provident eaque aut aut qui" - }, - { - "userId": 7, - "id": 65, - "title": "consequatur id enim sunt et et", - "body": "voluptatibus ex esse\nsint explicabo est aliquid cumque adipisci fuga repellat labore\nmolestiae corrupti ex saepe at asperiores et perferendis\nnatus id esse incidunt pariatur" - }, - { - "userId": 7, - "id": 66, - "title": "repudiandae ea animi iusto", - "body": "officia veritatis tenetur vero qui itaque\nsint non ratione\nsed et ut asperiores iusto eos molestiae nostrum\nveritatis quibusdam et nemo iusto saepe" - }, - { - "userId": 7, - "id": 67, - "title": "aliquid eos sed fuga est maxime repellendus", - "body": "reprehenderit id nostrum\nvoluptas doloremque pariatur sint et accusantium quia quod aspernatur\net fugiat amet\nnon sapiente et consequatur necessitatibus molestiae" - }, - { - "userId": 7, - "id": 68, - "title": "odio quis facere architecto reiciendis optio", - "body": "magnam molestiae perferendis quisquam\nqui cum reiciendis\nquaerat animi amet hic inventore\nea quia deleniti quidem saepe porro velit" - }, - { - "userId": 7, - "id": 69, - "title": "fugiat quod pariatur odit minima", - "body": "officiis error culpa consequatur modi asperiores et\ndolorum assumenda voluptas et vel qui aut vel rerum\nvoluptatum quisquam perspiciatis quia rerum consequatur totam quas\nsequi commodi repudiandae asperiores et saepe a" - }, - { - "userId": 7, - "id": 70, - "title": "voluptatem laborum magni", - "body": "sunt repellendus quae\nest asperiores aut deleniti esse accusamus repellendus quia aut\nquia dolorem unde\neum tempora esse dolore" - }, - { - "userId": 8, - "id": 71, - "title": "et iusto veniam et illum aut fuga", - "body": "occaecati a doloribus\niste saepe consectetur placeat eum voluptate dolorem et\nqui quo quia voluptas\nrerum ut id enim velit est perferendis" - }, - { - "userId": 8, - "id": 72, - "title": "sint hic doloribus consequatur eos non id", - "body": "quam occaecati qui deleniti consectetur\nconsequatur aut facere quas exercitationem aliquam hic voluptas\nneque id sunt ut aut accusamus\nsunt consectetur expedita inventore velit" - }, - { - "userId": 8, - "id": 73, - "title": "consequuntur deleniti eos quia temporibus ab aliquid at", - "body": "voluptatem cumque tenetur consequatur expedita ipsum nemo quia explicabo\naut eum minima consequatur\ntempore cumque quae est et\net in consequuntur voluptatem voluptates aut" - }, - { - "userId": 8, - "id": 74, - "title": "enim unde ratione doloribus quas enim ut sit sapiente", - "body": "odit qui et et necessitatibus sint veniam\nmollitia amet doloremque molestiae commodi similique magnam et quam\nblanditiis est itaque\nquo et tenetur ratione occaecati molestiae tempora" - }, - { - "userId": 8, - "id": 75, - "title": "dignissimos eum dolor ut enim et delectus in", - "body": "commodi non non omnis et voluptas sit\nautem aut nobis magnam et sapiente voluptatem\net laborum repellat qui delectus facilis temporibus\nrerum amet et nemo voluptate expedita adipisci error dolorem" - }, - { - "userId": 8, - "id": 76, - "title": "doloremque officiis ad et non perferendis", - "body": "ut animi facere\ntotam iusto tempore\nmolestiae eum aut et dolorem aperiam\nquaerat recusandae totam odio" - }, - { - "userId": 8, - "id": 77, - "title": "necessitatibus quasi exercitationem odio", - "body": "modi ut in nulla repudiandae dolorum nostrum eos\naut consequatur omnis\nut incidunt est omnis iste et quam\nvoluptates sapiente aliquam asperiores nobis amet corrupti repudiandae provident" - }, - { - "userId": 8, - "id": 78, - "title": "quam voluptatibus rerum veritatis", - "body": "nobis facilis odit tempore cupiditate quia\nassumenda doloribus rerum qui ea\nillum et qui totam\naut veniam repellendus" - }, - { - "userId": 8, - "id": 79, - "title": "pariatur consequatur quia magnam autem omnis non amet", - "body": "libero accusantium et et facere incidunt sit dolorem\nnon excepturi qui quia sed laudantium\nquisquam molestiae ducimus est\nofficiis esse molestiae iste et quos" - }, - { - "userId": 8, - "id": 80, - "title": "labore in ex et explicabo corporis aut quas", - "body": "ex quod dolorem ea eum iure qui provident amet\nquia qui facere excepturi et repudiandae\nasperiores molestias provident\nminus incidunt vero fugit rerum sint sunt excepturi provident" - }, - { - "userId": 9, - "id": 81, - "title": "tempora rem veritatis voluptas quo dolores vero", - "body": "facere qui nesciunt est voluptatum voluptatem nisi\nsequi eligendi necessitatibus ea at rerum itaque\nharum non ratione velit laboriosam quis consequuntur\nex officiis minima doloremque voluptas ut aut" - }, - { - "userId": 9, - "id": 82, - "title": "laudantium voluptate suscipit sunt enim enim", - "body": "ut libero sit aut totam inventore sunt\nporro sint qui sunt molestiae\nconsequatur cupiditate qui iste ducimus adipisci\ndolor enim assumenda soluta laboriosam amet iste delectus hic" - }, - { - "userId": 9, - "id": 83, - "title": "odit et voluptates doloribus alias odio et", - "body": "est molestiae facilis quis tempora numquam nihil qui\nvoluptate sapiente consequatur est qui\nnecessitatibus autem aut ipsa aperiam modi dolore numquam\nreprehenderit eius rem quibusdam" - }, - { - "userId": 9, - "id": 84, - "title": "optio ipsam molestias necessitatibus occaecati facilis veritatis dolores aut", - "body": "sint molestiae magni a et quos\neaque et quasi\nut rerum debitis similique veniam\nrecusandae dignissimos dolor incidunt consequatur odio" - }, - { - "userId": 9, - "id": 85, - "title": "dolore veritatis porro provident adipisci blanditiis et sunt", - "body": "similique sed nisi voluptas iusto omnis\nmollitia et quo\nassumenda suscipit officia magnam sint sed tempora\nenim provident pariatur praesentium atque animi amet ratione" - }, - { - "userId": 9, - "id": 86, - "title": "placeat quia et porro iste", - "body": "quasi excepturi consequatur iste autem temporibus sed molestiae beatae\net quaerat et esse ut\nvoluptatem occaecati et vel explicabo autem\nasperiores pariatur deserunt optio" - }, - { - "userId": 9, - "id": 87, - "title": "nostrum quis quasi placeat", - "body": "eos et molestiae\nnesciunt ut a\ndolores perspiciatis repellendus repellat aliquid\nmagnam sint rem ipsum est" - }, - { - "userId": 9, - "id": 88, - "title": "sapiente omnis fugit eos", - "body": "consequatur omnis est praesentium\nducimus non iste\nneque hic deserunt\nvoluptatibus veniam cum et rerum sed" - }, - { - "userId": 9, - "id": 89, - "title": "sint soluta et vel magnam aut ut sed qui", - "body": "repellat aut aperiam totam temporibus autem et\narchitecto magnam ut\nconsequatur qui cupiditate rerum quia soluta dignissimos nihil iure\ntempore quas est" - }, - { - "userId": 9, - "id": 90, - "title": "ad iusto omnis odit dolor voluptatibus", - "body": "minus omnis soluta quia\nqui sed adipisci voluptates illum ipsam voluptatem\neligendi officia ut in\neos soluta similique molestias praesentium blanditiis" - }, - { - "userId": 10, - "id": 91, - "title": "aut amet sed", - "body": "libero voluptate eveniet aperiam sed\nsunt placeat suscipit molestias\nsimilique fugit nam natus\nexpedita consequatur consequatur dolores quia eos et placeat" - }, - { - "userId": 10, - "id": 92, - "title": "ratione ex tenetur perferendis", - "body": "aut et excepturi dicta laudantium sint rerum nihil\nlaudantium et at\na neque minima officia et similique libero et\ncommodi voluptate qui" - }, - { - "userId": 10, - "id": 93, - "title": "beatae soluta recusandae", - "body": "dolorem quibusdam ducimus consequuntur dicta aut quo laboriosam\nvoluptatem quis enim recusandae ut sed sunt\nnostrum est odit totam\nsit error sed sunt eveniet provident qui nulla" - }, - { - "userId": 10, - "id": 94, - "title": "qui qui voluptates illo iste minima", - "body": "aspernatur expedita soluta quo ab ut similique\nexpedita dolores amet\nsed temporibus distinctio magnam saepe deleniti\nomnis facilis nam ipsum natus sint similique omnis" - }, - { - "userId": 10, - "id": 95, - "title": "id minus libero illum nam ad officiis", - "body": "earum voluptatem facere provident blanditiis velit laboriosam\npariatur accusamus odio saepe\ncumque dolor qui a dicta ab doloribus consequatur omnis\ncorporis cupiditate eaque assumenda ad nesciunt" - }, - { - "userId": 10, - "id": 96, - "title": "quaerat velit veniam amet cupiditate aut numquam ut sequi", - "body": "in non odio excepturi sint eum\nlabore voluptates vitae quia qui et\ninventore itaque rerum\nveniam non exercitationem delectus aut" - }, - { - "userId": 10, - "id": 97, - "title": "quas fugiat ut perspiciatis vero provident", - "body": "eum non blanditiis soluta porro quibusdam voluptas\nvel voluptatem qui placeat dolores qui velit aut\nvel inventore aut cumque culpa explicabo aliquid at\nperspiciatis est et voluptatem dignissimos dolor itaque sit nam" - }, - { - "userId": 10, - "id": 98, - "title": "laboriosam dolor voluptates", - "body": "doloremque ex facilis sit sint culpa\nsoluta assumenda eligendi non ut eius\nsequi ducimus vel quasi\nveritatis est dolores" - }, - { - "userId": 10, - "id": 99, - "title": "temporibus sit alias delectus eligendi possimus magni", - "body": "quo deleniti praesentium dicta non quod\naut est molestias\nmolestias et officia quis nihil\nitaque dolorem quia" - }, - { - "userId": 10, - "id": 100, - "title": "at nam consequatur ea labore ea harum", - "body": "cupiditate quo est a modi nesciunt soluta\nipsa voluptas error itaque dicta in\nautem qui minus magnam et distinctio eum\naccusamus ratione error aut" - } -] +version https://git-lfs.github.com/spec/v1 +oid sha256:5ca0ce3d12930bc26499197102626fe12b3c4d4ee33f43f72ff810556cff06b8 +size 27318 diff --git a/src/server.ts b/src/server.ts index affa507..60b97ac 100644 --- a/src/server.ts +++ b/src/server.ts @@ -1,6 +1,6 @@ import 'dotenv/config'; import { createServer } from '@mswjs/http-middleware'; -import { userSeeder, postSeeder } from './seeders/index.js'; +import * as seeders from './seeders/index.js'; import getApiPaths from './utilities/file-scan.js'; import serverPage from './utilities/server-page.js'; @@ -10,7 +10,9 @@ const httpServer = createServer(...apiHandlers, ...serverPage(apiPaths)); httpServer.listen(process.env.SERVER_PORT); -userSeeder(); -postSeeder(); +// Execute dB seeder functions +for (const seeder of Object.values(seeders)) { + seeder(); +} console.log(`SERVER UP AND RUNNING ON LOCALHOST:${process.env.SERVER_PORT}`); diff --git a/src/utilities/file-scan.ts b/src/utilities/file-scan.ts index c561af8..b1f9941 100644 --- a/src/utilities/file-scan.ts +++ b/src/utilities/file-scan.ts @@ -19,13 +19,17 @@ export default async function getApiPaths() { const files = fs.readdirSync(apiFolder); + const prefix = process.env?.USE_API_URL_PREFIX + ? process.env.USE_API_URL_PREFIX + '/' + : ''; + for (const file of files) { const filePath = path.join(apiFolder, file); const stats = fs.statSync(filePath); if (stats.isDirectory()) { // Get the directory name - console.log(`Api Path: /${file}`); + console.log(`Api Path: ${prefix}${file}`); apiPaths.push(file); // Import index.ts file (assuming it's in each directory) - this returns a promise @@ -46,7 +50,9 @@ export default async function getApiPaths() { .then((handlers) => { for (const [index, handler] of handlers.entries()) { // Add new handlers with the desired apiPath to return array - remember to spread these out as may be more than one - apiHandlers.push(...handler.default(apiPaths[index])); + apiHandlers.push( + ...handler.default(`${prefix}${apiPaths[index]}`), + ); } }) .then(() => { diff --git a/src/utilities/server-page.ts b/src/utilities/server-page.ts index 29d7198..9fcf6a7 100644 --- a/src/utilities/server-page.ts +++ b/src/utilities/server-page.ts @@ -1,6 +1,10 @@ import 'dotenv/config'; import { http, HttpResponse } from 'msw'; +const prefix = process.env?.USE_API_URL_PREFIX + ? process.env.USE_API_URL_PREFIX + '/' + : ''; + const homePage = (apiPaths: string[]) => { const htmlString = ` @@ -8,7 +12,7 @@ const homePage = (apiPaths: string[]) => {

SERVER RUNNING ON localhost:${process.env.SERVER_PORT}

Active Paths:

- ${apiPaths.map((path) => '

/' + path).join('

')} + ${apiPaths.map((path) => '

/' + prefix + path).join('

')}