func GetAppleDeveloperToken() (*FirestoreAppleDevJWT, error) {
	var hostname string
	httpClient := &http.Client{}
	if os.Getenv("ENVIRONMENT") == "DEV" {
		hostname = os.Getenv("HOSTNAME_DEV")
	} else if os.Getenv("ENVIRONMENT") == "PROD" {
		hostname = os.Getenv("HOSTNAME_PROD")
	}
	createAppleDevURI := hostname + "/createAppleDevToken"
	appleDevTokenReq, appleDevTokenReqErr := http.NewRequest("GET", createAppleDevURI, nil)
	if appleDevTokenReqErr != nil {
		return nil, fmt.Errorf("[GetAppleDeveloperToken]: %v", appleDevTokenReqErr)
	}
	appleDevTokenResp, appleDevTokenRespErr := httpClient.Do(appleDevTokenReq)
	if appleDevTokenRespErr != nil {
		return nil, fmt.Errorf("[GetAppleDeveloperToken]: %v", appleDevTokenRespErr)
	}
	var appleDevToken FirestoreAppleDevJWT
	appleDevTokenDecodeErr := json.NewDecoder(appleDevTokenResp.Body).Decode(&appleDevToken)
	if appleDevTokenDecodeErr != nil {
		return nil, fmt.Errorf("[GetAppleDeveloperToken]: %v", appleDevTokenDecodeErr)
	}
	return &appleDevToken, nil
}
-- HELPER FUNCTIONS -- //
GetAppleDeveloperToken will go to Firestore and grab developer token if it exists and will refresh it if expired
package firebase
import (
	"encoding/json"
	"fmt"
	"net/http"
	"os"
	"time"
	firestore "cloud.google.com/go/firestore"
)
type FirestoreUser struct {
	Email                   string                   `firestore:"email" json:"email"`
	ID                      string                   `firestore:"id" json:"id"`
	Playlists               []*firestore.DocumentRef `firestore:"playlists" json:"playlists"`
	PreferredSocialPlatform *firestore.DocumentRef   `firestore:"preferredSocialPlatform" json:"preferredSocialPlatform"`
	ProfileImage            *SpotifyImage            `firestore:"profileImage" json:"profileImage"`
	SocialPlatforms         []*firestore.DocumentRef `firestore:"socialPlatforms" json:"socialPlatforms"`
	DisplayName             string                   `firestore:"displayName" json:"displayName"`
	Username                string                   `firestore:"username" json:"username"`
}
type FirestoreSocialPlatform struct {
	APIToken           APIToken     `firestore:"apiToken" json:"apiToken"`
	RefreshToken       string       `firestore:"refreshToken" json:"refreshToken"`
	Email              string       `firestore:"email" json:"email"`
	ID                 string       `firestore:"id" json:"id"`
	IsPreferredService bool         `firestore:"isPreferredService" json:"isPreferredService"`
	IsPremium          bool         `firestore:"isPremium" json:"isPremium"`
	PlatformName       string       `firestore:"platformName" json:"platformName"`
	ProfileImage       SpotifyImage `firestore:"profileImage" json:"profileImage"`
	Username           string       `firestore:"username" json:"username"`
}
type FirestoreMedia struct {
	ID      string                     `firestore:"id" json:"id"`
	Name    string                     `firestore:"name" json:"name"`
	Album   string                     `firestore:"album,omitempty" json:"album,omitempty"`
	Type    string                     `firestore:"type" json:"type"`
	Creator string                     `firestore:"creator" json:"creator"`
	Apple   FirestoreMediaPlatformData `firestore:"apple,omitempty" json:"apple,omitempty"`
	Spotify FirestoreMediaPlatformData `firestore:"spotify,omitempty" json:"spotify,omitempty"`
	YouTube FirestoreMediaPlatformData `firestore:"youtube,omitempty" json:"youtube,omitempty"`
}
type FirestoreMediaPlatformData struct {
	ID     string      `firestore:"id" json:"id"`
	URL    string      `firestore:"url" json:"url"`
	Images interface{} `firestore:"images" json:"images"`
}
type FirestoreAppleDevJWT struct {
	ExpiresAt int64  `json:"expiresAt"`
	IssuedAt  int64  `json:"issuedAt"`
	Token     string `json:"token"`
}
type FirestoreSpotifyAuthToken struct {
	ExpiredAt string `json:"expiredAt"`
	ExpiresIn int    `json:"expiresIn"`
	IssuedAt  string `json:"issuedAt"`
	Token     string `json:"token"`
}
type FirestorePlaylist struct {
	ID        string                   `firestore:"id" json:"id"`
	Name      string                   `firestore:"name" json:"name"`
	CreatedBy *firestore.DocumentRef   `firestore:"createdBy" json:"createdBy"`
	Members   []*firestore.DocumentRef `firestore:"members" json:"members"`
	Songs     PlaylistSongs            `firestore:"songs" json:"songs"`
	Comments  interface{}              `firestore:"comments" json:"comments"`  
	CoverArt  string                   `firestore:"coverArt" json:"coverArt"`
}
type PlaylistSongs struct {
	AddedBy  map[string][]string      `firestore:"addedBy" json:"addedBy"`
	AllSongs []*firestore.DocumentRef `firestore:"allSongs" json:"allSongs"`
}
type FirestoreEvent struct {
	OldValue   FirestoreValue `json:"oldValue"`
	Value      FirestoreValue `json:"value"`
	UpdateMask struct {
		FieldPaths []string `json:"fieldPaths"`
	} `json:"updateMask"`
}
type FirestoreValue struct {
	CreateTime time.Time          `json:"createTime"`
	Fields     FirestoreEventUser `json:"fields"`
	Name       string             `json:"name"`
	UpdateTime time.Time          `json:"updateTime"`
}
type FirestoreEventUser struct {
	ID           stringValue          `json:"id"`
	Email        stringValue          `json:"email"`
	ProfileImage profileImageMapValue `json:"profileImage"`
	DisplayName  stringValue          `json:"displayName"`
	Username     stringValue          `json:"username"`
}
type FirestoreEventSongs struct {
	OldValue   FirestoreEventSong `json:"oldValue"`
	Value      FirestoreEventSong `json:"value"`
	UpdateMask struct {
		FieldPaths []string `json:"fieldPaths"`
	} `json:"updateMask"`
}
type FirestoreEventSong struct {
	Fields struct {
		ID      stringValue   `json:"id"`
		Album   stringValue   `json:"album"`
		Creator stringValue   `json:"creator"`
		Name    stringValue   `json:"name"`
		Type    stringValue   `json:"type"`
		Apple   MediaMapValue `json:"apple"`
		Spotify MediaMapValue `json:"spotify"`
		YouTube MediaMapValue `json:"youtube"`
	} `json:"fields"`
	Name       string `json:"name"`
	UpdateTime string `json:"updateTime"`
}
type FirestoreEventProfileImage struct {
	Width  integerValue `json:"width,omitempty"`
	Height integerValue `json:"height,omitempty"`
	URL    stringValue  `json:"url,omitempty"`
}
type FirestoreEventMedia struct {
	ID stringValue `json:"id"`
	URL stringValue `json:"url"`
}
type MediaMapValue struct {
	MapValue struct {
		Fields FirestoreEventMedia `json:"fields"`
	} `json:"mapValue"`
}
type profileImageMapValue struct {
	MapValue struct {
		Fields FirestoreEventProfileImage `json:"fields"`
	} `json:"mapValue"`
}
type integerValue struct {
	IntegerValue int `json:"integerValue"`
}
type stringValue struct {
	StringValue string `json:"stringValue"`
}
type APIToken struct {
	CreatedAt string `firestore:"createdAt" json:"createdAt"`
	ExpiredAt string `firestore:"expiredAt" json:"expiredAt"`
	Token     string `firestore:"token" json:"token"`
	ExpiresIn int    `firestore:"expiresIn" json:"expiresIn"`
}
type SpotifyImage struct {
	Height int    `firestore:"height,omitempty" json:"height,omitempty"`
	URL    string `firestore:"url" json:"url"`
	Width  int    `firestore:"width,omitempty" json:"width,omitempty"`
}