Identity & Members

Members Service

The Members service manages membership records in the biztechMembers2026 DynamoDB table. All endpoints are admin-only (caller must have a @ubcbiztech.com email). Handlers are in services/members/handler.js.


Endpoints

MethodPathHandlerDescription
POST/memberscreateCreate a member record
GET/members/{id}getGet a member by email
GET/membersgetAllList all members
PATCH/members/{id}updateUpdate a member record
DELETE/members/{id}delDelete a member record
POST/members/grantgrantMembershipGrant membership
GET/members/email/{profileID}getEmailFromProfileLook up email from profile ID

All endpoints require Cognito authentication + @ubcbiztech.com email.


Tables

The members service operates on multiple tables:

TableRole
biztechUsersUpdated during grant (isMember flag)
biztechMembers2026Primary member records
biztechProfilesCreated during grant if no profile exists

Year-Suffixed Table

The table name biztechMembers2026 includes the membership year. The constant MEMBERS2026_TABLE in constants/tables.js controls which year is active. When the year rolls over, this constant and the corresponding DynamoDB table must be updated.


GET /members/{id}

Fetch a single member by email.

Request

HeadersType
AuthorizationBearer Token
Path ParamDescription
idMember’s email

Example Request

GET /members/student@example.com

Response

{
  "id": "student@example.com",
  "firstName": "Alice",
  "lastName": "Wong",
  "faculty": "Commerce",
  "year": "3",
  "major": "Accounting",
  "international": true,
  "topics": ["Finance", "Tech"],
  "createdAt": 1755702100000,
  "updatedAt": 1755702100000
}

Errors

  • 403 Unauthorized
  • 400 Invalid email
  • 404 Member not found

GET /members/

Fetch all members.

Request

HeadersType
AuthorizationBearer Token

Response

{
  "message": "success",
  "data": [
    {
      "id": "student@example.com",
      "firstName": "Alice",
      "lastName": "Wong",
      "year": "3",
      "major": "Accounting",
      "createdAt": 1755702100000,
      "updatedAt": 1755702100000
    },
    {
      "id": "bob@example.com",
      "firstName": "Bob",
      "lastName": "Li",
      "year": "4",
      "major": "Finance"
    }
  ]
}

PATCH /members/{id}

Update an existing member by email.

Request

HeadersType
AuthorizationBearer Token
Path ParamDescription
idMember’s email

Body

  • Accepts any subset of the fields from POST /members/.

Example Request

{
  "major": "Business Technology Management",
  "year": "4",
  "topics": ["Consulting", "AI"]
}

Response

{
  "message": "Updated member with email student@example.com!",
  "response": {
    "Attributes": {
      "major": "Business Technology Management",
      "year": "4",
      "topics": ["Consulting", "AI"],
      "updatedAt": 1755703100000
    }
  }
}

Errors

  • 403 Unauthorized
  • 400 Invalid email
  • 404 Member not found

DELETE /members/{id}

Delete a member by email.

Request

HeadersType
AuthorizationBearer Token
Path ParamDescription
idMember’s email

Example Request

DELETE /members/student@example.com

Response

{
  "message": "Member deleted!",
  "response": {
    "id": "student@example.com"
  }
}

Errors

  • 403 Unauthorized
  • 400 Invalid email
  • 404 Member not found

POST /members/grant

Grant membership for a user. This endpoint creates or updates user, member, and profile records as needed. There is no revocation path — this handler only grants.

Request

HeadersType
AuthorizationBearer Token

The body must contain the full set of member fields (the handler reads all of them):

Body PropertyTypeDescription
emailStringUser email (required)
firstNameStringFirst name
lastNameStringLast name
educationStringUniversity or institution
studentNumberStringStudent number
pronounsStringPronouns
levelOfStudy / yearStringYear of study (handler checks both fields)
facultyStringFaculty
majorStringMajor
internationalStudentBooleanInternational student flag
previousMemberBooleanWas a member in a previous year
dietaryRestrictionsStringDietary restrictions
referralStringHow they heard about BizTech
topicsString[]Topics of interest

Example Request

{
  "email": "isaacliu@gmail.com",
  "firstName": "Isaac",
  "lastName": "Liu",
  "education": "University of British Columbia",
  "studentNumber": "12345678",
  "pronouns": "He/Him/His",
  "levelOfStudy": "3",
  "faculty": "Commerce",
  "major": "BUCS",
  "internationalStudent": false,
  "previousMember": true,
  "dietaryRestrictions": "None",
  "referral": "Friend",
  "topics": ["Finance", "Tech"]
}

Response

{
  "message": "Membership granted"
}

Behavior

  1. If the user does not exist in biztechUsers, creates a new user record via db.put
  2. If the user exists, updates the user record via db.updateDB and sets isMember: true
  3. If no member record exists in biztechMembers2026, creates one with all provided fields plus cardCount: 0
  4. If no profile exists (checked via profileID on the member record), creates a profile via createProfile() — type is EXEC for @ubcbiztech.com emails, ATTENDEE otherwise

No Revocation

Despite the handler name, grantMembership only grants. There is no membership: false flag and no code path for revoking membership or deleting records. To revoke membership, update the DynamoDB records directly.

Errors

  • 403 Unauthorized if caller is not @ubcbiztech.com
  • 400 Invalid email format
Previous
Users Service