Officers
Information about officers populates the Leadership tab on the Leadership site.
Schema
The following information about officers is stored.
interface officer {
id: string;
name: string;
email?: string;
start?: firestore.Timestamp | string;
end?: firestore.Timestamp | string;
acm_email?: string;
linkedin?: string;
role_list?: role[] | string[];
accolades?: accolade[] | string[];
teams?: team[];
events?: event[];
}
tip
The id
field for each officer can be seen when accessing their personal page as follows --> https://leadership.acmutd.co/profile/<ID>
. This is a uniquely auto-generated id that also serves as the document name in the officers
collection on firestore.
The start
and end
fields on the document are stored as timestamps in Firestore but are converted to and used as a string
in the application logic. The teams
and events
fields are not present for all officers. Only those that have managed teams (through Projects or Research) or organized events (through HackUTD / Hacktoberfest / etc) have an array of objects for these fields. Only the name
and id
values are present in the teams
and events
arrays.
Roles
Each officer object contains a list of roles. The title for each role is stored as a string[]
in the root level Firestore document. However, there is additional metadata associated with each role that is stored in own document in the roles
subcollection. The following information about roles is stored.
interface role {
id?: string;
title: string;
start?: firestore.Timestamp | string;
end?: firestore.Timestamp | string;
}
The information present in the roles
subcollection is only accessed via the GraphQL API. The leadership site only uses the string[]
roles stored in the root level document.
Accolades
Each officer object contains a list of accolades. The raw text for each accolade is stored as a string[]
in the root level Firestore document. However, there is additional metadata associated with each accolade that is stored in own document in the accolades
subcollection. The following information about accolades is stored.
interface accolade {
id?: string;
text: string;
date?: firestore.Timestamp | string;
sender_email?: string;
sender_name?: string;
}
The information present in the accolades
subcollection is only accessed via the GraphQL API. The leadership site only uses the string[]
accolade raw text stored in the root level document.
Aggregations
To avoid having to read all documents when populating the landing page for the leadership site, some information is aggregated into a single document. The following information is stored in the total/allinone
document.
interface allinone {
officers: officer[];
role_list: role[];
historian: string[];
}
caution
Only the required fields from the aforementioned interfaces are used to populate the aggregation document. This reduces the size of the document and ensures that only the information required is loaded up.
To accomodate for reading only the aggregation document vs reading all the profile information about an officer, the officer
interface only requires the id
and name
fields. The full officer
interface with all fields is read back when loading up the profile page.
Image
Officer headshots are stored in Firebase Cloud Storage in the acm-core
bucket. The images are stored at leadership/profile/<ID>.jpg
where <ID>
is the same as the id
field in the officer
interface.