From 8ef534dc50e435247d2a6b38b0b0901c0c8d6bda Mon Sep 17 00:00:00 2001 From: Saddock Kabandana Date: Mon, 25 Nov 2024 19:02:13 +0200 Subject: [PATCH] Revert "ft: Generate API Documentation (#146)" (#159) * Revert "ft: Generate API Documentation (#146)" This reverts commit fa2bf8842256e079528ac53c2a87a4aac3b0fe6f. * updated .env.example --- .env.example | 8 +- README.md | 122 +++--------- package.json | 1 - public/assets/apple-touch-icon.png | Bin 6316 -> 0 bytes public/assets/devpulse.svg | 5 - public/assets/favicon-96x96.png | Bin 3149 -> 0 bytes public/assets/favicon.ico | Bin 15086 -> 0 bytes public/assets/favicon.svg | 7 - public/assets/site.webmanifest | 21 -- public/assets/web-app-manifest-192x192.png | Bin 6993 -> 0 bytes public/assets/web-app-manifest-512x512.png | Bin 25370 -> 0 bytes public/css/doc.css | 190 ------------------ public/css/style.css | 213 --------------------- public/documentation.html | 160 ---------------- public/index.html | 92 --------- src/index.ts | 22 +-- tsconfig.json | 2 +- 17 files changed, 35 insertions(+), 808 deletions(-) delete mode 100644 public/assets/apple-touch-icon.png delete mode 100644 public/assets/devpulse.svg delete mode 100644 public/assets/favicon-96x96.png delete mode 100644 public/assets/favicon.ico delete mode 100644 public/assets/favicon.svg delete mode 100644 public/assets/site.webmanifest delete mode 100644 public/assets/web-app-manifest-192x192.png delete mode 100644 public/assets/web-app-manifest-512x512.png delete mode 100644 public/css/doc.css delete mode 100644 public/css/style.css delete mode 100644 public/documentation.html delete mode 100644 public/index.html mode change 100644 => 100755 src/index.ts diff --git a/.env.example b/.env.example index eb0ff1f0..34b9de5f 100755 --- a/.env.example +++ b/.env.example @@ -8,6 +8,8 @@ API_KEY= SENDER_NAME= API_KEYS= FRONTEND_URL= -SUPER_ADMIN_EMAIL= -JWT_SECRET= -ADMIN_EMAIL= +PUSHER_APP_ID= +PUSHER_KEY= +PUSHER_SECRET= +PUSHER_CLUSTER= +Gnews_Api_Key= diff --git a/README.md b/README.md index db6a9829..0e7366d5 100755 --- a/README.md +++ b/README.md @@ -1,114 +1,40 @@ - -# DevPulse Backend +# atlp-devpulse-bn ## Introduction -DevPulse is an innovative platform designed to handle ratings for companies in the **Ed-tech** industry, with its first paying customer being **Andela**. It is currently under development using modern web technologies that prioritize speed and security. This repository contains the codebase for the backend part of the platform, which utilizes **GraphQL, Apollo, and MongoDB**. - -## Table of Contents - -- [Hosted Link](#hosted-link) -- [Features](#features) -- [Technologies](#technologies) -- [Getting Started](#getting-started) - - [Prerequisites](#prerequisites) - - [Installation](#installation) -- [Usage](#usage) -- [API Documentation](#api-documentation) -- [Contributing](#contributing) -- [Contact](#contact) +Pulse is a platform designed to handle ratings for the companies in the **Ed-tech** industries with the its first paying customer being **Andela**. It is currently under development using modern web technologies that prioritize speed and security. This repo holds the codebase for the backend part of the platform which uses **Graphql, Apollo and mongoDB**. ## Hosted Link -The backend is currently hosted at: [https://atlp-devpulse-bn.onrender.com/](https://atlp-devpulse-bn.onrender.com/) - -## Features - -- Real-time performance metrics tracking -- Advanced attendance management -- Dynamic application cycle overview -- Secure authentication and authorization -- Scalable GraphQL API - -## Technologies - -To successfully navigate and contribute to the codebase, you should have an understanding of the following technologies: - -- [GraphQL](https://graphql.org/): A query language for APIs -- [TypeScript](https://www.typescriptlang.org/): A typed superset of JavaScript -- [Apollo Server](https://www.apollographql.com/docs/apollo-server/): A GraphQL server -- [MongoDB](https://www.mongodb.com/): A NoSQL database -- [Node.js](https://nodejs.org/): A JavaScript runtime -- [Express](https://expressjs.com/): A web application framework for Node.js - -## Getting Started - -### Prerequisites - -Before running this project, make sure you have the following installed: +https://andela-devpulse-backend.devpulse.co/ -- [Node.js](https://nodejs.org/) (version 14 or later) -- [Git](https://git-scm.com/) -- [MongoDB](https://www.mongodb.com/try/download/community) (local installation or a cloud-hosted instance) +## How to run -### Installation +To run this project on your local machine make sure that all the following are checked -1. Clone the repository: - ```bash - git clone https://github.com/atlp-rwanda/atlp-devpulse-bn.git - ``` +- [ ] Nodejs installed on your computer ([MacOS](https://nodejs.org/en/download/), [Windows](https://nodejs.org/en/download/), [Linux](https://nodejs.org/en/download/)) +- [ ] Git installed on your computer -2. Navigate to the project directory: - ```bash - cd atlp-devpulse-bn - ``` +Use the following commands to get started with the project -3. Install dependencies: - ```bash - npm install - ``` +```js +git clone https://github.com/atlp-rwanda/atlp-devpulse-bn.git +cd atlp-devpulse-bn +npm install +npm run dev -4. Set up environment variables: - - Copy the `.env.example` file to `.env` - - Fill in the required environment variables -5. Start the development server: - ```bash - npm run dev - ``` +### Other scripts and their usages +- `npm run build` is used to build the production ready version of the projects. +Used during deployment -## Usage - -### Available Scripts - -- `npm run dev`: Starts the development server using nodemon -- `npm start`: Starts the production server -- `npm test`: Runs the test suite using Jest -- `npm run build`: Builds the production-ready version of the project using TypeScript compiler -- `npm run seed`: Runs the database seeding script - -## API Documentation - -For detailed information about the API endpoints and how to use them, please refer to our [API Documentation](https://atlp-devpulse-bn.onrender.com/graphql). - -## Contributing - -We welcome contributions to the DevPulse project! Please follow these steps to contribute: - -1. Fork the repository -2. Create a new branch (`git checkout -b feature/AmazingFeature`) -3. Make your changes -4. Commit your changes (`git commit -m 'Add some AmazingFeature'`) -5. Push to the branch (`git push origin feature/AmazingFeature`) -6. Open a Pull Request - -Please make sure to update tests as appropriate and adhere to the [Contributor Covenant](https://www.contributor-covenant.org/) code of conduct. - - -## Contact +## Technologies -DevPulse Team - [devpulsedev@gmail.com](mailto:devpulsedev@gmail.com) +To successfully navigate the codebase of the project, you will need undertanding +of the following technologies that are being used to develop this application: -Project Links: -- [https://github.com/atlp-rwanda/atlp-devpulse-bn](https://github.com/atlp-rwanda/atlp-devpulse-bn) -- https://atlp-devpulse-bn.onrender.com/ +- GraphQl +- Typescript +- Apollo server +- MongoDB +``` diff --git a/package.json b/package.json index 1eab4012..8fd48b0f 100755 --- a/package.json +++ b/package.json @@ -39,7 +39,6 @@ "@graphql-tools/merge": "^8.3.7", "@sendgrid/mail": "^8.1.3", "apollo-server": "^3.10.2", - "apollo-server-express": "^3.13.0", "axios": "^1.7.7", "bcrypt": "^5.1.1", "bcryptjs": "^2.4.3", diff --git a/public/assets/apple-touch-icon.png b/public/assets/apple-touch-icon.png deleted file mode 100644 index 296c6d41f4038fdbe258bcde456f13b109d9d108..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6316 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 diff --git a/public/assets/devpulse.svg b/public/assets/devpulse.svg deleted file mode 100644 index de42cf92..00000000 --- a/public/assets/devpulse.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/public/assets/favicon-96x96.png b/public/assets/favicon-96x96.png deleted file mode 100644 index f94d86519a63005a3e98e9a71cd04a1be6f87cb7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3149 zcmb7{S5VW57RLV}Bt!xdiXtVjfOL?ifYN)pfYJgR1f!5pLlFo_(Fjrmq{OfwOD`fN z2uKJ^jTECx5tSNg0)hxgZwBpbXq^ z3-8~DTIHo0XMx-Lah>XKa9VG0>RN3HZ=#ldForf*ozeHYVh*;Z;V**<)eQ^H58`_S z=?mibRfsA?23Mr$%v<0FkRi0G-ChLh1jIDvLLv>oF(6$WePQ!1^pGubfXMiC!nFz6 z%mroiu!QE|b829*qyr7QAl(zHdwRqB{~kJ2v4NTn9$rj51NPA+s_<@Ji1+Y9@M5o9j`Up%!P{Et6Z+pX|9E4&z9-W? zCrEd4Vbh*|emNP~s8stowUh3MN7pcMXmh9MDUg z{9c2&nKqu5OlU$7wBn#t!1_uZ(N%D33e@$yBh}?D#nn!GZhG{q&v_(C3r`%KfJLHzcuqdcK!_ z;i?f{1Zi2I>t*Cw_Oaj_z0KTBf)77mW2v^_UibV=O@D;uXi9W7K|4Qh6=3CwglD z66_}(-KG?%_RYqu3753-?Pl4N39e?JQ!tb1cN3i5N>a7X`C^OIhUfNw%nD&DGSmCXR=kKLwbHg*#wq|iQ-K_^uwHeZb7v&OR6RwB@)c@6CUVIiatbmdX`2Vt{)Qv@ifXkp zm(#XR@h?@J$NSz{F2lvhfK!2)HpZQVvaVaz_c$=K=u@=cB7Y`TEWU~}GN2WAY(XQ9 z%5uN%0e4Z0!Pq}SPPQ%89d(}xJvm}E?KB?&gR4h6pYBN27D%2aIym@Oa+~hr^`?%s zWS5@O`Z5O4$FhKDo0{|vJ`BHLpU*uKqi0#X(n^jjN4RK;WXQ6Qolt?OY7b+M1ao z?(B9@x=R+R`(vXwtVqo2`k0jAm9x^NVnzywQKEE+of^!w`akF*NPF8x4sWm$m;=7M zg*SQMd3r71$sN5#l?OdvB@vvQLFBMC8HDm{*5@;cWL<``C6AF%xL(7=1&aY$ylVLa zy~-u@tbFkZ9IOG0tWVi+;kHtoOn8G^lV$&2<$ABx-o`~Zt9M#b({b=JM-Zd)}#E&c#*vUss4>Kt&LjMmdC9dbb4a z?gzzD1i(p`G1lLp-)qC;!0X2Q#TFHP;;?S}_E0#WA(qutk4lXc^PKBxtI4HoqNBVyF@_#cY8PKGJWXKbK8X9D^dV6 z*7a8ubJI4vi<$Wk4Xg&v_-kj!sD5zt*~s-ci7PNrFJE+73?E-Nb4SKn^FzA0YVE9; zUVZt|ni#$He9#fNkd!_RDHVU1u1v$Pc-($6Jcsg=+gGd{JxJb8)!`qqO`ulRP(U3V zs@+{_^)ii$bosZJ684duNBlsU8Psf!b|ulFx9&g=r^KDVF#+aJQcD zPxjRD@5?VKd-Xsa5P!TtDp}>lqYK9sY}K4uP2NS{x0MaYMfmv*BGly>{5MO)#vW7` zHox`7KdSs4Mc+Cl0nT7+?_?4h4ne3DqsCj$@%Qt`_@dogKPI1lu0(UP89j@=buddq zc;~(>t)I{@yl?b+}Eb0sgvSZyqa__Bi!QL!#1;N7&mI>*Yjt*G9Q8U(rKis#=PW8)SG_oD@mN;@c9V=J}B z&Sg}G_CB*oqu_-eLBjBo$J(Z(iM5CO+6QMqMAv`1R!=kHkt^36C&-v%cbmRWUghg5 zA5o&c%6JNNNe(Y_X3{Swj!=DpiG$? zH%;cqMY)OuZRnZ?csX_?6XgI_pV_DEL}Y|AZ()6N_yzfZi+`Vto;Pf0=$O|1ttn(A zonJPn>a*&+X7Q9Jp?8UbDd{h|9dU4ugleqJ(P+p?UU8+hU}vMNvoA3}k@j3N0%m!+ zDrAn|7b>{BbwPsnbOGY6YQm&R%b^R*xoV&`w}Az!{_MQFv|fVuG~1wYs1D@&7H}ep zI5zQ@c+yv5q)3sC6LwY%VI#7@o>}pY6^D7W{jp(4xV&N4?6K2?CZVg{P1%w>ny~hg z>ZA=hxzhdB0cfM8R52r(jX$S#f8nxP)exgG?d3I^rZV{ixyd8wwN(@_>6F8-N=KBP1K8c6U3lxHpA4P6ghDtx3qV zx_YT5z)$lA=-vE^{`Im-$eroo9_a|&fo(ziL?=wxiBbo7eZz}=J@4eTU#;Q;6t_LMzl#wjmQ{TynltUvKPoV&}I|!HYSP=Sq9KA{M2si`-LpWVhaf6&yE}J$L@{g*LP$gr z{6#Tf#1G+Pq6AIU$nn|TnZ5Ijfgw*9+NwTH3u(=??%g%O&f1czHLa(nW!vXz+7{p>{juhnHVX`0hzF$@h5FIcrIi4| zpTGiv1p*5M76>d5SRk-K!C9c>!+}Mmrrs<5HEU6D${j_asHHy|HTi*<$!(OsV<}dA zlr9BBo|t&xLZP#xJLzv5Cf^db<7X9&l6e$~rSvhb-G%P5Zls5IRlCuA3{wxsOg7d? zvh!8i>8xYlyeoCiffgSu^@^|V+dP)y8zdd;^LwOxol4uLwTzgow~F)Dv4&5`@x?he`8vU4@eg8_J`;6UH&%nW zUL|=Yq;C)LV=bpi9KmQMyB7Vo0ly3LiBln2CFYP0M5k}9M;9w<@sCs-~OE2 z9N-S4Csa_@`t zWw8YD!xj{-%RH0PtUct{&{}4YZiU&b8Tx$g%6SIwn?cU^l9_~~^DX;ej2~S-RYx29 z;VI&A-yik9Jfv4je?gAr2g$ZrFPigy+DD}(zbBgJ5!h#o&?U(S`1LEPX6>Ncl3clZ zO~lkksr;aq=khqVrgxF#!#KWYQ^?1;mwb)EQcJ%9YyPP!2j8Y@BhBt^tdGP`#@UXg z!hP}1zDeR#XjBfl0^`!z&D!7MKakxeA8aMwfjK-be`DjyzAB`5eJsKHMG|^96@Q|2 z?AcM!O@6obdcSY5e`DvQKK>v4ffLm;Uw`_I7)|Rpv!$$=mk)Ex`Cet#0sga>w-DRn zouck9w~lYq;zHEdtJ4IFU7oSIG7soq=H)HKHvLY7{yV&Lh?>K%FGPL)bi((b)T95u z{4T$K1%rcsK<`TUcm|z^GchJqFt!X72`ms;Ah1ASfxrTR1p*7e0=9Tg1+2r!G;Zy5 z2iEj)VXx@|U(>x$4y@?j3GD_O@Fz{H>r~OX4SvzpwvB78Lz=cd9@jKO({@%s>AD;k zqW1QR=Ak&~HLaV6>cL;zp+%?x{p+W-2-$O?M?;&CBfn!a2R1YU?IMSsf$ls2guW*i zQqrI^N?(-BJ*`Xx0m$G9ED%`WjI{v8drQ``cBf+kh{02w{}9SS{C2*-sda$d@0HlY zI#oW!W)assWx03Ci7T>^>)^Yje8gp65;Wu^D0V3EClg})hjZj3{#9a*Y(sMfzCodV zay)V)h{qdg&Jl~c$ge-<`<5a@#HcBbqU7H)acjzbt7Cw#w_&jn-g^_oQ<@H6hM0Oa z=m|Gxdl>s{q}reAko}7*KNBOz9t``$qbL`V$@8GkQWWHl*$T|z55x**sAIdig>s3D zB!~6KdLF>IGu`~pRM?num12IGwRYN1qyL*O?O@c@zm;{7voZN{v@`KBjB_d4+mQFT zUCN7^Y&Y3Jwh5x|K6f0~rfj2ZmnOqKP^U8pnvne!)hTxhdw6qdwTQvamvspKKD^*x%CU;9SN1QdG@c3C*KYV6s_?Ysw^vql!*jkV9@plNLA zjCIh*P@NviL1Aq+L650)gsqihtCuF4b z8^xO99s%j8@&R8A9oC|J346_!G>Q+Za%8>?b9_$43mM9q%KikA=eh&?dnMKsHq#fC zC5CiT>3Qq0wUQJ6bMpH8&Lw`Ib++j)L*B8DlSuJV?AxAGs#se&1m%;}`D0zSNLo`s zvY{%U_FPlQl`=#eKgG8yI*gaJrh=3+h~jPl&eF@LYVDh9E`glD0)YjZ)&dlDX!NNE zrEWS(8Nw~2P(t?JT7*PuwKY|m*1lTPI#8)7FN$w1FIr=lBgBzxYugQOu>p_rP@Dq) zY9?Y8nK%XFEWvYZ79f8b-=F>Rt^$7lTytza9WMAH&Yc?ErN#FXcft6P#`4f~ZwTM` zdEk3Q%7CA?i~0aAKoR~Jcoq{K_;QrFbWc#UE&W-7pfAL|yCh@_pIP|(7Ow#BHq_}} z%^~<$3G$g-{&`M+KA-Mbihh<({yh17dmO)w@1=Gm8NLmE>qD_5f06t&WBt&s@JZ)T z|8e-uOgFG74bvI0frSGP4#?FS=I0h-2R*M@#UilU()CI sPQE_>Cz=x@rMRzC>ft@t!xNp;Qq$hRe-XrCjQGWf^Y#IqipwYAKat!Vpa1{> diff --git a/public/assets/favicon.svg b/public/assets/favicon.svg deleted file mode 100644 index 9da25ce1..00000000 --- a/public/assets/favicon.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - \ No newline at end of file diff --git a/public/assets/site.webmanifest b/public/assets/site.webmanifest deleted file mode 100644 index ccf313a3..00000000 --- a/public/assets/site.webmanifest +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "MyWebSite", - "short_name": "MySite", - "icons": [ - { - "src": "/web-app-manifest-192x192.png", - "sizes": "192x192", - "type": "image/png", - "purpose": "maskable" - }, - { - "src": "/web-app-manifest-512x512.png", - "sizes": "512x512", - "type": "image/png", - "purpose": "maskable" - } - ], - "theme_color": "#ffffff", - "background_color": "#ffffff", - "display": "standalone" -} \ No newline at end of file diff --git a/public/assets/web-app-manifest-192x192.png b/public/assets/web-app-manifest-192x192.png deleted file mode 100644 index 389e03d92bf000d3e79d88e7fe3501d38b8779b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6993 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 Aga7~l diff --git a/public/css/doc.css b/public/css/doc.css deleted file mode 100644 index 41ceca3b..00000000 --- a/public/css/doc.css +++ /dev/null @@ -1,190 +0,0 @@ -:root { - --color-primary: #16a34a; - --color-primary-dark: #15803d; - --color-primary-light: #dcfce7; - --color-background: #f0fdf4; - --color-text: #333333; - --color-text-light: #666666; - --color-code-bg: #f3f4f6; -} - -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: 'Inter', sans-serif; - line-height: 1.6; - color: var(--color-text); - background: var(--color-background); -} - -.container { - max-width: 1250px; - margin: 0 auto; - padding: 0 20px; -} - - -header { - background-color: var(--color-primary); - color: white; - padding: 1rem 0; - position: sticky; - top: 0; - -} - -nav { - display: flex; - justify-content: space-between; - align-items: center; -} - -.logo { - font-size: 1.5rem; - font-weight: bold; - display: flex ; - align-items: center; - justify-items: center; - -} - -.logo img { - width: 40px; - height: 40px; - margin: auto 0; - color: white; - margin-right: 0.5rem; - -} - -.logo p{ - margin: auto 0; -} - -.nav-links { - display: flex; - gap: 1rem; -} - -.nav-links a { - color: white; - text-decoration: none; - font-size: 0.9rem; -} - -main { - padding: 2rem 0; -} - -.topheader{ - display: flex; - justify-content: space-between; - -} - -h1, h2, h3 { - color: var(--color-primary-dark); - margin-bottom: 1rem; -} - -h1 { - font-size: 2.5rem; - border-bottom: 2px solid #b2f8cb; - ; - padding-bottom: 0.5rem; -} - -h2 { - font-size: 1.8rem; - margin-top: 2rem; -} - -h3 { - font-size: 1.3rem; - margin-top: 1.5rem; -} - -p { - margin-bottom: 1rem; -} - -ul, ol { - margin-bottom: 1rem; - padding-left: 2rem; -} - -code { - font-family: 'Courier New', Courier, monospace; - background-color: var(--color-code-bg); - padding: 0.2rem 0.4rem; - border-radius: 0.25rem; -} - -pre { - background-color: var(--color-code-bg); - padding: 1rem; - border-radius: 0.5rem; - overflow-x: auto; - margin-bottom: 1rem; -} - -pre code { - background-color: transparent; - padding: 0; -} - -.cta-button { - display: inline-block; - background-color: var(--color-primary); - color: white; - text-decoration: none; - padding: 0.75rem 1.5rem; - border-radius: 0.25rem; - font-weight: 500; - border: none; - font-size: 1rem; - transition: background-color 0.3s ease; -} - -.cta-button:hover { - background-color: var(--color-primary-dark); -} - -footer { - background-color: var(--color-primary-light); - color: var(--color-text); - padding: 2rem 0; - margin-top: 4rem; -} - -.footer-content { - display: flex; - justify-content: space-between; - align-items: center; -} - -.footer-links a { - color: var(--color-primary); - text-decoration: none; - margin-left: 1rem; -} - -@media (max-width: 768px) { - .nav-links { - display: none; - } - - h1 { - font-size: 2rem; - } - - .footer-content { - flex-direction: column; - gap: 1rem; - } -} - diff --git a/public/css/style.css b/public/css/style.css deleted file mode 100644 index c5602f9c..00000000 --- a/public/css/style.css +++ /dev/null @@ -1,213 +0,0 @@ -:root { - --color-primary: #16a34a; - --color-primary-dark: #15803d; - --color-primary-light: #dcfce7; - --color-background: #f0fdf4; - --color-text: #333333; - --color-text-light: #666666; -} - -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: 'Inter', sans-serif; - line-height: 1.6; - color: var(--color-text); - background: linear-gradient(to bottom, var(--color-background), #ffffff); - min-height: 100vh; -} - -.container { - max-width: 1300px; - margin: 0 auto; - padding: 0 20px; -} - -header { - background-color: var(--color-primary); - color: white; - padding: 1rem 0; -} - -nav { - display: flex; - justify-content: space-between; - align-items: center; -} - -.logo { - font-size: 1.5rem; - font-weight: bold; - display: flex !important; - align-items: center; - text-align: center; - gap: 0.5rem; - justify-items: center; -} - -.logo img { - width: 50px; - height: 50px; - color: white; - margin-left: 2rem; -} - - -.nav-links { - display: flex; - gap: 1rem; -} - -.nav-links a { - color: white; - text-decoration: none; - font-size: 0.9rem; -} - -main { - padding: 4rem 0; -} - -.hero { - text-align: center; - margin-bottom: 4rem; -} - -h1 { - font-size: 2.5rem; - color: var(--color-primary-dark); - margin-bottom: 1rem; -} - -.hero p { - font-size: 1.1rem; - color: var(--color-text-light); - max-width: 800px; - margin: 0 auto 2rem; -} - -.cta-button { - display: inline-block; - background-color: var(--color-primary); - color: white; - text-decoration: none; - padding: 0.75rem 1.5rem; - border-radius: 0.25rem; - font-weight: 500; - transition: background-color 0.3s ease; -} - -.cta-button:hover { - background-color: var(--color-primary-dark); -} - -.features { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); - gap: 2rem; - margin-top: 4rem; -} - -.feature-card { - background-color: white; - border: 1px solid var(--color-primary-light); - border-radius: 0.5rem; - padding: 1.5rem; - transition: box-shadow 0.3s ease, transform 0.3s ease; -} - -.feature-card:hover { - box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); - transform: translateY(-5px); -} - -.feature-icon { - font-size: 2rem; - color: var(--color-primary); - margin-bottom: 1rem; -} - -h2 { - font-size: 1.25rem; - color: var(--color-primary-dark); - margin-bottom: 0.5rem; -} - -.get-started { - text-align: center; - margin-top: 4rem; -} - -.get-started h2 { - font-size: 2rem; - margin-bottom: 1rem; -} - -.button-group { - display: flex; - justify-content: center; - gap: 1rem; - margin-top: 1.5rem; -} - -.secondary-button { - display: inline-block; - background-color: white; - color: var(--color-primary); - text-decoration: none; - padding: 0.75rem 1.5rem; - border-radius: 0.25rem; - font-weight: 500; - border: 1px solid var(--color-primary); - transition: background-color 0.3s ease, color 0.3s ease; -} - -.secondary-button:hover { - background-color: var(--color-primary-light); -} - -footer { - background-color: var(--color-primary-light); - color: var(--color-text); - padding: 2rem 0; - margin-top: 4rem; -} - -.footer-content { - display: flex; - justify-content: space-between; - align-items: center; -} - -.footer-links a { - color: var(--color-primary); - text-decoration: none; - margin-left: 1rem; -} - -@media (max-width: 768px) { - .nav-links { - display: none; - } - - h1 { - font-size: 2rem; - } - - .hero p { - font-size: 1rem; - } - - .features { - grid-template-columns: 1fr; - } - - .footer-content { - flex-direction: column; - gap: 1rem; - } -} diff --git a/public/documentation.html b/public/documentation.html deleted file mode 100644 index eb638cee..00000000 --- a/public/documentation.html +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - - DevPulse Documentation - Ed-tech Management Platform - - - - - - - - - - -

-
- -
-
- -
-
-
-

DevPulse Documentation

- -
- - -
-

Introduction

-

DevPulse is a platform designed to handle ratings for companies in the Ed-tech industries, with its - first paying customer being Andela. It is currently under development using modern web technologies - that prioritize speed and security. This documentation covers the backend part of the platform, - which uses Express, GraphQL, Apollo, and MongoDB.

-
- -
-

Hosted Link

-

The backend is hosted at: https://atlp-devpulse-bn.onrender.com/

-
- -
-

How to Run

-

To run this project on your local machine, ensure you have the following prerequisites:

-
    -
  • Node.js installed on your computer (MacOS, Windows, Linux)
  • -
  • Git installed on your computer
  • -
-

Use the following commands to get started with the project:

-
git clone https://github.com/atlp-rwanda/atlp-devpulse-bn.git
-cd atlp-devpulse-bn
-npm install
-npm run dev
-
- -
-

Other Scripts and Their Usages

-
    -
  • npm run build - Used to build the production-ready version of the project. This is - used during deployment.
  • -
-
- -
-

Technologies

-

To successfully navigate the codebase of the project, you will need an understanding of the following - technologies:

-
    -
  • GraphQL
  • -
  • TypeScript
  • -
  • Apollo server
  • -
  • MongoDB
  • -
-
- -
-

Frontend

-

The frontend of DevPulse is hosted at: https://atlp-devpulse-fn.vercel.app/

-

The frontend GitHub repository can be found at: https://github.com/atlp-rwanda/atlp-devpulse-fn

-
- -
-

Environment Variables

-

The following environment variables are required for the project:

-
NODE_ENV=<environment>
-MONGO_DEV_DB=<development-database-uri>
-MONGO_TEST_DB=<testing-database-uri>
-MONGO_PROD_DB=<production-database-uri>
-PORT=<server-port>
-DEVPULSE_EMAIL=<email-used-for-sending-emails-verified-with-sendgrid>
-API_KEY=<api-key-provided-from-sendgrid>
-SENDER_NAME=<Sender name of sendgrid>
-API_KEYS=<api-key-provided-from-google-sheet-api>
-FRONTEND_URL=<Frontend-url-at-which-the-frontend-app-is-running-on>
-SUPER_ADMIN_EMAIL=<super-admin-email>
-JWT_SECRET=<jwt-secret>
-ADMIN_EMAIL=<admin-email>
-
- - - -
-

Support

-

If you encounter any issues or have questions about DevPulse, please open an issue on the GitHub Issues - page.

-
- - -
-
- - - - - diff --git a/public/index.html b/public/index.html deleted file mode 100644 index b7b7e64c..00000000 --- a/public/index.html +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - DevPulse - Innovative Ed-tech Management Platform - - - - - - - - - - -
-
- -
-
- -
-
-
-

Welcome to DevPulse

-

An innovative platform for managing team performance, tracking attendance, and analyzing application - cycles in the Ed-tech industry.

- Explore GraphQL API -
- -
-
-
📊
-

Real-Time Performance Metrics

-

Gain valuable insights into individual and team progress through real-time tracking and automated - feedback systems.

-
-
-
📅
-

Advanced Attendance Management

-

Ensure consistent and efficient tracking of attendance across different cohorts and programs with - integrated data handling.

-
-
-
👥
-

Dynamic Application Cycle Overview

-

Stay informed with detailed cycle statuses and trends, simplifying the recruitment and evaluation - process.

-
-
- -
-

Get Started with DevPulse

-

Explore our comprehensive documentation to integrate DevPulse into your workflow.

- -
-
-
- - - - - diff --git a/src/index.ts b/src/index.ts old mode 100644 new mode 100755 index d32a177b..cc50b3d1 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,4 @@ -import { ApolloServer } from 'apollo-server-express'; +import { ApolloServer } from "apollo-server"; import { mergeResolvers, mergeTypeDefs } from "@graphql-tools/merge"; import { connect } from "./database/db.config"; import "./utils/cronJob"; @@ -88,8 +88,6 @@ import { jobApplicationTypeDefs } from "./schema/jobApplicationSchema"; import { jobApplicationResolver } from "./resolvers/jobApplicationResolver"; import { blogRelatedResolvers } from "./resolvers/blogRelatedArticlesResolver"; import { blogRelatedArticlesSchema } from "./schema/blogRelatedArticlesSchema"; -import express from 'express'; -import path from 'path'; const PORT = process.env.PORT || 3000; @@ -182,10 +180,6 @@ const typeDefs = mergeTypeDefs([ blogRelatedArticlesSchema ]); -connect(); -const app = express(); -app.use(express.static(path.join(__dirname, '../public'))); - const server = new ApolloServer({ typeDefs, resolvers, @@ -212,13 +206,7 @@ const server = new ApolloServer({ plugins: [ApolloServerPluginInlineTrace()], }); -(async () => { - await server.start(); - server.applyMiddleware({ app }); - - app.listen(PORT, () => { - console.log(`Server ready at http://localhost:${PORT}${server.graphqlPath}`); - console.log(`Landing page available at http://localhost:${PORT}/`); - }); -})(); - +connect().then(() => { + console.log("Database connected!"); + server.listen(PORT).then(({ url }) => console.info(`App on ${url}`)); +}); diff --git a/tsconfig.json b/tsconfig.json index 4676cddd..615c0bbc 100755 --- a/tsconfig.json +++ b/tsconfig.json @@ -11,7 +11,7 @@ // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ /* Language and Environment */ - "target": "es2017", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ // "jsx": "preserve", /* Specify what JSX code is generated. */ // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */