Routes - sitechtimes/club-attendance-backend-v2 GitHub Wiki

Route

Routes allow for the manipulation of data from the backend. Providing the frontend access to the database. These routes allow for the creation, deletion, and the retrieval of data from the google drive.

All routes for this project can be found here.

For the routes to work properly request from the frontend must match the HTTP Method and must provide the request body if need, most image routes however will require a form-data to send image files. If the HTTP Method or the form-data does not match with what is shown below then the routes may not function properly.

All routes can be test with postman, the collection of the routes can be found here

Below is a sample route, and other usable route with their HTTP method, route name, and the request body, with a short description of what each route is supposed to do. Some routes will have a response with data that can be used on the frontend.

Sample Route

[HTTP Method] "/routeName"

req.body 
{
 "uuid": "sampleUuid",
 "clubName": "sampleClubName",
 "year": "sampleYear"
}

Auth Routes

  • OAuth2

GET /oauth2

Redirects the user to Google login, using a link that is generated using the oAuth2client.generateAuthUrl().

  • oAuth2callback

GET /oauth2callback

After the user logs in using Google's oAuth, we receive a verified token and set the oAuth2 client with that token. We receive the user's data from Google. If the user is a new user, we add them to the main user sheet, then we create a cookie called "user_data" that contains the user information.


Club Data Routes

  • Get Club Data

GET /getClubData/:clubName/:year

Replace the params (:clubName and :year) with the club name and the year. Retrieves the club data of the specified club in the clubName param and the year of that club. The route will search through the metadata sheet of the specified year and return data of the club.

Response (Sample)

{
    "clubName": "Anime Club",
    "clubAdivsor": "Callahan",
    "clubAdvisorEmail": "Advisor Email",
    "clubPresident": "Marcus Yuen",
    "clubPresidentEmail": "President Email",
    "nextMeeting": "1/2000/2025",
    "room": "317"
}
  • Get Club Members

GET /getClubMembers/:clubName/:year/:uuid

Provide clubName, year, uuid in the request link. The response will be an array of objects containing the info of the member.

Response (Sample)

[
    {
        "UID": "117630357841785777342",
        "First Name": "JaezRR",
        "Last Name": "",
        "Email": "[email protected]",
        "Position": "Member",
        "Grade": "",
        "Official Class": "",
        "# of Attendances": "3"
    },
 ...
]
  • Get Club Meta

GET /getAllClubMeta/:uuid/:year

Provide uuid and year in the request link. Will provide an array of objects containing the information the meta data of the club.

Respone (Sample)

[
    {
        "Club Name": "3D Printing Club",
        "Advisor Email": "Advisor Email",
        "Club Advisor": "Buro",
        "President Email": "President Email",
        "Club President": "Benjamin Cavallaro & Elizabeth Superfin ",
        "Next Meeting": "1/2000/2025",
        "Room": "237",
        "QR Code": "1okGoCJyjnpqvocp4joLf_CM4mkosXPqQ",
        "Club Folder ID": "1DQz6Z5hA_9Ioke5USAmxt3HDynkqmoij",
        "Club Spreadsheet": "1LQkfJo_80LuXlp_n3KR1hTPY3kb3uRxP_YwN3a6bN8Y",
        "Club Photo Folder ID": "1jSRlKXZZCeR2qRUFnL3K41H0xBm8cYzD",
        "Club Code": "0f5971d0-fc2a-4705-84ce-7ae186d14fce"
    },
 ...
]

Update Attendance

PATCH /updateAttendance

Request Body (Sample)

{
    "year": "2024-2025",
    "clubName": "3D Printing Club",
    "uuid": "117630357841785777342"
}

Update attendance for the specified club and year.


Add/Delete club Meeting

  • Add Club Meeting

POST /addClubMeeting

Request Body (Sample)

{
    "year": "2024-2025",
    "clubName": "3D Printing Club",
    "nextMeeting": "1/2000/2025",
    "uuid": "113380945040354412648"
}

Add a club meeting for the specified club and year.

  • Delete Club Meeting

POST /deleteClubMeeting

Request Body (Sample)

{
    "year": "2024-2025",
    "clubName": "3D Printing Club",
    "uuid": "113380945040354412648"
}

Delete a club meeting for the specified club and year.


Club Image

All Club Image routes require Multer make sure that it is configured correctly and that the corresponding key-value matches the one that is set for Multer to use to process image. Multer is currently configured to use the key-value 'image' for any image files that are to be uploaded.

  • Show Attendance Photos

GET /showAttendancePhotos

This route needs to be reconfigured do not use Uses ClubName and Year to retrieve the attendance photo (more like profile photo of the club)

  • Upload Image

POST /uploadImage

Allows club presidents to upload image which are then created as a file in the 'Club Image' folder and will need to be approved before the image can be used. Send the data as a 'form-data' and the key-value should be 'image'

Request (Sample in JS)

let formdata = new FormData();

formdata.append("year", "2023-2024");
formdata.append("clubName", "Art Club");
formdata.append("uuid", "113380945040354412648");
formdata.append("image", fileInput.files[0], "postman-cloud:///1eeb484d-d8b2-42f0-94cb-215435d89a81"); //key-value is image and it contains the image file 

Disclaimer: for formdata.append("image", fileInput.files[0], "postman-cloud:///1eeb484d-d8b2-42f0-94cb-215435d89a81"); 'fileInput.files[0]' may not be necessary, this is postman code, so just the key-value and the image file may be all that is needed


Admin Routes

  • Create Club Templates

POST /createClubTemplate

Form Data

uuid: "ADMIN UUID"
csv: "CSV FILE"

Allows Admins to create the club templates by uploading a csv. This route will default to the process.env.CLUB_DATA_SPREADSHEET_ID if no csv is provided this can allow for devs to create the club templates by providing the Id of the sheet with the club data. club data sheet must be within the club attendance folder

  • Approve Image

PATCH /approveImage

Approves the selected image and moves the image from the 'Club Image' folder to the designated clubs folder. Send the image, uuid, clubName, year as shown below:

var formdata = new FormData();
formdata.append("image", fileInput.files[0], "/C:/Users/aiden.pang/Downloads/3d+rapid+prototyping.jpeg");
formdata.append("uuid", "113383945040353412348");
formdata.append("year", "2023-2024");
formdata.append("clubName", "Art club");
  • Get Unapproved Images

GET /getUnapprovedImages/:uuid

Retrieves all images from the 'Club Image' folder, which are all the unapproved images and returns an array. Replace 'uuid' with the ID of a user with admin level priveleges. Response (Sample)

[
    {
        "link": "https://drive.google.com/uc?export=view&id=12UHPJlCPLfV4NTPsQPXSqtk8gyllHV_I",
        "src": "https://drive.google.com/file/d/12UHPJlCPLfV4NTPsQPXSqtk8gyllHV_I",
        "fileId": "12UHPJlCPLfV4NTPsQPXSqtk8gyllHV_I",
        "downloadUrl": "https://drive.google.com/uc?id=12UHPJlCPLfV4NTPsQPXSqtk8gyllHV_I&export=download"
    },
 ...
]

Currently this the links don't seem to work, this route may be changed to use google sheet to store the image files instead.

  • Add Club

POST /addClub

Allows for admin to create a new club

Request body (Sample)

{
    "year": "2024-2025",
    "clubName": "klajsdfl; Club",
    "clubAdvisor": "bean",
    "advisorEmail": "[email protected]",
    "clubPresident": "bean",
    "presidentEmail": "[email protected]",
    "room": "01978-234",
    "uuid": "113383945040353412348"
}
  • Delete Club

DELETE /deleteClub

Request body (Sample)

{
    "clubName": "klajsdfl; Club",
    "year": "2024-2025",
    "uuid": "113383945040353412348"
}

Removes club that matches the 'clubName' of within the folder of the specified 'year'

  • Update QR Code

PATCH /updateQRCode

Creates a new QR code for the specifed club and year, removes the old ones and replace with new QR code, also updates the meta data to reflect the change QR code id

this route is iffy don't use, needs to be fixed


Admin + Club President

  • Remove Student from Club

DELETE /removeStudentFromClub

Request body

{
    "year": "2024-2025", 
    "clubName": "3D Printing Club",
    "uuid": "113383945040353412348"
}

Removes the user that matches the uuid from the club of the specified year


Dev Test Route

Routes that are meant to test parts of middleware

  • Create Sheet from CSV

POST /createSheetFromCSV

Form Data

csv: "CSV FILE"

Test whether the uploadCSV function works and is able to properly upload the csv to the club attendance folder