diff --git a/docs/insomnia.json b/docs/insomnia.json
new file mode 100644
index 0000000..2dec1b1
--- /dev/null
+++ b/docs/insomnia.json
@@ -0,0 +1 @@
+{"_type":"export","__export_format":4,"__export_date":"2023-07-04T23:23:38.788Z","__export_source":"insomnia.desktop.app:v2023.2.2","resources":[{"_id":"req_c054a2de073a4102b1b61254b9b1a55f","parentId":"fld_1793588e48814524a642d5dcc7bf8021","modified":1688512195075,"created":1688512195075,"url":"{{ _.base_url }}/requests/amount/{{ _.range }}","name":"Get number of requisitions for a specific period","description":"","method":"GET","body":{},"parameters":[],"headers":[],"authentication":{"type":"bearer","token":"{{ _.bearerToken }}","prefix":""},"metaSortKey":-1688512195075,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"fld_1793588e48814524a642d5dcc7bf8021","parentId":"wrk_b3896d546c554b56b1f7fc0bd22144f1","modified":1688512195056,"created":1688512195056,"name":"Requests","description":"","environment":{},"environmentPropertyOrder":null,"metaSortKey":-1688512195056,"_type":"request_group"},{"_id":"wrk_b3896d546c554b56b1f7fc0bd22144f1","parentId":null,"modified":1688512976728,"created":1688512169042,"name":"Untitled","description":"Do not worry about managing the multiple versions of the Bible RESTful Bible API with 7 versions, 4 languages and multiple features to simplify your day to day.\n\n[Contact us - Website](https://www.abibliadigital.com.br/)\n\n[BSD 2-Clause \"Simplified\" License](https://github.com/omarciovsena/abibliadigital/blob/master/LICENSE.md)","scope":"design","_type":"workspace"},{"_id":"req_e9166a89e78e4a6b90a0e6d20a4d7c8e","parentId":"fld_1793588e48814524a642d5dcc7bf8021","modified":1688512195073,"created":1688512195073,"url":"{{ _.base_url }}/requests/{{ _.range }}","name":"Get requests for a specific period","description":"","method":"GET","body":{},"parameters":[],"headers":[],"authentication":{"type":"bearer","token":"{{ _.bearerToken }}","prefix":""},"metaSortKey":-1688512195073,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_9dc555fc294543d7b3518054d3c6cecf","parentId":"fld_1f9b90d0e7fd484ab93e5d7c8af1b14f","modified":1688512195072,"created":1688512195072,"url":"{{ _.base_url }}/users/password/{{ _.email }}","name":"Resend user password","description":"","method":"POST","body":{},"parameters":[],"headers":[],"authentication":{"type":"bearer","token":"{{ _.bearerToken }}","prefix":""},"metaSortKey":-1688512195072,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"fld_1f9b90d0e7fd484ab93e5d7c8af1b14f","parentId":"wrk_b3896d546c554b56b1f7fc0bd22144f1","modified":1688512195055,"created":1688512195055,"name":"Users","description":"The project will always be open source. Authentication is only to identify how many users are using the project and to inform about new updates.","environment":{},"environmentPropertyOrder":null,"metaSortKey":-1688512195055,"_type":"request_group"},{"_id":"req_987884d9c5cb43b8b6ab64aadf3c9c28","parentId":"fld_1f9b90d0e7fd484ab93e5d7c8af1b14f","modified":1688512195071,"created":1688512195071,"url":"{{ _.base_url }}/users/token","name":"Update token","description":"","method":"PUT","body":{"mimeType":"application/json","text":"{\n \"email\": \"user@example.com\",\n \"password\": \"string\"\n}"},"parameters":[],"headers":[],"authentication":{"type":"bearer","token":"{{ _.bearerToken }}","prefix":""},"metaSortKey":-1688512195071,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_56e941aea89a421eb0537481a10e2086","parentId":"fld_1f9b90d0e7fd484ab93e5d7c8af1b14f","modified":1688512195069,"created":1688512195069,"url":"{{ _.base_url }}/users/stats","name":"Get user statistics","description":"","method":"GET","body":{},"parameters":[],"headers":[],"authentication":{"type":"bearer","token":"{{ _.bearerToken }}","prefix":""},"metaSortKey":-1688512195069,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_4ee1b92a721e4dc5a4a21d02eb7f7066","parentId":"fld_1f9b90d0e7fd484ab93e5d7c8af1b14f","modified":1688512195068,"created":1688512195068,"url":"{{ _.base_url }}/users/{{ _.email }}","name":"Get a user","description":"","method":"GET","body":{},"parameters":[],"headers":[],"authentication":{"type":"bearer","token":"{{ _.bearerToken }}","prefix":""},"metaSortKey":-1688512195068,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_fc7901dd9f0c4c759044f6b7bbae6dcd","parentId":"fld_1f9b90d0e7fd484ab93e5d7c8af1b14f","modified":1688512195066,"created":1688512195066,"url":"{{ _.base_url }}/users","name":"Delete user","description":"","method":"DELETE","body":{"mimeType":"application/json","text":"{\n \"email\": \"user@example.com\",\n \"password\": \"string\"\n}"},"parameters":[],"headers":[],"authentication":{"type":"bearer","token":"{{ _.bearerToken }}","prefix":""},"metaSortKey":-1688512195066,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_0077437dc4e948b3a60bda326da1825e","parentId":"fld_1f9b90d0e7fd484ab93e5d7c8af1b14f","modified":1688512195065,"created":1688512195065,"url":"{{ _.base_url }}/users","name":"Create a new user","description":"","method":"POST","body":{"mimeType":"application/json","text":"{\n \"name\": \"string\",\n \"email\": \"user@example.com\",\n \"password\": \"string\",\n \"notifications\": true\n}"},"parameters":[],"headers":[],"authentication":{},"metaSortKey":-1688512195065,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_2b10adecdabd4d12b426c7bd9ea7772d","parentId":"fld_153108cda55d4c5b9ef5f845244faaae","modified":1688512195064,"created":1688512195064,"url":"{{ _.base_url }}/versions","name":"Get Bible Versions","description":"","method":"GET","body":{},"parameters":[],"headers":[],"authentication":{"type":"bearer","token":"{{ _.bearerToken }}","prefix":""},"metaSortKey":-1688512195064,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"fld_153108cda55d4c5b9ef5f845244faaae","parentId":"wrk_b3896d546c554b56b1f7fc0bd22144f1","modified":1688512195053,"created":1688512195053,"name":"Versions","description":"","environment":{},"environmentPropertyOrder":null,"metaSortKey":-1688512195053,"_type":"request_group"},{"_id":"req_ada3880be75b42e3ab84061252e1d461","parentId":"fld_ace2c5a94562456d95bf419124291011","modified":1688512195063,"created":1688512195063,"url":"{{ _.base_url }}/verses/search","name":"Search verses by word","description":"","method":"POST","body":{"mimeType":"application/json","text":"{\n \"version\": \"string\",\n \"search\": \"string\"\n}"},"parameters":[],"headers":[],"authentication":{"type":"bearer","token":"{{ _.bearerToken }}","prefix":""},"metaSortKey":-1688512195063,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"fld_ace2c5a94562456d95bf419124291011","parentId":"wrk_b3896d546c554b56b1f7fc0bd22144f1","modified":1688512195051,"created":1688512195051,"name":"Verses","description":"","environment":{},"environmentPropertyOrder":null,"metaSortKey":-1688512195051,"_type":"request_group"},{"_id":"req_bcbab1fa0a604eb3a08525142b1cee28","parentId":"fld_ace2c5a94562456d95bf419124291011","modified":1688512195062,"created":1688512195062,"url":"{{ _.base_url }}/verses/{{ _.version }}/{{ _.abbrev }}/random","name":"Get a random verse from a specific book","description":"","method":"GET","body":{},"parameters":[],"headers":[],"authentication":{"type":"bearer","token":"{{ _.bearerToken }}","prefix":""},"metaSortKey":-1688512195062,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_12e583c774304b8ea149295bf0444ac2","parentId":"fld_ace2c5a94562456d95bf419124291011","modified":1688512195061,"created":1688512195061,"url":"{{ _.base_url }}/verses/{{ _.version }}/random","name":"Get a random verse","description":"","method":"GET","body":{},"parameters":[],"headers":[],"authentication":{"type":"bearer","token":"{{ _.bearerToken }}","prefix":""},"metaSortKey":-1688512195061,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_b94a5bd5669e4ec5a7ee05f941e53538","parentId":"fld_ace2c5a94562456d95bf419124291011","modified":1688512195060,"created":1688512195060,"url":"{{ _.base_url }}/verses/{{ _.version }}/{{ _.abbrev }}/{{ _.chapter }}/{{ _.number }}","name":"Get a verse from a chapter","description":"","method":"GET","body":{},"parameters":[],"headers":[],"authentication":{"type":"bearer","token":"{{ _.bearerToken }}","prefix":""},"metaSortKey":-1688512195060,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_a386c64a55994b6884ffef06c06d7baa","parentId":"fld_ace2c5a94562456d95bf419124291011","modified":1688512195059,"created":1688512195059,"url":"{{ _.base_url }}/verses/{{ _.version }}/{{ _.abbrev }}/{{ _.chapter }}","name":"Get all verses and details of a chapter","description":"","method":"GET","body":{},"parameters":[],"headers":[],"authentication":{"type":"bearer","token":"{{ _.bearerToken }}","prefix":""},"metaSortKey":-1688512195059,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_fdb77dc26be64d78af0a75b879a1d35b","parentId":"fld_e1f008bb359f4484ace7f7cd01b95626","modified":1688512195057,"created":1688512195057,"url":"{{ _.base_url }}/books/{{ _.abbrev }}","name":"Get Book","description":"","method":"GET","body":{},"parameters":[],"headers":[],"authentication":{"type":"bearer","token":"{{ _.bearerToken }}","prefix":""},"metaSortKey":-1688512195057,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"fld_e1f008bb359f4484ace7f7cd01b95626","parentId":"wrk_b3896d546c554b56b1f7fc0bd22144f1","modified":1688512195050,"created":1688512195050,"name":"Books","description":"","environment":{},"environmentPropertyOrder":null,"metaSortKey":-1688512195050,"_type":"request_group"},{"_id":"req_9bcf822e8a574ca886f2bbc663a94d1a","parentId":"fld_e1f008bb359f4484ace7f7cd01b95626","modified":1688512195056,"created":1688512195056,"url":"{{ _.base_url }}/books","name":"Get Books","description":"","method":"GET","body":{},"parameters":[],"headers":[],"authentication":{"type":"bearer","token":"{{ _.bearerToken }}","prefix":""},"metaSortKey":-1688512195056,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_3b3f0b8bcf994f9fae9c7b436bd221d3","parentId":"fld_98ef0b24db834b8ca0e5b2bf4e6a1933","modified":1688512169069,"created":1688512169069,"url":"{{ _.base_url }}/requests/amount/{{ _.range }}","name":"Get number of requisitions for a specific period","description":"","method":"GET","body":{},"parameters":[],"headers":[],"authentication":{"type":"bearer","token":"{{ _.bearerToken }}","prefix":""},"metaSortKey":-1688512169069,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"fld_98ef0b24db834b8ca0e5b2bf4e6a1933","parentId":"wrk_b3896d546c554b56b1f7fc0bd22144f1","modified":1688512169057,"created":1688512169057,"name":"Requests","description":"","environment":{},"environmentPropertyOrder":null,"metaSortKey":-1688512169057,"_type":"request_group"},{"_id":"req_3fca4eb2339b495db0c025a3355e837f","parentId":"fld_98ef0b24db834b8ca0e5b2bf4e6a1933","modified":1688512169068,"created":1688512169068,"url":"{{ _.base_url }}/requests/{{ _.range }}","name":"Get requests for a specific period","description":"","method":"GET","body":{},"parameters":[],"headers":[],"authentication":{"type":"bearer","token":"{{ _.bearerToken }}","prefix":""},"metaSortKey":-1688512169068,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_e1e1f7a580f0402b9ea285511b1a4de5","parentId":"fld_50328b5bce93497e87fb0630fff2b6ed","modified":1688512169064,"created":1688512169064,"url":"{{ _.base_url }}/versions","name":"Get Bible Versions","description":"","method":"GET","body":{},"parameters":[],"headers":[],"authentication":{"type":"bearer","token":"{{ _.bearerToken }}","prefix":""},"metaSortKey":-1688512169064,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"fld_50328b5bce93497e87fb0630fff2b6ed","parentId":"wrk_b3896d546c554b56b1f7fc0bd22144f1","modified":1688512169056,"created":1688512169056,"name":"Versions","description":"","environment":{},"environmentPropertyOrder":null,"metaSortKey":-1688512169056,"_type":"request_group"},{"_id":"req_1ab411f18fc745aebf6c7eaca743ed62","parentId":"fld_114d45db9cf449f8aecb49b747c8ec47","modified":1688512169067,"created":1688512169067,"url":"{{ _.base_url }}/users/token","name":"Update token","description":"","method":"PUT","body":{"mimeType":"application/json","text":"{\n \"email\": \"user@example.com\",\n \"password\": \"string\"\n}"},"parameters":[],"headers":[],"authentication":{"type":"bearer","token":"{{ _.bearerToken }}","prefix":""},"metaSortKey":-1688512169067,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"fld_114d45db9cf449f8aecb49b747c8ec47","parentId":"wrk_b3896d546c554b56b1f7fc0bd22144f1","modified":1688512169056,"created":1688512169056,"name":"Users","description":"The project will always be open source. Authentication is only to identify how many users are using the project and to inform about new updates.","environment":{},"environmentPropertyOrder":null,"metaSortKey":-1688512169056,"_type":"request_group"},{"_id":"req_061990b2204944378c7d6e2195842229","parentId":"fld_114d45db9cf449f8aecb49b747c8ec47","modified":1688512169067,"created":1688512169067,"url":"{{ _.base_url }}/users/password/{{ _.email }}","name":"Resend user password","description":"","method":"POST","body":{},"parameters":[],"headers":[],"authentication":{"type":"bearer","token":"{{ _.bearerToken }}","prefix":""},"metaSortKey":-1688512169067,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_c76a2355b5614fefb66c2dcd7a229d8f","parentId":"fld_114d45db9cf449f8aecb49b747c8ec47","modified":1688512169066,"created":1688512169066,"url":"{{ _.base_url }}/users/stats","name":"Get user statistics","description":"","method":"GET","body":{},"parameters":[],"headers":[],"authentication":{"type":"bearer","token":"{{ _.bearerToken }}","prefix":""},"metaSortKey":-1688512169066,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_dd9217062915487990d6e7ee0abca756","parentId":"fld_114d45db9cf449f8aecb49b747c8ec47","modified":1688512169065,"created":1688512169065,"url":"{{ _.base_url }}/users","name":"Delete user","description":"","method":"DELETE","body":{"mimeType":"application/json","text":"{\n \"email\": \"user@example.com\",\n \"password\": \"string\"\n}"},"parameters":[],"headers":[],"authentication":{"type":"bearer","token":"{{ _.bearerToken }}","prefix":""},"metaSortKey":-1688512169065,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_5843f3111a7e4fa2aeda60726ef22459","parentId":"fld_114d45db9cf449f8aecb49b747c8ec47","modified":1688512169065,"created":1688512169065,"url":"{{ _.base_url }}/users/{{ _.email }}","name":"Get a user","description":"","method":"GET","body":{},"parameters":[],"headers":[],"authentication":{"type":"bearer","token":"{{ _.bearerToken }}","prefix":""},"metaSortKey":-1688512169065,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_89c370b1f27e42d5a134fae214c4e4d4","parentId":"fld_114d45db9cf449f8aecb49b747c8ec47","modified":1688512169064,"created":1688512169064,"url":"{{ _.base_url }}/users","name":"Create a new user","description":"","method":"POST","body":{"mimeType":"application/json","text":"{\n \"name\": \"string\",\n \"email\": \"user@example.com\",\n \"password\": \"string\",\n \"notifications\": true\n}"},"parameters":[],"headers":[],"authentication":{},"metaSortKey":-1688512169064,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_a83a74f3b4254ccc90992e7132d5845b","parentId":"fld_d7c4e962089a4ec1bfe2b599b5de74bd","modified":1688512169058,"created":1688512169058,"url":"{{ _.base_url }}/books/{{ _.abbrev }}","name":"Get Book","description":"","method":"GET","body":{},"parameters":[],"headers":[],"authentication":{"type":"bearer","token":"{{ _.bearerToken }}","prefix":""},"metaSortKey":-1688512169058,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"fld_d7c4e962089a4ec1bfe2b599b5de74bd","parentId":"wrk_b3896d546c554b56b1f7fc0bd22144f1","modified":1688512169055,"created":1688512169055,"name":"Books","description":"","environment":{},"environmentPropertyOrder":null,"metaSortKey":-1688512169055,"_type":"request_group"},{"_id":"req_1ff3aa1964864fbb92a399f927a3b349","parentId":"fld_d7c4e962089a4ec1bfe2b599b5de74bd","modified":1688512169057,"created":1688512169057,"url":"{{ _.base_url }}/books","name":"Get Books","description":"","method":"GET","body":{},"parameters":[],"headers":[],"authentication":{"type":"bearer","token":"{{ _.bearerToken }}","prefix":""},"metaSortKey":-1688512169057,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_b2a907d12e7d4b6fb054b6b33854ee03","parentId":"fld_186e62d1dd1b428194591c3a36d6328b","modified":1688512169063,"created":1688512169063,"url":"{{ _.base_url }}/verses/search","name":"Search verses by word","description":"","method":"POST","body":{"mimeType":"application/json","text":"{\n \"version\": \"string\",\n \"search\": \"string\"\n}"},"parameters":[],"headers":[],"authentication":{"type":"bearer","token":"{{ _.bearerToken }}","prefix":""},"metaSortKey":-1688512169063,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"fld_186e62d1dd1b428194591c3a36d6328b","parentId":"wrk_b3896d546c554b56b1f7fc0bd22144f1","modified":1688512169055,"created":1688512169055,"name":"Verses","description":"","environment":{},"environmentPropertyOrder":null,"metaSortKey":-1688512169055,"_type":"request_group"},{"_id":"req_3b922722a80847de9c8fe41f7a5e6091","parentId":"fld_186e62d1dd1b428194591c3a36d6328b","modified":1688512169062,"created":1688512169062,"url":"{{ _.base_url }}/verses/{{ _.version }}/{{ _.abbrev }}/random","name":"Get a random verse from a specific book","description":"","method":"GET","body":{},"parameters":[],"headers":[],"authentication":{"type":"bearer","token":"{{ _.bearerToken }}","prefix":""},"metaSortKey":-1688512169062,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_73ea4c35b758456fbb09fdd93e832df2","parentId":"fld_186e62d1dd1b428194591c3a36d6328b","modified":1688512169059,"created":1688512169059,"url":"{{ _.base_url }}/verses/{{ _.version }}/{{ _.abbrev }}/{{ _.chapter }}/{{ _.number }}","name":"Get a verse from a chapter","description":"","method":"GET","body":{},"parameters":[],"headers":[],"authentication":{"type":"bearer","token":"{{ _.bearerToken }}","prefix":""},"metaSortKey":-1688512169059,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_709231b82739491ba0e88a567c463f12","parentId":"fld_186e62d1dd1b428194591c3a36d6328b","modified":1688512169059,"created":1688512169059,"url":"{{ _.base_url }}/verses/{{ _.version }}/random","name":"Get a random verse","description":"","method":"GET","body":{},"parameters":[],"headers":[],"authentication":{"type":"bearer","token":"{{ _.bearerToken }}","prefix":""},"metaSortKey":-1688512169059,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_bbeb2d2f69a34d1f974a646d3c1b18fc","parentId":"fld_186e62d1dd1b428194591c3a36d6328b","modified":1688512169058,"created":1688512169058,"url":"{{ _.base_url }}/verses/{{ _.version }}/{{ _.abbrev }}/{{ _.chapter }}","name":"Get all verses and details of a chapter","description":"","method":"GET","body":{},"parameters":[],"headers":[],"authentication":{"type":"bearer","token":"{{ _.bearerToken }}","prefix":""},"metaSortKey":-1688512169058,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"env_96fe0e591b74486a8deca88d8029804b","parentId":"wrk_b3896d546c554b56b1f7fc0bd22144f1","modified":1688512169051,"created":1688512169051,"name":"Base environment","data":{"base_url":"{{ _.scheme }}://{{ _.host }}{{ _.base_path }}"},"dataPropertyOrder":null,"color":null,"isPrivate":false,"metaSortKey":1688512169052,"_type":"environment"},{"_id":"jar_06129e33808cf9851d8386201c049fc682991cbe","parentId":"wrk_b3896d546c554b56b1f7fc0bd22144f1","modified":1688512169089,"created":1688512169089,"name":"Default Jar","cookies":[],"_type":"cookie_jar"},{"_id":"spc_1535d69e2c114893be731ce8a1b0b8e3","parentId":"wrk_b3896d546c554b56b1f7fc0bd22144f1","modified":1688512189939,"created":1688512169045,"fileName":"BíbliaDigital | A RESTful API for Bible","contents":"openapi: '3.0.0'\n\ninfo:\n title: ABíbliaDigital | A RESTful API for Bible\n description:\n Do not worry about managing the multiple versions of the Bible\n RESTful Bible API with 7 versions, 4 languages and multiple features to simplify your day to day.\n contact:\n name: Contact us\n url: https://www.abibliadigital.com.br/\n license:\n name: BSD 2-Clause \"Simplified\" License\n url: https://github.com/omarciovsena/abibliadigital/blob/master/LICENSE.md\n version: 0.3.2\n\nservers:\n - url: https://www.abibliadigital.com.br/api\n description: Production server\n\n - url: http://localhost:3000/api\n description: Local server\n\ntags:\n - name: Books\n\n - name: Verses\n\n - name: Versions\n\n - name: Users\n description:\n The project will always be open source. Authentication is only to identify how many users are using the project and to inform about new updates.\n\n - name: Requests\n\ncomponents:\n securitySchemes:\n bearerAuth:\n type: http\n scheme: bearer\n bearerFormat: JWT\n description: >\n Without authentication the limit rate is 20 requests/hour/ip;\n With user token, requests are unlimited (it's free).\n\n To create a new user, see the API endpoint `POST /users` for more details.\n Note The limit rate was created to decrease the effectiveness of the attacks that we have been suffering from since 3/29/2020\n\n schemas:\n Book:\n type: object\n properties:\n abbrev:\n type: object\n properties:\n pt:\n type: string\n en:\n type: string\n author:\n type: string\n chapters:\n type: number\n comment:\n type: string\n group:\n type: string\n name:\n type: string\n testament:\n type: string\n version:\n type: string\n required:\n - abbrev\n - author\n - chapters\n - comment\n - group\n - name\n - testament\n\n Chapter:\n oneOf:\n - type: object\n properties:\n number:\n type: integer\n verses:\n type: integer\n required:\n - number\n - verses\n - type: integer\n\n Verse:\n type: object\n properties:\n book:\n type: object\n properties:\n id:\n type: string\n format: uuid\n abbrev:\n type: object\n properties:\n pt:\n type: string\n en:\n type: string\n required:\n - id\n - abbrev\n chapter:\n \"$ref\": \"#/components/schemas/Chapter\"\n number:\n type: number\n text:\n type: string\n version:\n type: string\n comment:\n type: string\n required:\n - book\n - chapter\n - number\n - text\n - version\n\n User:\n type: object\n properties:\n name:\n type: string\n email:\n type: string\n format: email\n password:\n type: string\n token:\n type: string\n notifications:\n type: boolean\n required:\n - name\n - email\n - password\n - token\n - notifications\n additionalProperties: false\n\n Version:\n type: object\n properties:\n version:\n type: string\n verses:\n type: integer\n required:\n - version\n - verses\n\n SearchResponse:\n type: object\n properties:\n occurrence:\n type: integer\n version:\n type: string\n verses:\n type: array\n items:\n $ref: \"#/components/schemas/Verse\"\n required:\n - occurrence\n - version\n - verses\n\n RateLimitResponse:\n type: object\n properties:\n msg:\n type: string\n example: Too many accounts created from this IP, please try again after an hour or login\n required:\n - msg\n\nsecurity:\n - bearerAuth: []\n\npaths:\n /books:\n get:\n summary: Get Books\n description: Returns a list of 66 bible books\n operationId: getBooks\n tags:\n - Books\n responses:\n '200':\n description: OK\n content:\n application/json:\n schema:\n type: array\n items:\n $ref: '#/components/schemas/Book'\n\n '409':\n description: Rate limit exceeded\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/RateLimitResponse\"\n\n /books/{abbrev}:\n get:\n summary: Get Book\n description: Returns details of a bible book\n operationId: getBook\n parameters:\n - in: path\n name: abbrev\n description: The abbreviation of the book\n schema:\n type: string\n required: true\n tags:\n - Books\n responses:\n '200':\n description: OK\n content:\n application/json:\n schema:\n $ref: '#/components/schemas/Book'\n\n '409':\n description: Rate limit exceeded\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/RateLimitResponse\"\n\n /verses/{version}/{abbrev}/{chapter}:\n get:\n summary: Get all verses and details of a chapter\n operationId: getChapter\n parameters:\n - name: version\n in: path\n required: true\n description: The version of the Bible (e.g., \"nvi\")\n schema:\n type: string\n - name: abbrev\n in: path\n required: true\n description: The abbreviation of the book (e.g., \"gn\" for Genesis)\n schema:\n type: string\n - name: chapter\n in: path\n required: true\n description: The chapter number\n schema:\n type: integer\n tags:\n - Verses\n responses:\n '200':\n description: Successful response containing the chapter details and verses\n content:\n application/json:\n schema:\n type: object\n properties:\n book:\n $ref: \"#/components/schemas/Book\"\n chapter:\n $ref: \"#/components/schemas/Chapter\"\n verses:\n type: array\n items:\n $ref: \"#/components/schemas/Verse\"\n\n '409':\n description: Rate limit exceeded\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/RateLimitResponse\"\n\n /verses/{version}/{abbrev}/{chapter}/{number}:\n get:\n summary: Get a verse from a chapter\n operationId: getVerse\n parameters:\n - name: version\n in: path\n required: true\n description: The version of the Bible (e.g., \"nvi\")\n schema:\n type: string\n - name: abbrev\n in: path\n required: true\n description: The abbreviation of the book (e.g., \"gn\" for Genesis)\n schema:\n type: string\n - name: chapter\n in: path\n required: true\n description: The chapter number\n schema:\n type: integer\n - name: number\n in: path\n required: true\n description: The verse number\n schema:\n type: integer\n tags:\n - Verses\n responses:\n '200':\n description: Successful response containing the verse\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/Verse\"\n '409':\n description: Rate limit exceeded\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/RateLimitResponse\"\n\n /verses/{version}/random:\n get:\n summary: Get a random verse\n operationId: getRandomVerse\n parameters:\n - name: version\n in: path\n required: true\n description: The version of the Bible (e.g., \"nvi\")\n schema:\n type: string\n tags:\n - Verses\n responses:\n '200':\n description: Successful response containing the random verse\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/Verse\"\n\n '409':\n description: Rate limit exceeded\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/RateLimitResponse\"\n\n /verses/{version}/{abbrev}/random:\n get:\n summary: Get a random verse from a specific book\n operationId: getRandomVerseFromBook\n parameters:\n - name: version\n in: path\n required: true\n description: The version of the Bible (e.g., \"nvi\")\n schema:\n type: string\n - name: abbrev\n in: path\n required: true\n description: The abbreviation of the book (e.g., \"gn\" for Genesis)\n schema:\n type: string\n tags:\n - Verses\n responses:\n '200':\n description: Successful response containing the random verse from the specified book\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/Verse\"\n\n '409':\n description: Rate limit exceeded\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/RateLimitResponse\"\n\n\n /verses/search:\n post:\n summary: Search verses by word\n operationId: search\n requestBody:\n required: true\n content:\n application/json:\n schema:\n type: object\n properties:\n version:\n type: string\n search:\n type: string\n required:\n - version\n - search\n\n tags:\n - Verses\n responses:\n '200':\n description: Successful response containing the search results\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/SearchResponse\"\n\n '409':\n description: Rate limit exceeded\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/RateLimitResponse\"\n\n /versions:\n get:\n summary: Get Bible Versions\n description: Returns all Bible versions and the number of verses in each version.\n operationId: getVersions\n tags:\n - Versions\n responses:\n '200':\n description: OK\n content:\n application/json:\n schema:\n type: array\n items:\n $ref: '#/components/schemas/Version'\n\n '409':\n description: Rate limit exceeded\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/RateLimitResponse\"\n\n /users:\n post:\n security: []\n summary: Create a new user\n operationId: createUser\n requestBody:\n required: true\n content:\n application/json:\n schema:\n type: object\n properties:\n name:\n type: string\n email:\n type: string\n format: email\n password:\n type: string\n minLength: 6\n notifications:\n type: boolean\n required:\n - name\n - email\n - password\n - notifications\n tags:\n - Users\n\n responses:\n '200':\n description: OK\n content:\n application/json:\n schema:\n type: object\n properties:\n name:\n type: string\n email:\n type: string\n format: email\n token:\n type: string\n notifications:\n type: boolean\n delete:\n summary: Delete user\n operationId: removeUser\n security:\n - bearerAuth: []\n requestBody:\n required: true\n content:\n application/json:\n schema:\n type: object\n properties:\n email:\n type: string\n format: email\n password:\n type: string\n minLength: 6\n required:\n - email\n - password\n tags:\n - Users\n responses:\n '200':\n description: OK\n content:\n application/json:\n schema:\n type: object\n properties:\n msg:\n type: string\n\n /users/{email}:\n get:\n summary: Get a user\n operationId: getUser\n parameters:\n - name: email\n in: path\n description: User email address\n required: true\n schema:\n type: string\n format: email\n tags:\n - Users\n security:\n - bearerAuth: []\n responses:\n '200':\n description: OK\n content:\n application/json:\n schema:\n type: object\n properties:\n name:\n type: string\n email:\n type: string\n format: email\n token:\n type: string\n notifications:\n type: boolean\n lastLogin:\n type: string\n format: date-time\n /users/stats:\n get:\n summary: Get user statistics\n operationId: getUserStats\n security:\n - bearerAuth: []\n tags:\n - Users\n responses:\n '200':\n description: OK\n content:\n application/json:\n schema:\n type: object\n properties:\n lastLogin:\n type: string\n format: date-time\n requestsPerMonth:\n type: array\n items:\n type: object\n properties:\n range:\n type: string\n total:\n type: integer\n\n /users/token:\n put:\n summary: Update token\n operationId: updateToken\n requestBody:\n required: true\n content:\n application/json:\n schema:\n type: object\n properties:\n email:\n type: string\n format: email\n password:\n type: string\n minLength: 6\n required:\n - email\n - password\n tags:\n - Users\n responses:\n '200':\n description: OK\n content:\n application/json:\n schema:\n type: object\n properties:\n name:\n type: string\n email:\n type: string\n format: email\n token:\n type: string\n\n /users/password/{email}:\n post:\n summary: Resend user password\n operationId: resendNewPassword\n parameters:\n - name: email\n in: path\n description: User email address\n required: true\n schema:\n type: string\n format: email\n tags:\n - Users\n responses:\n '200':\n description: OK\n content:\n application/json:\n schema:\n type: object\n properties:\n msg:\n type: string\n\n /requests/{range}:\n get:\n summary: Get requests for a specific period\n operationId: getRequests\n parameters:\n - name: range\n in: path\n description: Period range (month, week, day)\n required: true\n schema:\n type: string\n tags:\n - Requests\n responses:\n '200':\n description: OK\n content:\n application/json:\n schema:\n type: array\n items:\n type: object\n properties:\n url:\n type: string\n date:\n type: string\n format: date-time\n\n /requests/amount/{range}:\n get:\n summary: Get number of requisitions for a specific period\n operationId: getRequestsNumber\n parameters:\n - name: range\n in: path\n description: Period range (month, week, day)\n required: true\n schema:\n type: string\n tags:\n - Requests\n responses:\n '200':\n description: OK\n content:\n application/json:\n schema:\n type: object\n properties:\n total:\n type: integer\n requests:\n type: array\n items:\n type: object\n properties:\n _id:\n type: string\n count:\n type: integer\n","contentType":"yaml","_type":"api_spec"},{"_id":"env_51c18458f1fe43b2ae5a1a18940e7dfb","parentId":"env_96fe0e591b74486a8deca88d8029804b","modified":1688512877817,"created":1688512169053,"name":"abibliadigital.com.br","data":{"scheme":"https","base_path":"/api","host":"www.abibliadigital.com.br","bearerToken":"bearerToken"},"dataPropertyOrder":{"&":["scheme","base_path","host","bearerToken"]},"color":"#1b4796","isPrivate":false,"metaSortKey":1688512169053,"_type":"environment"},{"_id":"env_b8756e7d54bc49b9b56a29bd3be2746f","parentId":"env_96fe0e591b74486a8deca88d8029804b","modified":1688512864169,"created":1688512169054,"name":"development","data":{"scheme":"http","base_path":"/api","host":"localhost:3000","bearerToken":"bearerToken"},"dataPropertyOrder":null,"color":"#67cbbf","isPrivate":false,"metaSortKey":1688512169054,"_type":"environment"}]}
\ No newline at end of file
diff --git a/docs/openapi.yaml b/docs/openapi.yaml
new file mode 100644
index 0000000..28f25c6
--- /dev/null
+++ b/docs/openapi.yaml
@@ -0,0 +1,733 @@
+openapi: '3.0.0'
+
+info:
+ title: ABíbliaDigital | A RESTful API for Bible
+ description:
+ Do not worry about managing the multiple versions of the Bible
+ RESTful Bible API with 7 versions, 4 languages and multiple features to simplify your day to day.
+ contact:
+ name: Contact us
+ url: https://www.abibliadigital.com.br/
+ license:
+ name: BSD 2-Clause "Simplified" License
+ url: https://github.com/omarciovsena/abibliadigital/blob/master/LICENSE.md
+ version: 0.3.2
+
+servers:
+ - url: https://www.abibliadigital.com.br/api
+ description: Production server
+
+ - url: http://localhost:3000/api
+ description: Local server
+
+tags:
+ - name: Books
+
+ - name: Verses
+
+ - name: Versions
+
+ - name: Users
+ description:
+ The project will always be open source. Authentication is only to identify how many users are using the project and to inform about new updates.
+
+ - name: Requests
+
+components:
+ securitySchemes:
+ bearerAuth:
+ type: http
+ scheme: bearer
+ bearerFormat: JWT
+ description: >
+ Without authentication the limit rate is 20 requests/hour/ip;
+ With user token, requests are unlimited (it's free).
+
+ To create a new user, see the API endpoint `POST /users` for more details.
+ Note The limit rate was created to decrease the effectiveness of the attacks that we have been suffering from since 3/29/2020
+
+ schemas:
+ Book:
+ type: object
+ properties:
+ abbrev:
+ type: object
+ properties:
+ pt:
+ type: string
+ en:
+ type: string
+ author:
+ type: string
+ chapters:
+ type: number
+ comment:
+ type: string
+ group:
+ type: string
+ name:
+ type: string
+ testament:
+ type: string
+ version:
+ type: string
+ required:
+ - abbrev
+ - author
+ - chapters
+ - comment
+ - group
+ - name
+ - testament
+
+ Chapter:
+ oneOf:
+ - type: object
+ properties:
+ number:
+ type: integer
+ verses:
+ type: integer
+ required:
+ - number
+ - verses
+ - type: integer
+
+ Verse:
+ type: object
+ properties:
+ book:
+ type: object
+ properties:
+ id:
+ type: string
+ format: uuid
+ abbrev:
+ type: object
+ properties:
+ pt:
+ type: string
+ en:
+ type: string
+ required:
+ - id
+ - abbrev
+ chapter:
+ "$ref": "#/components/schemas/Chapter"
+ number:
+ type: number
+ text:
+ type: string
+ version:
+ type: string
+ comment:
+ type: string
+ required:
+ - book
+ - chapter
+ - number
+ - text
+ - version
+
+ User:
+ type: object
+ properties:
+ name:
+ type: string
+ email:
+ type: string
+ format: email
+ password:
+ type: string
+ token:
+ type: string
+ notifications:
+ type: boolean
+ required:
+ - name
+ - email
+ - password
+ - token
+ - notifications
+ additionalProperties: false
+
+ Version:
+ type: object
+ properties:
+ version:
+ type: string
+ verses:
+ type: integer
+ required:
+ - version
+ - verses
+
+ SearchResponse:
+ type: object
+ properties:
+ occurrence:
+ type: integer
+ version:
+ type: string
+ verses:
+ type: array
+ items:
+ $ref: "#/components/schemas/Verse"
+ required:
+ - occurrence
+ - version
+ - verses
+
+ RateLimitResponse:
+ type: object
+ properties:
+ msg:
+ type: string
+ example: Too many accounts created from this IP, please try again after an hour or login
+ required:
+ - msg
+
+security:
+ - bearerAuth: []
+
+paths:
+ /books:
+ get:
+ summary: Get Books
+ description: Returns a list of 66 bible books
+ operationId: getBooks
+ tags:
+ - Books
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/Book'
+
+ '409':
+ description: Rate limit exceeded
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/RateLimitResponse"
+
+ /books/{abbrev}:
+ get:
+ summary: Get Book
+ description: Returns details of a bible book
+ operationId: getBook
+ parameters:
+ - in: path
+ name: abbrev
+ description: The abbreviation of the book
+ schema:
+ type: string
+ required: true
+ tags:
+ - Books
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Book'
+
+ '409':
+ description: Rate limit exceeded
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/RateLimitResponse"
+
+ /verses/{version}/{abbrev}/{chapter}:
+ get:
+ summary: Get all verses and details of a chapter
+ operationId: getChapter
+ parameters:
+ - name: version
+ in: path
+ required: true
+ description: The version of the Bible (e.g., "nvi")
+ schema:
+ type: string
+ - name: abbrev
+ in: path
+ required: true
+ description: The abbreviation of the book (e.g., "gn" for Genesis)
+ schema:
+ type: string
+ - name: chapter
+ in: path
+ required: true
+ description: The chapter number
+ schema:
+ type: integer
+ tags:
+ - Verses
+ responses:
+ '200':
+ description: Successful response containing the chapter details and verses
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ book:
+ $ref: "#/components/schemas/Book"
+ chapter:
+ $ref: "#/components/schemas/Chapter"
+ verses:
+ type: array
+ items:
+ $ref: "#/components/schemas/Verse"
+
+ '409':
+ description: Rate limit exceeded
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/RateLimitResponse"
+
+ /verses/{version}/{abbrev}/{chapter}/{number}:
+ get:
+ summary: Get a verse from a chapter
+ operationId: getVerse
+ parameters:
+ - name: version
+ in: path
+ required: true
+ description: The version of the Bible (e.g., "nvi")
+ schema:
+ type: string
+ - name: abbrev
+ in: path
+ required: true
+ description: The abbreviation of the book (e.g., "gn" for Genesis)
+ schema:
+ type: string
+ - name: chapter
+ in: path
+ required: true
+ description: The chapter number
+ schema:
+ type: integer
+ - name: number
+ in: path
+ required: true
+ description: The verse number
+ schema:
+ type: integer
+ tags:
+ - Verses
+ responses:
+ '200':
+ description: Successful response containing the verse
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/Verse"
+ '409':
+ description: Rate limit exceeded
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/RateLimitResponse"
+
+ /verses/{version}/random:
+ get:
+ summary: Get a random verse
+ operationId: getRandomVerse
+ parameters:
+ - name: version
+ in: path
+ required: true
+ description: The version of the Bible (e.g., "nvi")
+ schema:
+ type: string
+ tags:
+ - Verses
+ responses:
+ '200':
+ description: Successful response containing the random verse
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/Verse"
+
+ '409':
+ description: Rate limit exceeded
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/RateLimitResponse"
+
+ /verses/{version}/{abbrev}/random:
+ get:
+ summary: Get a random verse from a specific book
+ operationId: getRandomVerseFromBook
+ parameters:
+ - name: version
+ in: path
+ required: true
+ description: The version of the Bible (e.g., "nvi")
+ schema:
+ type: string
+ - name: abbrev
+ in: path
+ required: true
+ description: The abbreviation of the book (e.g., "gn" for Genesis)
+ schema:
+ type: string
+ tags:
+ - Verses
+ responses:
+ '200':
+ description: Successful response containing the random verse from the specified book
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/Verse"
+
+ '409':
+ description: Rate limit exceeded
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/RateLimitResponse"
+
+
+ /verses/search:
+ post:
+ summary: Search verses by word
+ operationId: search
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ version:
+ type: string
+ search:
+ type: string
+ required:
+ - version
+ - search
+
+ tags:
+ - Verses
+ responses:
+ '200':
+ description: Successful response containing the search results
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/SearchResponse"
+
+ '409':
+ description: Rate limit exceeded
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/RateLimitResponse"
+
+ /versions:
+ get:
+ summary: Get Bible Versions
+ description: Returns all Bible versions and the number of verses in each version.
+ operationId: getVersions
+ tags:
+ - Versions
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/Version'
+
+ '409':
+ description: Rate limit exceeded
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/RateLimitResponse"
+
+ /users:
+ post:
+ security: []
+ summary: Create a new user
+ operationId: createUser
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ name:
+ type: string
+ email:
+ type: string
+ format: email
+ password:
+ type: string
+ minLength: 6
+ notifications:
+ type: boolean
+ required:
+ - name
+ - email
+ - password
+ - notifications
+ tags:
+ - Users
+
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ name:
+ type: string
+ email:
+ type: string
+ format: email
+ token:
+ type: string
+ notifications:
+ type: boolean
+ delete:
+ summary: Delete user
+ operationId: removeUser
+ security:
+ - bearerAuth: []
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ email:
+ type: string
+ format: email
+ password:
+ type: string
+ minLength: 6
+ required:
+ - email
+ - password
+ tags:
+ - Users
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ msg:
+ type: string
+
+ /users/{email}:
+ get:
+ summary: Get a user
+ operationId: getUser
+ parameters:
+ - name: email
+ in: path
+ description: User email address
+ required: true
+ schema:
+ type: string
+ format: email
+ tags:
+ - Users
+ security:
+ - bearerAuth: []
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ name:
+ type: string
+ email:
+ type: string
+ format: email
+ token:
+ type: string
+ notifications:
+ type: boolean
+ lastLogin:
+ type: string
+ format: date-time
+ /users/stats:
+ get:
+ summary: Get user statistics
+ operationId: getUserStats
+ security:
+ - bearerAuth: []
+ tags:
+ - Users
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ lastLogin:
+ type: string
+ format: date-time
+ requestsPerMonth:
+ type: array
+ items:
+ type: object
+ properties:
+ range:
+ type: string
+ total:
+ type: integer
+
+ /users/token:
+ put:
+ summary: Update token
+ operationId: updateToken
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ email:
+ type: string
+ format: email
+ password:
+ type: string
+ minLength: 6
+ required:
+ - email
+ - password
+ tags:
+ - Users
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ name:
+ type: string
+ email:
+ type: string
+ format: email
+ token:
+ type: string
+
+ /users/password/{email}:
+ post:
+ summary: Resend user password
+ operationId: resendNewPassword
+ parameters:
+ - name: email
+ in: path
+ description: User email address
+ required: true
+ schema:
+ type: string
+ format: email
+ tags:
+ - Users
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ msg:
+ type: string
+
+ /requests/{range}:
+ get:
+ summary: Get requests for a specific period
+ operationId: getRequests
+ parameters:
+ - name: range
+ in: path
+ description: Period range (month, week, day)
+ required: true
+ schema:
+ type: string
+ tags:
+ - Requests
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ type: object
+ properties:
+ url:
+ type: string
+ date:
+ type: string
+ format: date-time
+
+ /requests/amount/{range}:
+ get:
+ summary: Get number of requisitions for a specific period
+ operationId: getRequestsNumber
+ parameters:
+ - name: range
+ in: path
+ description: Period range (month, week, day)
+ required: true
+ schema:
+ type: string
+ tags:
+ - Requests
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ total:
+ type: integer
+ requests:
+ type: array
+ items:
+ type: object
+ properties:
+ _id:
+ type: string
+ count:
+ type: integer
diff --git a/package.json b/package.json
index 1c556d7..b20d3ee 100644
--- a/package.json
+++ b/package.json
@@ -39,7 +39,7 @@
"generate-password": "^1.7.0",
"i18n": "^0.8.6",
"jest": "^24.9.0",
- "jsonwebtoken": "^8.5.1",
+ "jsonwebtoken": "^9.0.0",
"md5": "^2.3.0",
"moment": "^2.29.4",
"mongoose": "^6.5.1",
@@ -63,4 +63,4 @@
"node-mocks-http": "^1.10.1",
"nodemon": "^2.0.7"
}
-}
+}
\ No newline at end of file
diff --git a/public/theme-v2/css/style.css b/public/theme-v2/css/style.css
index 0b1611d..ebca537 100644
--- a/public/theme-v2/css/style.css
+++ b/public/theme-v2/css/style.css
@@ -507,6 +507,30 @@ nav .container {
}
}
+#documentation-links {
+ margin-top: 16px;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ align-items: center;
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ justify-content: center;
+}
+
+#documentation-links img {
+ margin: 0 10px;
+ width: 24px;
+}
+
+#documentation-links img {
+ filter: invert(16%) sepia(7%) saturate(7485%) hue-rotate(175deg) brightness(88%) contrast(90%);
+}
+
+#documentation-links img:hover {
+ filter: invert(19%) sepia(55%) saturate(2547%) hue-rotate(212deg) brightness(95%) contrast(89%);
+}
+
#about {
background: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), color-stop(50%, #fcf8e3), color-stop(50%, #fafafa), to(#fafafa));
background: linear-gradient(180deg, #fcf8e3 0%, #fcf8e3 50%, #fafafa 50%, #fafafa 100%);
diff --git a/public/theme-v2/images/ic-insomnia.svg b/public/theme-v2/images/ic-insomnia.svg
new file mode 100644
index 0000000..1d6a3ea
--- /dev/null
+++ b/public/theme-v2/images/ic-insomnia.svg
@@ -0,0 +1,6 @@
+
\ No newline at end of file
diff --git a/public/theme-v2/images/ic-postman.svg b/public/theme-v2/images/ic-postman.svg
new file mode 100644
index 0000000..c1beef0
--- /dev/null
+++ b/public/theme-v2/images/ic-postman.svg
@@ -0,0 +1,6 @@
+
\ No newline at end of file
diff --git a/public/theme-v2/images/ic-swagger.svg b/public/theme-v2/images/ic-swagger.svg
new file mode 100644
index 0000000..d7884d7
--- /dev/null
+++ b/public/theme-v2/images/ic-swagger.svg
@@ -0,0 +1,6 @@
+
\ No newline at end of file
diff --git a/views/index.pug b/views/index.pug
index b57ad52..b4b0efb 100644
--- a/views/index.pug
+++ b/views/index.pug
@@ -101,6 +101,10 @@ body
p= __('bannerDescription')
.col
a.btn-primary(href='https://github.com/omarciovsena/abibliadigital/blob/master/DOCUMENTATION.md' target='_blank' title=__('documentationTitle'))= __('bannerButton')
+ ul#documentation-links
+ li: a.doc-icon.icon-svg(href='https://insomnia.rest/run/?label=AB%C3%ADbliaDigital%20API&uri=https%3A%2F%2Fraw%2Egithubusercontent%2Ecom%2Fomarciovsena%2Fabibliadigital%2Fmaster%2Fdocs%2Finsomnia.json' target='_blank' title=__('bannerDocInsomniaTitle')): img(src='/theme-v2/images/ic-insomnia.svg' alt=__('bannerDocInsomniaTitle'))
+ li: a.doc-icon.icon-svg(href='https://www.postman.com/nathabonfim59/workspace/github-contributions/api/c9a09e38-b0ca-41f4-85bb-d7cea69d4866' target='_blank' title=__('bannerDocPostmanTitle')): img(src='/theme-v2/images/ic-postman.svg' alt=__('bannerDocPostmanTitle'))
+ li: a.doc-icon.icon-svg(href='https://editor.swagger.io/?url=https%3A%2F%2Fraw%2Egithubusercontent%2Ecom%2Fomarciovsena%2Fabibliadigital%2Fmaster%2Fdocs%2Fopenapi.yaml' target='_blank' title=__('bannerDocSwaggerTitle')): img(src='/theme-v2/images/ic-swagger.svg' alt=__('bannerDocSwaggerTitle'))
// How To Use
section#howToUse
.container
diff --git a/views/locales/en.json b/views/locales/en.json
index 1515b44..526af0d 100644
--- a/views/locales/en.json
+++ b/views/locales/en.json
@@ -6,6 +6,9 @@
"availabilityDescription": "Servers stable and prepared for high requests loads",
"bannerButton": "Documentation",
"bannerDescription": "Access our documentation, see how simple it is and start integrating today.",
+ "bannerDocInsomniaTitle": "Open API documentation in Insomnia",
+ "bannerDocPostmanTitle": "Open API documentation in Postman",
+ "bannerDocSwaggerTitle": "Open API documentation in Swagger",
"bannerTitle": "Get started now",
"buttonContactUs": "Contact us",
"buttonStartNow": "Get started now",
@@ -67,4 +70,4 @@
"yearly": "Yearly",
"bannerDescription1": "bannerDescription1",
"bannerDescription2": "bannerDescription2"
-}
\ No newline at end of file
+}
diff --git a/views/locales/pt.json b/views/locales/pt.json
index c1cc451..7ada437 100644
--- a/views/locales/pt.json
+++ b/views/locales/pt.json
@@ -6,6 +6,9 @@
"availabilityDescription": "Servidores estáveis e preparados para altas cargas de requisições",
"bannerButton": "Documentação",
"bannerDescription": "Acesse nossa documentação, veja o quanto é simples e comece hoje a sua integração.",
+ "bannerDocInsomniaTitle": "Abrir documentação da API no Insomnia",
+ "bannerDocPostmanTitle": "Abrir documentação da API no Postman",
+ "bannerDocSwaggerTitle": "Abrir documentação da API no Swagger",
"bannerTitle": "Teste agora!",
"buttonContactUs": "Fale Conosco",
"buttonStartNow": "Comece já",
@@ -67,4 +70,4 @@
"yearly": "Anual",
"bannerDescription1": "bannerDescription1",
"bannerDescription2": "bannerDescription2"
-}
\ No newline at end of file
+}
diff --git a/yarn.lock b/yarn.lock
index d8a8a14..7a5fd59 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -4580,10 +4580,10 @@ json5@^2.2.3:
resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283"
integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
-jsonwebtoken@^8.5.1:
- version "8.5.1"
- resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d"
- integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==
+jsonwebtoken@^9.0.0:
+ version "9.0.2"
+ resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz#65ff91f4abef1784697d40952bb1998c504caaf3"
+ integrity sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==
dependencies:
jws "^3.2.2"
lodash.includes "^4.3.0"
@@ -4594,7 +4594,7 @@ jsonwebtoken@^8.5.1:
lodash.isstring "^4.0.1"
lodash.once "^4.0.0"
ms "^2.1.1"
- semver "^5.6.0"
+ semver "^7.5.4"
jsprim@^1.2.2:
version "1.4.2"
@@ -6255,7 +6255,7 @@ semver@^6.0.0, semver@^6.1.0, semver@^6.1.2, semver@^6.2.0, semver@^6.3.1:
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
-semver@^7.3.2:
+semver@^7.3.2, semver@^7.5.4:
version "7.6.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d"
integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==