├── LICENSE ├── README.md ├── docs ├── New User Guide │ └── README.md ├── Postman Collection │ └── API_CALLS.json ├── analytics.md ├── apps │ └── README.md ├── conventions │ ├── README.md │ ├── api │ │ └── README.md │ ├── css │ │ └── README.md │ ├── javascript │ │ └── README.md │ ├── repos │ │ ├── README.md │ │ ├── git │ │ │ └── README.md │ │ ├── pull-requests │ │ │ └── README.md │ │ └── reviews │ │ │ └── README.md │ └── urls │ │ └── README.md ├── dev │ └── https-dev-url-cors │ │ └── README.md ├── guide-for-local-setup │ └── README.md ├── local-backend-api-contracts │ └── new-user-status.md ├── local-backend-roles │ └── README.md └── profile-service │ └── api-contracts.md └── public └── assets ├── color-palette.png └── firebase-image.jpg /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Real Dev Squad 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Real Dev Squad Coding Documentation 2 | 3 | Purpose of this repo is to help understand how we go around contributing and colloborating the code for our suite of apps. 4 | 5 | ## Our apps 6 | 7 | You can read up on how we work upon our various projects [here](/docs/apps) 8 | 9 | ## Color Palette 10 | 11 | Name | Hex Code 12 | :---------------|---------- 13 | Resolution Blue | #041484 14 | Razzmatazz | #E30464 15 | Feijoa | #96D882 16 | Fern | #6DB470 17 | 18 | ![Color Palette](public/assets/color-palette.png) 19 | 20 | Generated using [canva.com](https://www.canva.com/colors/color-palette-generator/) 21 | 22 | ## To Do 23 | - [x] Setup basic repo 24 | - [ ] Create `docs` folder with basic documentation 25 | - [ ] Ensure that the link to the repo is available in all site apps and on the app pages 26 | -------------------------------------------------------------------------------- /docs/New User Guide/README.md: -------------------------------------------------------------------------------- 1 | # Guide for New Users: Getting Assigned to Tasks 2 | 3 | Welcome! This document provides guidance for contributors on how to get assigned tasks in RDS projects. 4 | 5 | ## Step 1: Post Lift Simulation 6 | 7 | After completing the lift simulation, developers can request a task from Ankush through the designated channel. This can be done in two ways: reporting a bug or expressing the need for an assigned task. 8 | 9 | **Bug Report or Task Request:** 10 | - If you find a bug or need a task, notify Ankush in the designated channel. 11 | - Check the channels `new-tasks` or `i-am-idle` on Discord for available tasks. 12 | 13 | ## Step 2: Task Assignment Process 14 | 15 | Upon your request, Ankush will decide whether to assign you a task. If the GitHub issue for the task is already created, proceed to create a TCR (Task Creation Request). If not,first create an issue then create the TCR first and then seek approval from Ankush. Once approved, start working on the task. 16 | 17 | 1. **Create a TCR(Task creation request)** 18 | 19 | - Visit the [Status Page](https://status.realdevsquad.com/issues). 20 | - Click on the 'Issues' tab and paste the GitHub issue title, then press 'Submit'. 21 | - On the Status Page, click 'Request as Task'. 22 | - Set a reasonable time limit for task completion, the time you will need to get your code to **production**. Once again, the time you entering here will be the time in which your code is in the **production** and ready to use(not any intermediary state). 23 | - After submitting, you will be redirected to a dashboard. 24 | ![image](https://github.com/tejaskh3/uXHUB/assets/98630752/6d4069a5-1f00-44b6-a12a-b593400b0a9d) 25 | 26 | 2. **Copy Dashboard URL and Tag for Approval:** 27 | 28 | - Copy the dashboard URL. 29 | - Tag Ankush requesting approval using channels `new-tasks` or `i-am-idle` on discord. 30 | 31 | - And ask them to approve. 32 | 33 | ![image](https://github.com/tejaskh3/uXHUB/assets/98630752/029a562c-fe8d-48ec-a16a-1991e69d7e23) 34 | 3. **Work on Approved Task:** 35 | - After Ankush's approval, start working on the assigned task. 36 | 37 | 4. **Seek Clarification When Needed:** 38 | - If you face difficulties, discuss them with Ankush, Application Owner, or Feature Owner. 39 | - Ensure alignment and correctness of your work. 40 | 41 | 5. **Resolve Doubts:** 42 | - If you have doubts, feel free to ask questions in the server's respective channel. 43 | - For specific technical doubts, ping Tejas or Prakash. 44 | - For doubts related to business logic, ping Ankush. 45 | 46 | By following these steps, you are ready to contribute effectively to your assigned task. If you encounter any issues or have questions, don't hesitate to seek assistance in the appropriate channels. 47 | 48 | Happy contributing! 49 | -------------------------------------------------------------------------------- /docs/Postman Collection/API_CALLS.json: -------------------------------------------------------------------------------- 1 | { 2 | "info": { 3 | "_postman_id": "ff3a7832-1f85-4bef-92f0-b9f96623693c", 4 | "name": "RDS API CALLS", 5 | "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", 6 | "_exporter_id": "17077378" 7 | }, 8 | "item": [ 9 | { 10 | "name": "Auctions", 11 | "item": [ 12 | { 13 | "name": "FetchAvailableAuctions", 14 | "request": { 15 | "method": "GET", 16 | "header": [], 17 | "url": { 18 | "raw": "{{BASE_URL}}/auctions", 19 | "host": [ 20 | "{{BASE_URL}}" 21 | ], 22 | "path": [ 23 | "auctions" 24 | ] 25 | } 26 | }, 27 | "response": [] 28 | }, 29 | { 30 | "name": "CreateNewAuction", 31 | "request": { 32 | "method": "POST", 33 | "header": [], 34 | "body": { 35 | "mode": "raw", 36 | "raw": "{\r\n \"item_type\": \"dinero\",\r\n \"quantity\": 50,\r\n \"initial_price\": 5000,\r\n \"end_time\": 1903637296536\r\n}", 37 | "options": { 38 | "raw": { 39 | "language": "json" 40 | } 41 | } 42 | }, 43 | "url": { 44 | "raw": "{{BASE_URL}}/auctions", 45 | "host": [ 46 | "{{BASE_URL}}" 47 | ], 48 | "path": [ 49 | "auctions" 50 | ] 51 | } 52 | }, 53 | "response": [] 54 | }, 55 | { 56 | "name": "GetAutionByID", 57 | "request": { 58 | "method": "GET", 59 | "header": [], 60 | "url": { 61 | "raw": "{{BASE_URL}}/auctions/Kk8T60TrgtUEiH3A859i", 62 | "host": [ 63 | "{{BASE_URL}}" 64 | ], 65 | "path": [ 66 | "auctions", 67 | "Kk8T60TrgtUEiH3A859i" 68 | ] 69 | } 70 | }, 71 | "response": [] 72 | }, 73 | { 74 | "name": "MakeNewBid", 75 | "request": { 76 | "method": "POST", 77 | "header": [], 78 | "body": { 79 | "mode": "raw", 80 | "raw": "{\r\n \"bid\": 5500\r\n}", 81 | "options": { 82 | "raw": { 83 | "language": "json" 84 | } 85 | } 86 | }, 87 | "url": { 88 | "raw": "{{BASE_URL}}/auctions/bid/Kk8T60TrgtUEiH3A859i", 89 | "host": [ 90 | "{{BASE_URL}}" 91 | ], 92 | "path": [ 93 | "auctions", 94 | "bid", 95 | "Kk8T60TrgtUEiH3A859i" 96 | ] 97 | } 98 | }, 99 | "response": [] 100 | } 101 | ], 102 | "description": "Base path `/auctions`" 103 | }, 104 | { 105 | "name": "Arts", 106 | "item": [ 107 | { 108 | "name": "FetchArts", 109 | "request": { 110 | "method": "GET", 111 | "header": [], 112 | "url": { 113 | "raw": "{{BASE_URL}}/arts", 114 | "host": [ 115 | "{{BASE_URL}}" 116 | ], 117 | "path": [ 118 | "arts" 119 | ] 120 | } 121 | }, 122 | "response": [] 123 | }, 124 | { 125 | "name": "GetSelfArts", 126 | "request": { 127 | "method": "GET", 128 | "header": [], 129 | "url": { 130 | "raw": "{{BASE_URL}}/arts/user/self", 131 | "host": [ 132 | "{{BASE_URL}}" 133 | ], 134 | "path": [ 135 | "arts", 136 | "user", 137 | "self" 138 | ] 139 | } 140 | }, 141 | "response": [] 142 | }, 143 | { 144 | "name": "GetUserArts", 145 | "request": { 146 | "method": "GET", 147 | "header": [], 148 | "url": { 149 | "raw": "{{BASE_URL}}/arts/user/FsEfdxrDzqYBBWZajC8r", 150 | "host": [ 151 | "{{BASE_URL}}" 152 | ], 153 | "path": [ 154 | "arts", 155 | "user", 156 | "FsEfdxrDzqYBBWZajC8r" 157 | ] 158 | } 159 | }, 160 | "response": [] 161 | }, 162 | { 163 | "name": "AddArts", 164 | "request": { 165 | "method": "POST", 166 | "header": [], 167 | "body": { 168 | "mode": "raw", 169 | "raw": "{\r\n \"title\": \"Ritik's Art\",\r\n \"price\": 10,\r\n \"css\": \"Hello World\"\r\n}", 170 | "options": { 171 | "raw": { 172 | "language": "json" 173 | } 174 | } 175 | }, 176 | "url": { 177 | "raw": "{{BASE_URL}}/arts/user/add", 178 | "host": [ 179 | "{{BASE_URL}}" 180 | ], 181 | "path": [ 182 | "arts", 183 | "user", 184 | "add" 185 | ] 186 | } 187 | }, 188 | "response": [] 189 | } 190 | ], 191 | "description": "Base path `/arts`" 192 | }, 193 | { 194 | "name": "Badges", 195 | "item": [ 196 | { 197 | "name": "GetBadges", 198 | "request": { 199 | "method": "GET", 200 | "header": [], 201 | "url": { 202 | "raw": "{{BASE_URL}}/badges/", 203 | "host": [ 204 | "{{BASE_URL}}" 205 | ], 206 | "path": [ 207 | "badges", 208 | "" 209 | ] 210 | } 211 | }, 212 | "response": [] 213 | }, 214 | { 215 | "name": "CreateBadges", 216 | "request": { 217 | "method": "POST", 218 | "header": [], 219 | "body": { 220 | "mode": "formdata", 221 | "formdata": [ 222 | { 223 | "key": "file", 224 | "type": "file", 225 | "src": "/C:/Users/ritik/Downloads/androidparty.png" 226 | }, 227 | { 228 | "key": "name", 229 | "value": "\"party\"", 230 | "type": "text" 231 | }, 232 | { 233 | "key": "createdBy", 234 | "value": "\"Ritik\"", 235 | "type": "text" 236 | }, 237 | { 238 | "key": "description", 239 | "value": "\"merimarzi\"", 240 | "type": "text" 241 | } 242 | ] 243 | }, 244 | "url": { 245 | "raw": "{{BASE_URL}}/badges/", 246 | "host": [ 247 | "{{BASE_URL}}" 248 | ], 249 | "path": [ 250 | "badges", 251 | "" 252 | ] 253 | }, 254 | "description": "For badges the data sent is of the form of `form data`\n\nwe need to set up cloudinary api for this route to work" 255 | }, 256 | "response": [] 257 | }, 258 | { 259 | "name": "AssignBadges", 260 | "request": { 261 | "method": "POST", 262 | "header": [], 263 | "body": { 264 | "mode": "raw", 265 | "raw": "{\r\n \"userId\":\"FsEfdxrDzqYBBWZajC8r\",\r\n \"badgeIds\": [\"FTHPjoBSEJ7qsDLYUyYi\"]\r\n}", 266 | "options": { 267 | "raw": { 268 | "language": "json" 269 | } 270 | } 271 | }, 272 | "url": { 273 | "raw": "{{BASE_URL}}/badges/assign", 274 | "host": [ 275 | "{{BASE_URL}}" 276 | ], 277 | "path": [ 278 | "badges", 279 | "assign" 280 | ] 281 | } 282 | }, 283 | "response": [] 284 | }, 285 | { 286 | "name": "RemoveBadges", 287 | "request": { 288 | "method": "DELETE", 289 | "header": [], 290 | "body": { 291 | "mode": "raw", 292 | "raw": "{\r\n \"userId\":\"FsEfdxrDzqYBBWZajC8r\",\r\n \"badgeIds\": [\"FTHPjoBSEJ7qsDLYUyYi\"]\r\n}", 293 | "options": { 294 | "raw": { 295 | "language": "json" 296 | } 297 | } 298 | }, 299 | "url": { 300 | "raw": "{{BASE_URL}}/badges/remove", 301 | "host": [ 302 | "{{BASE_URL}}" 303 | ], 304 | "path": [ 305 | "badges", 306 | "remove" 307 | ] 308 | } 309 | }, 310 | "response": [] 311 | } 312 | ] 313 | }, 314 | { 315 | "name": "Challenges", 316 | "item": [ 317 | { 318 | "name": "FetchChallenges", 319 | "request": { 320 | "method": "GET", 321 | "header": [], 322 | "url": { 323 | "raw": "{{BASE_URL}}/challenges", 324 | "host": [ 325 | "{{BASE_URL}}" 326 | ], 327 | "path": [ 328 | "challenges" 329 | ] 330 | } 331 | }, 332 | "response": [] 333 | }, 334 | { 335 | "name": "createChallenges", 336 | "request": { 337 | "method": "POST", 338 | "header": [], 339 | "body": { 340 | "mode": "raw", 341 | "raw": "{\r\n \"level\": \"Noob\",\r\n \"title\": \"test-challenge-2\",\r\n \"start_date\": 1680625030,\r\n \"end_date\": 1680625030\r\n}", 342 | "options": { 343 | "raw": { 344 | "language": "json" 345 | } 346 | } 347 | }, 348 | "url": { 349 | "raw": "{{BASE_URL}}/challenges", 350 | "host": [ 351 | "{{BASE_URL}}" 352 | ], 353 | "path": [ 354 | "challenges" 355 | ] 356 | } 357 | }, 358 | "response": [] 359 | } 360 | ] 361 | }, 362 | { 363 | "name": "Contributions", 364 | "item": [ 365 | { 366 | "name": "GetContributions", 367 | "request": { 368 | "method": "GET", 369 | "header": [], 370 | "url": { 371 | "raw": "{{BASE_URL}}/contributions/ritik", 372 | "host": [ 373 | "{{BASE_URL}}" 374 | ], 375 | "path": [ 376 | "contributions", 377 | "ritik" 378 | ] 379 | } 380 | }, 381 | "response": [] 382 | } 383 | ] 384 | }, 385 | { 386 | "name": "HealthCheck", 387 | "item": [ 388 | { 389 | "name": "GetHealth", 390 | "request": { 391 | "method": "GET", 392 | "header": [], 393 | "url": { 394 | "raw": "{{BASE_URL}}/healthcheck/", 395 | "host": [ 396 | "{{BASE_URL}}" 397 | ], 398 | "path": [ 399 | "healthcheck", 400 | "" 401 | ] 402 | } 403 | }, 404 | "response": [] 405 | }, 406 | { 407 | "name": "HealthCheckWithAuth", 408 | "request": { 409 | "method": "GET", 410 | "header": [], 411 | "url": { 412 | "raw": "{{BASE_URL}}/healthcheck/v2", 413 | "host": [ 414 | "{{BASE_URL}}" 415 | ], 416 | "path": [ 417 | "healthcheck", 418 | "v2" 419 | ] 420 | } 421 | }, 422 | "response": [] 423 | } 424 | ] 425 | }, 426 | { 427 | "name": "Logs", 428 | "item": [ 429 | { 430 | "name": "GetLogsWithType", 431 | "request": { 432 | "method": "GET", 433 | "header": [], 434 | "url": { 435 | "raw": "{{BASE_URL}}/logs/CLOUDFLARE_CACHE_PURGED", 436 | "host": [ 437 | "{{BASE_URL}}" 438 | ], 439 | "path": [ 440 | "logs", 441 | "CLOUDFLARE_CACHE_PURGED" 442 | ] 443 | }, 444 | "description": "Requires an index creation so it might fail for the first time with `503`\n\nOnce the request fails go to the backend terminal and open the firebase link provided. This will start building the index.\n\nOnce the index creation is complete we can run the request again" 445 | }, 446 | "response": [] 447 | } 448 | ] 449 | }, 450 | { 451 | "name": "Members", 452 | "item": [ 453 | { 454 | "name": "GetAllMembers", 455 | "request": { 456 | "method": "GET", 457 | "header": [], 458 | "url": { 459 | "raw": "{{BASE_URL}}/members/", 460 | "host": [ 461 | "{{BASE_URL}}" 462 | ], 463 | "path": [ 464 | "members", 465 | "" 466 | ] 467 | } 468 | }, 469 | "response": [] 470 | }, 471 | { 472 | "name": "MoveToMembers", 473 | "request": { 474 | "method": "PATCH", 475 | "header": [], 476 | "url": { 477 | "raw": "{{BASE_URL}}/members/moveToMembers/ritik", 478 | "host": [ 479 | "{{BASE_URL}}" 480 | ], 481 | "path": [ 482 | "members", 483 | "moveToMembers", 484 | "ritik" 485 | ] 486 | } 487 | }, 488 | "response": [] 489 | }, 490 | { 491 | "name": "ArchiveMembers", 492 | "request": { 493 | "method": "PATCH", 494 | "header": [], 495 | "url": { 496 | "raw": "{{BASE_URL}}/members/archiveMembers/ritik", 497 | "host": [ 498 | "{{BASE_URL}}" 499 | ], 500 | "path": [ 501 | "members", 502 | "archiveMembers", 503 | "ritik" 504 | ] 505 | } 506 | }, 507 | "response": [] 508 | } 509 | ] 510 | }, 511 | { 512 | "name": "PullRequests", 513 | "item": [ 514 | { 515 | "name": "GetOpenPullRequests", 516 | "request": { 517 | "method": "GET", 518 | "header": [], 519 | "url": { 520 | "raw": "{{BASE_URL}}/pullrequests/open", 521 | "host": [ 522 | "{{BASE_URL}}" 523 | ], 524 | "path": [ 525 | "pullrequests", 526 | "open" 527 | ] 528 | } 529 | }, 530 | "response": [] 531 | }, 532 | { 533 | "name": "GetStalePullRequests", 534 | "request": { 535 | "method": "GET", 536 | "header": [], 537 | "url": { 538 | "raw": "{{BASE_URL}}/pullrequests/stale", 539 | "host": [ 540 | "{{BASE_URL}}" 541 | ], 542 | "path": [ 543 | "pullrequests", 544 | "stale" 545 | ] 546 | } 547 | }, 548 | "response": [] 549 | }, 550 | { 551 | "name": "GetUserPRs", 552 | "request": { 553 | "method": "GET", 554 | "header": [], 555 | "url": { 556 | "raw": "{{BASE_URL}}/pullrequests/user/ritik", 557 | "host": [ 558 | "{{BASE_URL}}" 559 | ], 560 | "path": [ 561 | "pullrequests", 562 | "user", 563 | "ritik" 564 | ] 565 | } 566 | }, 567 | "response": [] 568 | } 569 | ] 570 | }, 571 | { 572 | "name": "Stocks", 573 | "item": [ 574 | { 575 | "name": "GetStocks", 576 | "request": { 577 | "method": "GET", 578 | "header": [], 579 | "url": { 580 | "raw": "{{BASE_URL}}/stocks", 581 | "host": [ 582 | "{{BASE_URL}}" 583 | ], 584 | "path": [ 585 | "stocks" 586 | ] 587 | } 588 | }, 589 | "response": [] 590 | }, 591 | { 592 | "name": "AddNewStocks", 593 | "request": { 594 | "method": "POST", 595 | "header": [], 596 | "body": { 597 | "mode": "raw", 598 | "raw": "{\r\n \"name\":\"amazon\",\r\n \"quantity\": 50,\r\n \"price\": 500\r\n}", 599 | "options": { 600 | "raw": { 601 | "language": "json" 602 | } 603 | } 604 | }, 605 | "url": { 606 | "raw": "{{BASE_URL}}/stocks", 607 | "host": [ 608 | "{{BASE_URL}}" 609 | ], 610 | "path": [ 611 | "stocks" 612 | ] 613 | } 614 | }, 615 | "response": [] 616 | }, 617 | { 618 | "name": "GetSelfStocks", 619 | "request": { 620 | "method": "GET", 621 | "header": [], 622 | "url": { 623 | "raw": "{{BASE_URL}}/stocks/user/self", 624 | "host": [ 625 | "{{BASE_URL}}" 626 | ], 627 | "path": [ 628 | "stocks", 629 | "user", 630 | "self" 631 | ] 632 | } 633 | }, 634 | "response": [] 635 | } 636 | ] 637 | }, 638 | { 639 | "name": "Tasks", 640 | "item": [ 641 | { 642 | "name": "GetTasks", 643 | "request": { 644 | "method": "GET", 645 | "header": [], 646 | "url": { 647 | "raw": "{{BASE_URL}}/tasks", 648 | "host": [ 649 | "{{BASE_URL}}" 650 | ], 651 | "path": [ 652 | "tasks" 653 | ] 654 | } 655 | }, 656 | "response": [] 657 | }, 658 | { 659 | "name": "GetSelfTasks", 660 | "request": { 661 | "auth": { 662 | "type": "bearer", 663 | "bearer": [ 664 | { 665 | "key": "token", 666 | "value": "{{RDS_SESSION_TOKEN}}", 667 | "type": "string" 668 | } 669 | ] 670 | }, 671 | "method": "GET", 672 | "header": [], 673 | "url": { 674 | "raw": "{{BASE_URL}}/tasks/self", 675 | "host": [ 676 | "{{BASE_URL}}" 677 | ], 678 | "path": [ 679 | "tasks", 680 | "self" 681 | ] 682 | }, 683 | "description": "Requires 2 index creations so it might fail few times with `500`\n\nOnce the request fails go to the backend terminal and open the firebase link provided. This will start building the index.\n\nOnce the index creation is complete we can run the request again" 684 | }, 685 | "response": [] 686 | }, 687 | { 688 | "name": "GetOverdueTasks", 689 | "request": { 690 | "method": "GET", 691 | "header": [], 692 | "url": { 693 | "raw": "{{BASE_URL}}/tasks/overdue", 694 | "host": [ 695 | "{{BASE_URL}}" 696 | ], 697 | "path": [ 698 | "tasks", 699 | "overdue" 700 | ] 701 | } 702 | }, 703 | "response": [] 704 | }, 705 | { 706 | "name": "CreateTasks", 707 | "request": { 708 | "method": "POST", 709 | "header": [], 710 | "body": { 711 | "mode": "raw", 712 | "raw": "{\r\n \"title\":\"Test-task\",\r\n \"type\":\"testing\",\r\n \"startedOn\": 1680625030,\r\n \"endsOn\": 1680625030,\r\n \"priority\": \"LOW\",\r\n \"percentCompleted\": 0,\r\n \"category\":\"Bug\",\r\n \"level\": 1,\r\n \"status\": \"AVAILABLE\" \r\n}", 713 | "options": { 714 | "raw": { 715 | "language": "json" 716 | } 717 | } 718 | }, 719 | "url": { 720 | "raw": "{{BASE_URL}}/tasks", 721 | "host": [ 722 | "{{BASE_URL}}" 723 | ], 724 | "path": [ 725 | "tasks" 726 | ] 727 | } 728 | }, 729 | "response": [] 730 | }, 731 | { 732 | "name": "UpdateTasks", 733 | "request": { 734 | "auth": { 735 | "type": "bearer", 736 | "bearer": [ 737 | { 738 | "key": "token", 739 | "value": "{{RDS_SESSION_TOKEN}}", 740 | "type": "string" 741 | } 742 | ] 743 | }, 744 | "method": "PATCH", 745 | "header": [], 746 | "body": { 747 | "mode": "raw", 748 | "raw": "{\n \"percentCompleted\":60\n}", 749 | "options": { 750 | "raw": { 751 | "language": "json" 752 | } 753 | } 754 | }, 755 | "url": { 756 | "raw": "{{BASE_URL}}/tasks/9Gh5aNSyAHMdHSITeFOl", 757 | "host": [ 758 | "{{BASE_URL}}" 759 | ], 760 | "path": [ 761 | "tasks", 762 | "9Gh5aNSyAHMdHSITeFOl" 763 | ] 764 | } 765 | }, 766 | "response": [] 767 | }, 768 | { 769 | "name": "GetTaskDetails", 770 | "request": { 771 | "method": "GET", 772 | "header": [], 773 | "url": { 774 | "raw": "{{BASE_URL}}/tasks/9Gh5aNSyAHMdHSITeFOl/details", 775 | "host": [ 776 | "{{BASE_URL}}" 777 | ], 778 | "path": [ 779 | "tasks", 780 | "9Gh5aNSyAHMdHSITeFOl", 781 | "details" 782 | ] 783 | } 784 | }, 785 | "response": [] 786 | }, 787 | { 788 | "name": "GetUserTasks", 789 | "request": { 790 | "method": "GET", 791 | "header": [], 792 | "url": { 793 | "raw": "{{BASE_URL}}/tasks/ritik", 794 | "host": [ 795 | "{{BASE_URL}}" 796 | ], 797 | "path": [ 798 | "tasks", 799 | "ritik" 800 | ] 801 | } 802 | }, 803 | "response": [] 804 | }, 805 | { 806 | "name": "SelfAssignTask", 807 | "request": { 808 | "method": "PATCH", 809 | "header": [], 810 | "url": { 811 | "raw": "{{BASE_URL}}/tasks/assign/self", 812 | "host": [ 813 | "{{BASE_URL}}" 814 | ], 815 | "path": [ 816 | "tasks", 817 | "assign", 818 | "self" 819 | ] 820 | } 821 | }, 822 | "response": [] 823 | } 824 | ] 825 | }, 826 | { 827 | "name": "Trades", 828 | "item": [] 829 | }, 830 | { 831 | "name": "UserStatus", 832 | "item": [ 833 | { 834 | "name": "GetAlUserStatus", 835 | "request": { 836 | "method": "GET", 837 | "header": [], 838 | "url": { 839 | "raw": "{{BASE_URL}}/users/status/", 840 | "host": [ 841 | "{{BASE_URL}}" 842 | ], 843 | "path": [ 844 | "users", 845 | "status", 846 | "" 847 | ] 848 | } 849 | }, 850 | "response": [] 851 | }, 852 | { 853 | "name": "GetSelfStatus", 854 | "request": { 855 | "method": "GET", 856 | "header": [], 857 | "url": { 858 | "raw": "{{BASE_URL}}/users/status/self", 859 | "host": [ 860 | "{{BASE_URL}}" 861 | ], 862 | "path": [ 863 | "users", 864 | "status", 865 | "self" 866 | ] 867 | } 868 | }, 869 | "response": [] 870 | }, 871 | { 872 | "name": "GetUserStatus", 873 | "request": { 874 | "method": "GET", 875 | "header": [], 876 | "url": { 877 | "raw": "{{BASE_URL}}/users/status/FsEfdxrDzqYBBWZajC8r", 878 | "host": [ 879 | "{{BASE_URL}}" 880 | ], 881 | "path": [ 882 | "users", 883 | "status", 884 | "FsEfdxrDzqYBBWZajC8r" 885 | ] 886 | } 887 | }, 888 | "response": [] 889 | }, 890 | { 891 | "name": "UpdateAllUserStatus", 892 | "request": { 893 | "method": "PATCH", 894 | "header": [], 895 | "url": { 896 | "raw": "{{BASE_URL}}/users/status/update", 897 | "host": [ 898 | "{{BASE_URL}}" 899 | ], 900 | "path": [ 901 | "users", 902 | "status", 903 | "update" 904 | ] 905 | }, 906 | "description": "This is used to update all user status soo that their future status can be reflected \n\nif they mark ooo for future date. this api when called will check if today is that furure date and it will mark them ooo" 907 | }, 908 | "response": [] 909 | }, 910 | { 911 | "name": "UpdateUserStatus", 912 | "request": { 913 | "method": "PATCH", 914 | "header": [], 915 | "body": { 916 | "mode": "raw", 917 | "raw": "{\r\n \"currentStatus\":{\r\n \"state\": \"IDLE\",\r\n \"updatedAt\": 123,\r\n \"from\":1680652163,\r\n \"message\": \"Learn Go Lang\",\r\n \"monthlyHours\": {\r\n \"commited\": 10,\r\n \"updatedAt\": 1680652163\r\n }\r\n }\r\n}", 918 | "options": { 919 | "raw": { 920 | "language": "json" 921 | } 922 | } 923 | }, 924 | "url": { 925 | "raw": "{{BASE_URL}}/users/status/FsEfdxrDzqYBBWZajC8r", 926 | "host": [ 927 | "{{BASE_URL}}" 928 | ], 929 | "path": [ 930 | "users", 931 | "status", 932 | "FsEfdxrDzqYBBWZajC8r" 933 | ] 934 | } 935 | }, 936 | "response": [] 937 | }, 938 | { 939 | "name": "batchUpdateCurrentStatus", 940 | "request": { 941 | "auth": { 942 | "type": "bearer", 943 | "bearer": [ 944 | { 945 | "key": "token", 946 | "value": "{{RDS_SESSION_TOKEN}}", 947 | "type": "string" 948 | } 949 | ] 950 | }, 951 | "method": "PATCH", 952 | "header": [], 953 | "body": { 954 | "mode": "raw", 955 | "raw": "{\n \"users\": [\n {\n \"userId\": \"3kcyMhE0PyEjLrxKjLcu\",\n \"state\": \"ACTIVE\"\n },\n {\n \"userId\": \"DuMfyoqqtb8sVDAOerO3\",\n \"state\": \"ACTIVE\"\n },\n {\n \"userId\": \"JMLpZNlf5nffjLbqQNC7\",\n \"state\": \"ACTIVE\"\n },\n {\n \"userId\": \"txZFJLV40DcjsUtE0iGT\",\n \"state\": \"IDLE\"\n }\n ]\n}", 956 | "options": { 957 | "raw": { 958 | "language": "json" 959 | } 960 | } 961 | }, 962 | "url": { 963 | "raw": "{{BASE_URL}}/users/status/batch", 964 | "host": [ 965 | "{{BASE_URL}}" 966 | ], 967 | "path": [ 968 | "users", 969 | "status", 970 | "batch" 971 | ] 972 | } 973 | }, 974 | "response": [] 975 | } 976 | ] 977 | }, 978 | { 979 | "name": "Users", 980 | "item": [ 981 | { 982 | "name": "GetUsers", 983 | "request": { 984 | "auth": { 985 | "type": "bearer", 986 | "bearer": [ 987 | { 988 | "key": "token", 989 | "value": "{{RDS_SESSION_TOKEN}}", 990 | "type": "string" 991 | } 992 | ] 993 | }, 994 | "method": "GET", 995 | "header": [], 996 | "url": { 997 | "raw": "{{BASE_URL}}/users", 998 | "host": [ 999 | "{{BASE_URL}}" 1000 | ], 1001 | "path": [ 1002 | "users" 1003 | ] 1004 | } 1005 | }, 1006 | "response": [] 1007 | }, 1008 | { 1009 | "name": "update-in-discord", 1010 | "request": { 1011 | "auth": { 1012 | "type": "bearer", 1013 | "bearer": [ 1014 | { 1015 | "key": "token", 1016 | "value": "{{RDS_SESSION_TOKEN}}", 1017 | "type": "string" 1018 | } 1019 | ] 1020 | }, 1021 | "method": "POST", 1022 | "header": [], 1023 | "url": { 1024 | "raw": "{{BASE_URL}}/users/update-in-discord", 1025 | "host": [ 1026 | "{{BASE_URL}}" 1027 | ], 1028 | "path": [ 1029 | "users", 1030 | "update-in-discord" 1031 | ] 1032 | } 1033 | }, 1034 | "response": [] 1035 | }, 1036 | { 1037 | "name": "update self details", 1038 | "request": { 1039 | "auth": { 1040 | "type": "bearer", 1041 | "bearer": [ 1042 | { 1043 | "key": "token", 1044 | "value": "{{RDS_SESSION_TOKEN}}", 1045 | "type": "string" 1046 | } 1047 | ] 1048 | }, 1049 | "method": "PATCH", 1050 | "header": [], 1051 | "body": { 1052 | "mode": "raw", 1053 | "raw": "{\n \"first_name\":\"Ritik\"\n}", 1054 | "options": { 1055 | "raw": { 1056 | "language": "json" 1057 | } 1058 | } 1059 | }, 1060 | "url": { 1061 | "raw": "{{BASE_URL}}/users?profile=true", 1062 | "host": [ 1063 | "{{BASE_URL}}" 1064 | ], 1065 | "path": [ 1066 | "users", 1067 | "self" 1068 | ] 1069 | } 1070 | }, 1071 | "response": [] 1072 | }, 1073 | { 1074 | "name": "Remove ncknamesynced", 1075 | "request": { 1076 | "auth": { 1077 | "type": "bearer", 1078 | "bearer": [ 1079 | { 1080 | "key": "token", 1081 | "value": "{{RDS_SESSION_TOKEN}}", 1082 | "type": "string" 1083 | } 1084 | ] 1085 | }, 1086 | "method": "PATCH", 1087 | "header": [], 1088 | "body": { 1089 | "mode": "raw", 1090 | "raw": "{\n \"first_name\":\"Ritik\"\n}", 1091 | "options": { 1092 | "raw": { 1093 | "language": "json" 1094 | } 1095 | } 1096 | }, 1097 | "url": { 1098 | "raw": "{{BASE_URL}}/users//nickname-synced-field", 1099 | "host": [ 1100 | "{{BASE_URL}}" 1101 | ], 1102 | "path": [ 1103 | "users", 1104 | "", 1105 | "nickname-synced-field" 1106 | ] 1107 | } 1108 | }, 1109 | "response": [] 1110 | }, 1111 | { 1112 | "name": "get self user", 1113 | "request": { 1114 | "auth": { 1115 | "type": "bearer", 1116 | "bearer": [ 1117 | { 1118 | "key": "token", 1119 | "value": "{{RDS_SESSION_TOKEN}}", 1120 | "type": "string" 1121 | } 1122 | ] 1123 | }, 1124 | "method": "GET", 1125 | "header": [], 1126 | "url": { 1127 | "raw": "{{BASE_URL}}/users?profile=true", 1128 | "host": [ 1129 | "{{BASE_URL}}" 1130 | ], 1131 | "path": [ 1132 | "users", 1133 | "self" 1134 | ] 1135 | } 1136 | }, 1137 | "response": [] 1138 | }, 1139 | { 1140 | "name": "add unverified role in discord server", 1141 | "request": { 1142 | "auth": { 1143 | "type": "bearer", 1144 | "bearer": [ 1145 | { 1146 | "key": "token", 1147 | "value": "{{RDS_SESSION_TOKEN}}", 1148 | "type": "string" 1149 | } 1150 | ] 1151 | }, 1152 | "method": "POST", 1153 | "header": [], 1154 | "url": { 1155 | "raw": "{{BASE_URL}}/users", 1156 | "host": [ 1157 | "{{BASE_URL}}" 1158 | ], 1159 | "path": [ 1160 | "users" 1161 | ] 1162 | } 1163 | }, 1164 | "response": [] 1165 | } 1166 | ] 1167 | }, 1168 | { 1169 | "name": "ProfileDiffs", 1170 | "item": [] 1171 | }, 1172 | { 1173 | "name": "Wallet", 1174 | "item": [ 1175 | { 1176 | "name": "GetOwnWallet", 1177 | "request": { 1178 | "method": "GET", 1179 | "header": [], 1180 | "url": { 1181 | "raw": "{{BASE_URL}}/wallet", 1182 | "host": [ 1183 | "{{BASE_URL}}" 1184 | ], 1185 | "path": [ 1186 | "wallet" 1187 | ] 1188 | } 1189 | }, 1190 | "response": [] 1191 | } 1192 | ] 1193 | }, 1194 | { 1195 | "name": "ExtensionRequests", 1196 | "item": [] 1197 | }, 1198 | { 1199 | "name": "Tags", 1200 | "item": [] 1201 | }, 1202 | { 1203 | "name": "Levels", 1204 | "item": [] 1205 | }, 1206 | { 1207 | "name": "Items", 1208 | "item": [] 1209 | }, 1210 | { 1211 | "name": "Cache", 1212 | "item": [] 1213 | }, 1214 | { 1215 | "name": "ExternalAccounts", 1216 | "item": [ 1217 | { 1218 | "name": "CreateEterealAccount", 1219 | "request": { 1220 | "method": "POST", 1221 | "header": [], 1222 | "body": { 1223 | "mode": "raw", 1224 | "raw": "{\n \"type\": \"discord\",\n \"token\": \"123456\",\n \"attributes\":{\n \"discordId\": \"123456\",\n \"userAvatar\": \"https://res.cloudinary.com/realdevsquad/image/upload/v1683229374/profile/CvUmCEm6vB9pczLBli0O/jl5w7zkhsdujztv37voo.jpg\",\n \"userName\":\"Ritikj1\",\n \"discriminator\":\"1125\"\n } \n}", 1225 | "options": { 1226 | "raw": { 1227 | "language": "json" 1228 | } 1229 | } 1230 | }, 1231 | "url": { 1232 | "raw": "{{BASE_URL}}/external-accounts", 1233 | "host": [ 1234 | "{{BASE_URL}}" 1235 | ], 1236 | "path": [ 1237 | "external-accounts" 1238 | ] 1239 | } 1240 | }, 1241 | "response": [] 1242 | }, 1243 | { 1244 | "name": "Sync discord users", 1245 | "request": { 1246 | "auth": { 1247 | "type": "bearer", 1248 | "bearer": [ 1249 | { 1250 | "key": "token", 1251 | "value": "{{RDS_SESSION_TOKEN}}", 1252 | "type": "string" 1253 | } 1254 | ] 1255 | }, 1256 | "method": "PATCH", 1257 | "header": [], 1258 | "url": { 1259 | "raw": "{{BASE_URL}}/external-accounts/discord-sync", 1260 | "host": [ 1261 | "{{BASE_URL}}" 1262 | ], 1263 | "path": [ 1264 | "external-accounts", 1265 | "discord-sync" 1266 | ] 1267 | } 1268 | }, 1269 | "response": [] 1270 | } 1271 | ] 1272 | }, 1273 | { 1274 | "name": "Progresses", 1275 | "item": [ 1276 | { 1277 | "name": "Get Progress", 1278 | "request": { 1279 | "method": "GET", 1280 | "header": [], 1281 | "url": { 1282 | "raw": "{{BASE_URL}}/progresses?taskId=OxYqJgf6Tyl90uci1mzs", 1283 | "host": [ 1284 | "{{BASE_URL}}" 1285 | ], 1286 | "path": [ 1287 | "progresses" 1288 | ], 1289 | "query": [ 1290 | { 1291 | "key": "type", 1292 | "value": "task", 1293 | "disabled": true 1294 | }, 1295 | { 1296 | "key": "taskId", 1297 | "value": "OxYqJgf6Tyl90uci1mzs" 1298 | } 1299 | ] 1300 | } 1301 | }, 1302 | "response": [] 1303 | }, 1304 | { 1305 | "name": "save standup", 1306 | "request": { 1307 | "auth": { 1308 | "type": "bearer", 1309 | "bearer": [ 1310 | { 1311 | "key": "token", 1312 | "value": "{{RDS_SESSION_TOKEN}}", 1313 | "type": "string" 1314 | } 1315 | ] 1316 | }, 1317 | "method": "POST", 1318 | "header": [], 1319 | "body": { 1320 | "mode": "raw", 1321 | "raw": "{\n \"type\": \"user\",\n \"completed\": \"Testing standup\",\n \"planned\": \"Planning test\",\n \"blockers\": \"None\"\n}", 1322 | "options": { 1323 | "raw": { 1324 | "language": "json" 1325 | } 1326 | } 1327 | }, 1328 | "url": { 1329 | "raw": "{{BASE_URL}}/progresses", 1330 | "host": [ 1331 | "{{BASE_URL}}" 1332 | ], 1333 | "path": [ 1334 | "progresses" 1335 | ] 1336 | } 1337 | }, 1338 | "response": [] 1339 | } 1340 | ] 1341 | }, 1342 | { 1343 | "name": "discord-actions", 1344 | "item": [ 1345 | { 1346 | "name": "change nickname", 1347 | "request": { 1348 | "auth": { 1349 | "type": "bearer", 1350 | "bearer": [ 1351 | { 1352 | "key": "token", 1353 | "value": "{{RDS_SESSION_TOKEN}}", 1354 | "type": "string" 1355 | } 1356 | ] 1357 | }, 1358 | "method": "POST", 1359 | "header": [], 1360 | "url": { 1361 | "raw": "{{BASE_URL}}/discord-actions/nickname", 1362 | "host": [ 1363 | "{{BASE_URL}}" 1364 | ], 1365 | "path": [ 1366 | "discord-actions", 1367 | "nickname" 1368 | ] 1369 | } 1370 | }, 1371 | "response": [] 1372 | }, 1373 | { 1374 | "name": "create group", 1375 | "request": { 1376 | "auth": { 1377 | "type": "bearer", 1378 | "bearer": [ 1379 | { 1380 | "key": "token", 1381 | "value": "{{RDS_SESSION_TOKEN}}", 1382 | "type": "string" 1383 | } 1384 | ] 1385 | }, 1386 | "method": "POST", 1387 | "header": [], 1388 | "body": { 1389 | "mode": "raw", 1390 | "raw": "{\n \"rolename\": \"test\"\n}", 1391 | "options": { 1392 | "raw": { 1393 | "language": "json" 1394 | } 1395 | } 1396 | }, 1397 | "url": { 1398 | "raw": "{{BASE_URL}}/discord-actions/groups", 1399 | "host": [ 1400 | "{{BASE_URL}}" 1401 | ], 1402 | "path": [ 1403 | "discord-actions", 1404 | "groups" 1405 | ] 1406 | } 1407 | }, 1408 | "response": [] 1409 | }, 1410 | { 1411 | "name": "Get Groups", 1412 | "request": { 1413 | "auth": { 1414 | "type": "bearer", 1415 | "bearer": [ 1416 | { 1417 | "key": "token", 1418 | "value": "{{RDS_SESSION_TOKEN}}", 1419 | "type": "string" 1420 | } 1421 | ] 1422 | }, 1423 | "method": "GET", 1424 | "header": [], 1425 | "url": { 1426 | "raw": "{{BASE_URL}}/discord-actions/groups", 1427 | "host": [ 1428 | "{{BASE_URL}}" 1429 | ], 1430 | "path": [ 1431 | "discord-actions", 1432 | "groups" 1433 | ] 1434 | } 1435 | }, 1436 | "response": [] 1437 | } 1438 | ] 1439 | }, 1440 | { 1441 | "name": "staging", 1442 | "item": [ 1443 | { 1444 | "name": "updateRoles", 1445 | "request": { 1446 | "auth": { 1447 | "type": "bearer", 1448 | "bearer": [ 1449 | { 1450 | "key": "token", 1451 | "value": "{{RDS_SESSION_TOKEN}}", 1452 | "type": "string" 1453 | } 1454 | ] 1455 | }, 1456 | "method": "PATCH", 1457 | "header": [], 1458 | "body": { 1459 | "mode": "raw", 1460 | "raw": "{\n \"super_user\": false,\n \"member\": true,\n \"archived\": false\n}", 1461 | "options": { 1462 | "raw": { 1463 | "language": "json" 1464 | } 1465 | } 1466 | }, 1467 | "url": { 1468 | "raw": "{{BASE_URL}}/staging/user", 1469 | "host": [ 1470 | "{{BASE_URL}}" 1471 | ], 1472 | "path": [ 1473 | "staging", 1474 | "user" 1475 | ] 1476 | } 1477 | }, 1478 | "response": [] 1479 | }, 1480 | { 1481 | "name": "removePrivilages", 1482 | "request": { 1483 | "method": "POST", 1484 | "header": [], 1485 | "body": { 1486 | "mode": "raw", 1487 | "raw": "{\n \"action\": \"revoke\" \n}", 1488 | "options": { 1489 | "raw": { 1490 | "language": "json" 1491 | } 1492 | } 1493 | }, 1494 | "url": { 1495 | "raw": "{{BASE_URL}}/staging/users/privileges", 1496 | "host": [ 1497 | "{{BASE_URL}}" 1498 | ], 1499 | "path": [ 1500 | "staging", 1501 | "users", 1502 | "privileges" 1503 | ] 1504 | } 1505 | }, 1506 | "response": [] 1507 | } 1508 | ] 1509 | }, 1510 | { 1511 | "name": "issues", 1512 | "item": [ 1513 | { 1514 | "name": "Get Issues", 1515 | "request": { 1516 | "method": "GET", 1517 | "header": [], 1518 | "url": { 1519 | "raw": "{{BASE_URL}}/issues?q=add", 1520 | "host": [ 1521 | "{{BASE_URL}}" 1522 | ], 1523 | "path": [ 1524 | "issues" 1525 | ], 1526 | "query": [ 1527 | { 1528 | "key": "q", 1529 | "value": "add" 1530 | } 1531 | ] 1532 | } 1533 | }, 1534 | "response": [] 1535 | } 1536 | ] 1537 | } 1538 | ] 1539 | } -------------------------------------------------------------------------------- /docs/analytics.md: -------------------------------------------------------------------------------- 1 | # Analytics 2 | 3 | Tool we'll be using: [Mixpanel](https://mixpanel.com/) 4 | 5 | ## Things we'll be tracking: 6 | - Event name (example, user is on signup page) 7 | - Additional data related to that particular event name (example: which step of signup is the user on) 8 | - User related data (example: looking for job/not, student/not, gender) 9 | 10 | ## Things we'll NOT be tracking: 11 | - PII (Personal Identifiable Information) like first/last name, username, etc 12 | 13 | ## How will we track events for a user ? 14 | - We'll hash the user's `userId` (not `username`) and then track the user through that hash 15 | -------------------------------------------------------------------------------- /docs/apps/README.md: -------------------------------------------------------------------------------- 1 | # Apps 2 | 3 | Real Dev Squad has a suite of apps that are actively worked on. We learn and use a lot of technologies: 4 | - Basic HTML, CSS, JS 5 | - React / Next.js 6 | - Ember 7 | - Angular 8 | - Node 9 | - Go 10 | 11 | ## Naming Conventions 12 | 13 | Each repo on [our Github organization](https://github.com/Real-Dev-Squad) looks like `website-` 14 | 15 | Currently, we have the following apps: 16 | 17 | | Name | Repo | Staging | Prod | Note | 18 | | -----------|------------|----------|------------|------------| 19 | | Skill Tree | [Fronted](https://github.com/Real-Dev-Squad/skill-tree-frontend), [Backend](https://github.com/Real-Dev-Squad/skill-tree-backend) | TBD | Yet to be live | Tech Stack -> Typescript, Javascript | 20 | | Mobile App | [Repo](https://github.com/Real-Dev-Squad/mobile-app) | TBD | Yet to be live | React Native | 21 | | tiny-site | [Repo](https://github.com/Real-Dev-Squad/tiny-site-backend) | TBD | Yet to be live | Go | 22 | | my-site | [Repo](https://github.com/Real-Dev-Squad/website-my) | [Link](https://staging-my.realdevsquad.com/) | [Link](https://my.realdevsquad.com/) | Ember JS | 23 | | main-site| [Repo](https://github.com/Real-Dev-Squad/website-www) | [Link](https://staging-www.realdevsquad.com/) | [Link](https://realdevsquad.com/) | [Beta Main Site](https://beta.realdevsquad.com/), HTML, CSS, JS | 24 | | welcome-site| [Repo](https://github.com/Real-Dev-Squad/website-welcome) | TBD | [Link](https://welcome.realdevsquad.com/) | HTML, CSS, JS | 25 | | goal-site| [Repo](https://github.com/Real-Dev-Squad/website-goals) | TBD | [Link](https://goals.realdevsquad.com/) | Tech Stack-> Vue, Typescript, JS, Next.js | 26 | | learn-site| [Repo](https://github.com/Real-Dev-Squad/website-learn) | TBD | Yet to be live | Tech Stack-> Vue, Typescript, JS | 27 | |Discord Slash Command| [Repo](https://github.com/Real-Dev-Squad/discord-slash-commands) | NA | Live | Tech Stack->Typescript, JS | 28 | | dashboard site| [Repo](https://github.com/Real-Dev-Squad/website-dashboard) | TBD | [Link](https://dashboard.realdevsquad.com/) | Tech Stack-> HTML CSS JS | 29 | | Calendar-site | [Fronted](https://github.com/Real-Dev-Squad/website-calendar/), [Backend](https://github.com/Real-Dev-Squad/calendar-API/) | [Link](https://staging-calendar.realdevsquad.com/) | Not live yet | Tech stack -> Remix, Tailwind, TypeScript, NodeJS, MySql | 30 | | member-site | [Repo](https://github.com/Real-Dev-Squad/website-members) | TBD | [Link](https://members.realdevsquad.com/) | Tech Stack-> JS, CSS | 31 | | Feature flag | [Repo](https://github.com/Real-Dev-Squad/feature-flag-backend) | TBD | Live | Go | 32 | -------------------------------------------------------------------------------- /docs/conventions/README.md: -------------------------------------------------------------------------------- 1 | # Conventions 2 | 3 | To Do 4 | 5 | ## Why follow convetions? 6 | 7 | To Do -------------------------------------------------------------------------------- /docs/conventions/api/README.md: -------------------------------------------------------------------------------- 1 | ## RDS Query language(RQL) for Filtering, Sorting, and Pagination: 2 | 3 | We will be using a query string with a custom format for filtering and sorting, which closely following Github's search formats. You can read more about it [here](https://docs.github.com/en/search-github). 4 | 5 | #### Filtering: 6 | - Single search value: `?q=key:value` 7 | - Multiple search values: `?q=key:value1+key:value2` 8 | - Multiple key-value pairs: `?q=key1:value1+key1:value2+key2:value1+key2:value2` 9 | - Exclude a given value: `?q=-key:value` 10 | 11 | #### Sorting: 12 | - Ascending order: `?q=sort:key-asc` 13 | - Descending order: `?q=sort:key-desc` 14 | 15 | #### Pagination: 16 | - `size`: Number of items per page. 17 | - `page`: Navigate to a specific page. 18 | - `next`: Retrieve the next page. 19 | - `prev`: Retrieve the previous page. 20 | 21 | #### Combined Example: 22 | - Filtering, sorting, and pagination together: 23 | - `?q=key:value1+key2:value2+-key3:value3+sort:key4-asc&page=2&size=20` 24 | - This example filters by key1 and key2, excludes key3, sorts by key4 in ascending order, and displays the results on the second page with 20 items per page. 25 | -------------------------------------------------------------------------------- /docs/conventions/css/README.md: -------------------------------------------------------------------------------- 1 | # CSS 2 | 3 | We will follow [BEM](http://getbem.com/) 4 | -------------------------------------------------------------------------------- /docs/conventions/javascript/README.md: -------------------------------------------------------------------------------- 1 | # JavaScript 2 | 3 | [Airbnb Javascript Styleguide](https://github.com/airbnb/javascript) 4 | -------------------------------------------------------------------------------- /docs/conventions/repos/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Real-Dev-Squad/docs/0681b268b5ff4059c73356dc4c995f7ec92c8995/docs/conventions/repos/README.md -------------------------------------------------------------------------------- /docs/conventions/repos/git/README.md: -------------------------------------------------------------------------------- 1 | # Git 2 | 3 | - Branches should follow Git [flow](https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow) 4 | - Branch names should contain 5 | - Every commit should contain 6 | 7 | ## Gitflow 8 | 9 | - main 10 | - feature/ 11 | - bugfix/ 12 | 13 | ## Why? 14 | 15 | To do 16 | -------------------------------------------------------------------------------- /docs/conventions/repos/pull-requests/README.md: -------------------------------------------------------------------------------- 1 | # PR 2 | 3 | - PR should come from a forked repo on your account 4 | - Branch name should be meaningful 5 | - Code should solve specific problems (don't do too much in one PR) 6 | - Don't change unnecessary files 7 | 8 | ## Why? 9 | 10 | To do 11 | -------------------------------------------------------------------------------- /docs/conventions/repos/reviews/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Real-Dev-Squad/docs/0681b268b5ff4059c73356dc4c995f7ec92c8995/docs/conventions/repos/reviews/README.md -------------------------------------------------------------------------------- /docs/conventions/urls/README.md: -------------------------------------------------------------------------------- 1 | # URLs 2 | 3 | ## Conventions 4 | 5 | - Should contain `-`(hyphens) instead of `_`(underscores) 6 | - Lowercase letters only 7 | -------------------------------------------------------------------------------- /docs/dev/https-dev-url-cors/README.md: -------------------------------------------------------------------------------- 1 | # Security 2 | 3 | The same-origin policy is a critical security mechanism that restricts how a document or script loaded from one origin can interact with a resource from another origin. It helps isolate potentially malicious documents, reducing possible attack vectors. 4 | 5 | > Check out this [MDN link](https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy) to understand what constitutes as Same Origin 6 | 7 | We only allow `*.realdevsquad.com` to access our backend APIs via [Access-Control-Allow-Origin](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin) 8 | 9 | When calling our APIs, our cookies are ensured to be restricted for access (Read why [here](https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies#restrict_access_to_cookies)) 10 | - HttpOnly 11 | - Secure 12 | 13 | ## Expected problem 14 | 15 | During most frontend development, when you run a local dev server, it will run on `http://localhost:`, e.g `http://localhost:3000` 16 | 17 | This `localhost` server, you will **NOT** be able to use our backend APIs directly from the browser, because the cookies will not be sent by the browser according to the origins not matching because: 18 | 19 | - **http** : Cookie is meant to be for secure `https` 20 | - **localhost** : Domain doesn't match `*.realdevsquad.com` 21 | - **port** : Should be default `443` for https (or 80 for http) 22 | 23 | ## Solution 24 | 25 | If we want to make calls to our APIs beloging to *.realdevsquad.com, then we need to be originating those requests from the same origin. 26 | 27 | We also need to run our local development server on a url that is serving over **https** so that our prod/staging _secure_ cookies can be sent in our requests originating form the browser, automatically as expected. 28 | 29 | We basically need this kind of traffic redirection: 30 | > https://dev.realdevsquad.com -> http://localhost:`` 31 | 32 | ### 1. 🔗 DNS 33 | 34 | We need to resolve `dev.realdevsquad.com` to `localhost`. 35 | 36 | We do that by adding the entry `127.0.0.1 dev.realdevsquad.com` to our `/etc/hosts` file on our local computer. 37 | 38 | Now, if you go to `dev.realdevsquad.com` on your browser, the OS will automatically resolve it to `localhost`. 39 | If you go to `dev.realdevsquad.com:3000`, it will point to `localhost:3000` and show you your running app. (if you have a dev server running on port 3000) 40 | 41 | (Read more [here](https://www.howtogeek.com/howto/27350/beginner-geek-how-to-edit-your-hosts-file/) and [here](https://tldp.org/LDP/solrhe/Securing-Optimizing-Linux-RH-Edition-v1.3/chap9sec95.html)) 42 | 43 | ### 2. 🔐 HTTPS 44 | 45 | We have to ensure that we can now visit `https://dev.realdevsquad.com` (which by default is port 443). 46 | 47 | Opening this now will show you a problem of your TLS/SSL certificate. This is a security feature of the browser to ensure that your site is legit. 48 | 49 | We need to setup a **reverse proxy**(highly encourage you to read about it [here](https://www.cloudflare.com/learning/cdn/glossary/reverse-proxy/)), that runs directs our traffic to port 443 to our dev server 50 | 51 | A possible solution is installing [local-ssl-proxy](https://www.npmjs.com/package/local-ssl-proxy). 52 | This is a simple solution of running a simple SSL HTTP proxy using a self-signed certificate.(Intended for local development only) 53 | 54 | Run `local-ssl-proxy --source 443 --target --hostname dev.realdevsquad.com` 55 | 56 | Now if you visit https://dev.realdevsquad.com on your browser, expect to get a warning because the certificate is self-signed. But since we set this up on purpose, it's safe to ignore during development. 57 | 58 | Extra: For a more powerful proxy solution, try out [mitmproxy](https://mitmproxy.org/) 59 | 60 | ## Final 61 | 62 | 🎉 Once you get your development app to run on `https://dev.realdevsquad.com`, you will be able to access the backend APIs without any CORS issues. Happy development! 63 | 64 | 65 | If you want to have a single command that runs the dev server over https, check out [this package.json](https://github.com/Real-Dev-Squad/website-crypto/pull/203/) 66 | -------------------------------------------------------------------------------- /docs/guide-for-local-setup/README.md: -------------------------------------------------------------------------------- 1 | # This is a document that describes how to run the RDS app locally with a local backend 2 | 3 | ## 1. Setup the Backend 4 | 5 | - Go to the RDS Backend setup guide [here](https://github.com/Real-Dev-Squad/website-backend/#readme) 6 | - Add the `cors` config in `config/local.js` file: 7 | 8 | ```javascript 9 | cors: { 10 | allowedOrigins: /(http:\/\/localhost:[0-9]{4}$)/, 11 | }, 12 | ``` 13 | 14 | ## 2. Setup the Frontend - 15 | 16 | - Go to the README of the respective frontend repo. 17 | - Change all the API endpoints to `http://:/` 18 | - RDS API endpoint: `https://api.realdevsquad.com/` 19 | - Default API endpoint[local]: `http://localhost:3000/` 20 | - Change all the URL with respective frontend URL 21 | - Like you want to run WWW and My site then you have to set `http://localhost:5500` for WWW(main Site) then change all the URL from `https://www.realdevsquad.com` to `http://localhost:5500` in both the repo and if you set `http://localhost:3443` for My site then you have to change all the URL from `https://my.realdevsquad.com` to `http://localhost:3443` in both the repo and so on. 22 | 23 | ## 3. To skip the signup process 24 | 25 | - After authenticated, add some data to the database 26 | - `username` - `` of the user 27 | - `first_name` - `your first name` of the user 28 | - Also change the `incompleteUserDetails` to `false` in the database 29 | 30 | ## 4. Add roles to the user like Super User, Admin, Member 31 | 32 | Some of the features are only available to users with specific roles. For adding roles to the user, you can add the roles to the `roles` map in the database. 33 | 34 | - For Super User, add `super_user` with the boolean value `true` in the `roles` map. 35 | - For Admin, add `admin` with the boolean value `true` in the `roles` map. 36 | - For Member, add `member` with the boolean value `true` in the `roles` map. 37 | 38 | **Note:** For register your app for OAuth, go to URL `http:///auth/github/callback` and authorize the app. 39 | -------------------------------------------------------------------------------- /docs/local-backend-api-contracts/new-user-status.md: -------------------------------------------------------------------------------- 1 | ## Get User Status 2 | 3 | - **Endpoint:** `/v1/users/status/:userId` 4 | - **Method:** GET 5 | - **Description:** Retrieves the status of a specific user identified by their user ID. 6 | - **Parameters:** 7 | - `userId` (path parameter): The unique identifier of the user whose status is to be retrieved. 8 | - **Response:** 9 | - **Success (200 OK):** Returns the user's status. 10 | - Content-Type: application/json 11 | ```json 12 | { 13 | "id": "string", 14 | "userId": "string", 15 | "data": "object", 16 | "message": "string" 17 | } 18 | ``` 19 | - **Error Responses:** 20 | - 404 Not Found: If the specified user ID does not exist. 21 | - 401 Unauthorized: If the request lacks valid authentication credentials. 22 | - 403 Forbidden: If the authenticated user does not have sufficient permissions to access the user status. 23 | 24 | --- 25 | 26 | ## Update User Status 27 | 28 | - **Endpoint:** `/v1/users/status/:userId` 29 | - **Method:** PATCH 30 | - **Description:** Updates the status of a specific user identified by their user ID. 31 | - **Parameters:** 32 | - `userId` (path parameter): The unique identifier of the user whose status is to be updated. 33 | - **Request Body Validator:** 34 | ```javascript 35 | Joi.object({ 36 | status: Joi.string() 37 | .trim() 38 | .valid(...validUserStatuses) 39 | .required() 40 | .error(new Error(`Invalid Status. the acceptable statuses are ${validUserStatuses}`)), 41 | appliedOn: Joi.number() 42 | .min(todaysTime) 43 | .required() 44 | .error(new Error(`The 'appliedOn' field must have a value that is either today or a date that follows today.`)), 45 | endsOn: Joi.any().when("status", { 46 | is: userState.OOO, 47 | then: Joi.number() 48 | .min(Joi.ref("appliedOn")) 49 | .required() 50 | .error( 51 | new Error( 52 | `The 'endsOn' field must have a value that is either 'appliedOn' date or a date that comes after 'appliedOn' day.` 53 | ) 54 | ), 55 | otherwise: Joi.optional(), 56 | }), 57 | message: Joi.when(Joi.ref("status"), { 58 | is: userState.OOO, 59 | then: Joi.when(Joi.ref("endsOn"), { 60 | is: Joi.number().greater( 61 | Joi.ref("appliedOn", { 62 | adjust: (value) => value + threeDaysInMilliseconds, 63 | }) 64 | ), 65 | then: Joi.string() 66 | .required() 67 | .error( 68 | new Error(`The value for the 'message' field is mandatory when State is OOO for more than three days.`) 69 | ), 70 | otherwise: Joi.optional(), 71 | }), 72 | otherwise: Joi.optional(), 73 | }), 74 | }) 75 | ``` 76 | - **Response:** 77 | - **Success (200 OK):** Returns the updated user's status. 78 | - Content-Type: application/json 79 | ```json 80 | { 81 | "id": "string", 82 | "data": "object", 83 | "message": "string" 84 | } 85 | ``` 86 | - **Error Responses:** 87 | - 400 Bad Request: If the request body is missing or malformed. 88 | - 404 Not Found: If the specified user ID does not exist. 89 | - 401 Unauthorized: If the request lacks valid authentication credentials. 90 | - 403 Forbidden: If the authenticated user does not have sufficient permissions to update the user status. -------------------------------------------------------------------------------- /docs/local-backend-roles/README.md: -------------------------------------------------------------------------------- 1 | # Setting roles in your local backend 2 | 3 | Please make sure that you have setup the backend locally by running the command `yarn validate-setup`. Watch these videos if you have not done that: 4 | - Real Dev Squad Backend Setup Part 1: GitHub OAuth and Downloading Firestore credentials json file 5 | 6 | - Real Dev Squad Backend Setup Part 2: Firestore 7 | 8 | ## Why we need to setup up roles in our local backend? 9 | - There might be a certain feature that you are building which requires admin or super_user role in order to perform a particular action. 10 | - Let's take an example: suppose you are working on a feature which allows the super_user to promote a user of Real Dev Squad to member, for that you need to hit `/moveToMembers/:username` endpoint, it uses a authorizeUser middleware to check if the user has a super_user role. For that you need to use your local backend and set up the required roles in firebase to provide super_user role to yourself. 11 | 12 | ## Steps: 13 | 14 | 1. Make sure that your backend server is running. To run the server run `yarn dev` in your project directory. This will run your server on localhost:3000 15 | 16 | 2. The RDS backend hits `/users?profile=true` endpoint to get the data of the user. 17 | 18 | 3. So let's try to access our details by going to http://localhost:3000/users?profile=true. This will give a 401 error, to solve this follow the step below. 19 | 20 | 4. Copy this URL `https://github.com/login/oauth/authorize?client_id=` and paste it somewhere, now go to your `local.js` (you can see how we got that clientId here) file and copy the clientId that is present there, and paste it in place of `` in the URL provided above. 21 | 22 | 5. This will redirect you to `http://localhost:3000/healthcheck`, if you go to your firebase console, you will notice that a `doc` has been created with your userId in the `users` collection in your firebase, now try going to http://localhost:3000/users?profile=true. you can see those details. 23 | 24 | 6. You can see that there are no roles property present in the object that is returned. we will update the doc that contains our details with the roles. Click on add fields and set the properties as shown below: 25 | 26 | ![Firebase Image](/public/assets/firebase-image.jpg) 27 | 28 | 7. Now click on add, and now if you go to http://localhost:3000/users?profile=true, you will be able to see the roles. 29 | 30 | 8. Now you will be able to perform actions which require admin or super_user roles in your local backend. -------------------------------------------------------------------------------- /docs/profile-service/api-contracts.md: -------------------------------------------------------------------------------- 1 | # Profile Service API Specifications and Contracts 2 | 3 | Profile Service is a custom backend that needs to be set up and maintained by everyone in the RDS community. It includes the following endpoints: 4 | 5 | 1. [`/health`](#endpoint-health) 6 | 2. [`/profile`](#endpoint-profile) 7 | 3. [`/verify`](#endpoint-verify) 8 | 9 | ## Endpoint: /health 10 | 11 | This is a `GET` endpoint that returns a message "Profile Service - Health Verified". 12 | 13 | - **Request** 14 | 15 | GET `/health` 16 | 17 | - **Response** 18 | 19 | HTTP/1.1 200 OK 20 | Content-Type: application/json 21 | 22 | { 23 | "message": "Profile Service - Health Verified" 24 | } 25 | 26 | ## Endpoint: /profile 27 | 28 | This is a `GET` endpoint that returns a JSON object in the following format. It is a verified route, you need to verify the token sent in the header when a request is made to this route. It will be verified with the chain code provided when linked to RDS. 29 | 30 | - **Request** 31 | GET /profile 32 | Authorization: Bearer 33 | 34 | - **Response** 35 | 36 | - Success (HTTP Status 200 OK): 37 | 38 | ```json 39 | HTTP/1.1 200 OK 40 | Content-Type: application/json 41 | 42 | { 43 | "first_name": "YOUR_FIRST_NAME", 44 | "last_name": "YOUR_LAST_NAME", 45 | "email": "YOUR_EMAIL_ID", 46 | "phone": "YOUR_PHONE_NUMBER", 47 | "yoe": YOUR_YEARS_OF_EXPERIENCE_AS_INTEGER, 48 | "company": "YOUR_CURRENT_COMPANY/COLLEGE", 49 | "designation": "YOUR_DESIGNATION", 50 | "github_id": "YOUR_GITHUB_ID", 51 | "linkedin_id": "YOUR_LINKEDIN_ID", 52 | "twitter_id": "YOUR_TWITTER_ID", 53 | "instagram_id": "YOUR_INSTAGRAM_ID", 54 | "website": "YOUR_WEBSITE", 55 | "dob": "YOUR_DATE_OF_BIRTH" 56 | } 57 | ``` 58 | 59 | - Unauthorized (HTTP Status 401 Unauthorized): 60 | 61 | If the token is not provided or is invalid, the response will be: 62 | 63 | ```json 64 | HTTP/1.1 401 Unauthorized 65 | Content-Type: application/json 66 | 67 | { 68 | "message": "Invalid Token" 69 | } 70 | ``` 71 | 72 | - Internal Server Error (HTTP Status 500 Internal Server Error): 73 | - If there is any internal server error, the response will be: 74 | 75 | ```json 76 | HTTP/1.1 500 Internal Server Error 77 | Content-Type: application/json 78 | 79 | { 80 | "message": "Internal Server Error" 81 | } 82 | ``` 83 | 84 | ## Endpoint: /verify 85 | 86 | This is a `POST` endpoint that returns a hash. The request body will contain a key named `salt`. 87 | 88 | - **Request** 89 | 90 | ```json 91 | POST /verify 92 | Content-Type: application/json 93 | 94 | { 95 | "salt": "SOME_SALT_VALUE" 96 | } 97 | ``` 98 | 99 | - **Response** 100 | 101 | - Success (HTTP Status 200 OK): 102 | 103 | ```json 104 | HTTP/1.1 200 OK 105 | Content-Type: application/json 106 | 107 | { 108 | "hash": "" 109 | } 110 | ``` 111 | 112 | - Internal Server Error (HTTP Status 500 Internal Server Error): 113 | - If there is an error in generating the hash, the response will be: 114 | 115 | ```json 116 | HTTP/1.1 500 Internal Server Error 117 | Content-Type: application/json 118 | 119 | { 120 | "message": "Error while encryption" 121 | } 122 | ``` 123 | -------------------------------------------------------------------------------- /public/assets/color-palette.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Real-Dev-Squad/docs/0681b268b5ff4059c73356dc4c995f7ec92c8995/public/assets/color-palette.png -------------------------------------------------------------------------------- /public/assets/firebase-image.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Real-Dev-Squad/docs/0681b268b5ff4059c73356dc4c995f7ec92c8995/public/assets/firebase-image.jpg --------------------------------------------------------------------------------