Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
130 commits
Select commit Hold shift + click to select a range
5d60065
Implement LogoutInteractor with complete execute method
YifeiYang369 Oct 20, 2025
a1653e7
Finished TODO
chrisjym Oct 20, 2025
d07c4e4
LogoutController
jjyoi Oct 20, 2025
3abe302
Merge pull request #2 from SuperUltraCoolGuy/logout-interactor
YifeiYang369 Oct 20, 2025
4aeeb66
Merge pull request #1 from SuperUltraCoolGuy/feature/logout-presenter
chrisjym Oct 20, 2025
b5ef2cb
Updated Main.java
jjyoi Oct 20, 2025
3e7dcae
LoggedInView todo
Angelie-Wu Oct 20, 2025
87e32af
Merge pull request #3 from SuperUltraCoolGuy/joyi
jjyoi Oct 20, 2025
2121210
complete the excutation
Angelie-Wu Oct 20, 2025
389ef8c
update
Angelie-Wu Oct 20, 2025
d8b0905
Merge pull request #4 from SuperUltraCoolGuy/Angelie
Angelie-Wu Oct 20, 2025
f5b57b1
[chore] initial commit
chrisjym Nov 10, 2025
809e34f
[chore] compeleted login back button
chrisjym Nov 10, 2025
8bddec9
Merge pull request #5 from chrisjym/feature/back-button
YifeiYang369 Nov 10, 2025
ac74de0
Finished Sign-Up Screen
chrisjym Nov 10, 2025
439614a
Merge pull request #6 from chrisjym/feature/sign-up-screen
jjyoi Nov 11, 2025
fa08279
implement Location entity
YifeiYang369 Nov 12, 2025
92b92c5
feat: add EventCategory enum with type-safe categories
YifeiYang369 Nov 12, 2025
19e0827
feat: implement Event entity with validation and business methods
YifeiYang369 Nov 12, 2025
c91a2f3
feat: complete entity layer with EventRepository interface
YifeiYang369 Nov 12, 2025
9fb1e1d
[feature-WIP] EventView
chrisjym Nov 12, 2025
4eed9bd
finished back button functionality
chrisjym Nov 13, 2025
d2ca52a
Fix: Back Button Functionality not implemented in EventView
chrisjym Nov 13, 2025
d214242
chore clean up code
chrisjym Nov 13, 2025
fea22b3
[chore] added function descriptions to EventView
chrisjym Nov 13, 2025
f5736a0
Implemented into appbuilder and main
chrisjym Nov 13, 2025
3b2c4cb
[chore] added Event to SearchEventByNameState
chrisjym Nov 13, 2025
d0fa4f7
[fix] added check if the event queried is empty or not
chrisjym Nov 13, 2025
3c713a5
feat: add getImageUrl method and update datetime handling
YifeiYang369 Nov 13, 2025
93c27e8
Set up to work with event data access
chrisjym Nov 13, 2025
7df8f95
feature: created test for EventView
chrisjym Nov 14, 2025
cb6ad5a
finished view
chrisjym Nov 14, 2025
0d501bd
Finished search bar test and view
chrisjym Nov 14, 2025
8bbd292
WIP implementing Search use case
chrisjym Nov 14, 2025
e615291
WIP
chrisjym Nov 14, 2025
9cce8cd
WIP
chrisjym Nov 15, 2025
0d55b9d
WIP
chrisjym Nov 15, 2025
04a03f7
event entity class initialized
jjyoi Nov 16, 2025
9fa40d0
location entity initialized
jjyoi Nov 16, 2025
5efc42b
Merge pull request #11 from chrisjym/display-local-events
chrisjym Nov 16, 2025
dc1ea4a
Create Branch and the CaenarView file
Angelie-Wu Nov 16, 2025
15698df
WIP
chrisjym Nov 16, 2025
d1b40dc
Merge branch 'main' into feature/event_by_name
chrisjym Nov 16, 2025
93e7a54
Merge branch 'feature/search-bar' into feature/event_by_name
chrisjym Nov 16, 2025
079b76d
Pulled changes into new branch and merged with search bar
chrisjym Nov 16, 2025
a03193c
WIP Finished connection between search and event_by_name_view
chrisjym Nov 16, 2025
53bad5b
input and output data for use case #3 implemented
jjyoi Nov 17, 2025
6a27594
added data access layer for Event entities
jjyoi Nov 17, 2025
286f6ee
use case input and output boundary unit test cases implements
jjyoi Nov 17, 2025
5aead5a
integrate event description (use case #3) into UI
jjyoi Nov 17, 2025
39e7be4
updated some comments
jjyoi Nov 17, 2025
d12ef40
- Add the CalendarView.java file
Angelie-Wu Nov 17, 2025
6ae0d42
Update API key placeholder in EventDataAccessObject
YifeiYang369 Nov 17, 2025
c8ea4ef
Allowed Search Bar to get a custom location, rather than use Toronto …
chrisjym Nov 19, 2025
e061aa9
Merge branch 'feature/event_by_name' of https://github.com/chrisjym/2…
chrisjym Nov 19, 2025
a4c7943
Merge branch 'main' into event-description
jjyoi Nov 19, 2025
4b8f8c8
Merge pull request #14 from chrisjym/Claendar-Flow
chrisjym Nov 20, 2025
2b4d627
Merge pull request #13 from chrisjym/event-description
chrisjym Nov 20, 2025
63a16ef
Completed save button view
chrisjym Nov 20, 2025
02405ad
Finished SaveEventView and functionality independent of SaveButton
chrisjym Nov 20, 2025
d2f27ce
Finished Card creation
chrisjym Nov 20, 2025
ecbfb4d
WIP Connecting SaveButton to View
chrisjym Nov 20, 2025
e913643
Merge branch 'feature/save-button' into feature/event_by_name
chrisjym Nov 21, 2025
7515d01
Finished save events GUI, hooking up button to view
chrisjym Nov 21, 2025
5f2714b
[chore]: fixed Save Views
chrisjym Nov 21, 2025
5771817
fixed merging bugs from event and location entity
jjyoi Nov 22, 2025
a6a6466
Finished save functionality, no data persistence
chrisjym Nov 22, 2025
e0205c9
Created a demo test view for save, DO NOT INCLUDE in final submission
chrisjym Nov 22, 2025
1672c61
use case #3 UI updated
jjyoi Nov 22, 2025
d83bd1e
Finished data persistence, test is also updated to use data persistence
chrisjym Nov 22, 2025
0e24bda
- add inputData, inputBoundary, interactor, outputData, outputBoundar…
Angelie-Wu Nov 22, 2025
0d1b905
Changed UI slightly
chrisjym Nov 23, 2025
e2e4c99
Merge pull request #23 from chrisjym/event-description
chrisjym Nov 23, 2025
c705729
Merged with main
chrisjym Nov 23, 2025
b79d25f
Add DisplayLocalEvents Usecase:
YifeiYang369 Nov 23, 2025
0fe6dc5
connect login view and the main view
YifeiYang369 Nov 23, 2025
cd4c661
add dataAcessObject, Controller, Presenter,State, ViewModel, DataAces…
Angelie-Wu Nov 24, 2025
fc38df4
implement the main page
YifeiYang369 Nov 24, 2025
eaae244
- Still need to do Presenter, EventListView, ViewModel, and State
Angelie-Wu Nov 24, 2025
631b5ba
Merging
chrisjym Nov 24, 2025
dc8d4bc
Merge branch 'main' into feature/event_by_name
chrisjym Nov 24, 2025
5c53396
[chore] Update README.md
chrisjym Nov 24, 2025
5c84a7d
Merge pull request #26 from chrisjym/chrisjym-patch-2
chrisjym Nov 24, 2025
5e5ec50
Update README.md
chrisjym Nov 24, 2025
2440208
Created initial format and filled in some categories of the ReadMe
chrisjym Nov 25, 2025
ec103da
Fixed entity usage
chrisjym Nov 25, 2025
5f51533
Remove redudant code
chrisjym Nov 25, 2025
c12ace6
Merge pull request #27 from chrisjym/chrisjym-patch-4
jjyoi Nov 25, 2025
dd5dee7
Grouped demo tests together
chrisjym Nov 25, 2025
04a1a74
Finish the DisplayLocalEvents Use Case
YifeiYang369 Nov 26, 2025
d78d3b9
WIP: Added Interactor Test for SaveEvent scaffolding
chrisjym Nov 26, 2025
a2041f8
Finish the DisplayLocalEvents Use Case
YifeiYang369 Nov 26, 2025
68fd37a
Finished login screen
chrisjym Nov 26, 2025
7a38881
[chore]: cleaned up code
chrisjym Nov 26, 2025
c2242ee
Finished merging main into branch
YifeiYang369 Nov 26, 2025
5fe59ab
[chore] cleand up code
chrisjym Nov 26, 2025
af8e3b4
Merge branch 'main' into display-local-events
YifeiYang369 Nov 26, 2025
c3f2caf
complete the calendar output view(that print the result event list), …
Angelie-Wu Nov 26, 2025
4fa871b
Update README.md
chrisjym Nov 26, 2025
d7222e5
[fix] changed build to use signupView
YifeiYang369 Nov 26, 2025
1f493ac
Merge pull request #29 from chrisjym/feature/login-view
YifeiYang369 Nov 26, 2025
48b5e95
[fix] removed API Key
YifeiYang369 Nov 26, 2025
5d8bee7
Merge branch 'main' into display-local-events
YifeiYang369 Nov 26, 2025
a1ec473
[chore] merged main into branch
YifeiYang369 Nov 26, 2025
58d9a5d
Removed API KEY
YifeiYang369 Nov 26, 2025
7ef34a8
Update README.md
chrisjym Nov 26, 2025
a7cf551
[chore] Remove API_KEY
chrisjym Nov 26, 2025
64cad9f
Implemented changes
chrisjym Nov 26, 2025
0221767
Merge pull request #15 from chrisjym/feature/event_by_name
chrisjym Nov 26, 2025
789b097
Merge pull request #30 from chrisjym/chrisjym-patch-1
jjyoi Nov 26, 2025
368e38e
added unit tests for entities location and event
jjyoi Nov 26, 2025
3746351
[merge] removed dataaccessobject
YifeiYang369 Nov 26, 2025
b8e623c
[merge] merged main into branch
YifeiYang369 Nov 26, 2025
31e4593
change the api key to be private
YifeiYang369 Nov 26, 2025
fbfba3d
complete the test file and the view formating. Complemete the impleme…
Angelie-Wu Nov 26, 2025
c0cc027
a little change
YifeiYang369 Nov 26, 2025
b7efa34
Merge branch 'main' into Calendar-Flow
Angelie-Wu Nov 26, 2025
4bed368
Merge pull request #28 from chrisjym/display-local-events
YifeiYang369 Nov 26, 2025
4cfcbf9
resolve conflict
Angelie-Wu Nov 26, 2025
2b425ca
Merge branch 'main' into entity-tests
Angelie-Wu Nov 26, 2025
30991a8
Merge pull request #31 from chrisjym/entity-tests
chrisjym Nov 26, 2025
c8f4170
Merge pull request #32 from chrisjym/Calendar-Flow
Angelie-Wu Nov 26, 2025
f88ecf9
[feature] finished event test
chrisjym Nov 27, 2025
f978ec8
Merge pull request #34 from chrisjym/feature/save-event-test
jjyoi Nov 27, 2025
f35a354
[feature] connected to search bar
chrisjym Nov 27, 2025
c35f511
Removed API KEY
chrisjym Nov 27, 2025
d7d8064
Merge pull request #35 from chrisjym/feature/save-event-test
YifeiYang369 Nov 27, 2025
f07bced
no changes actually
YifeiYang369 Nov 27, 2025
918024c
Merge branch 'main' into display-local-events
YifeiYang369 Nov 27, 2025
5662cfd
add a savedEventsButton
YifeiYang369 Nov 27, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions 207-project-event-discovery
Submodule 207-project-event-discovery added at d83bd1
283 changes: 64 additions & 219 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,248 +1,93 @@
# Clean Architecture Team Lab Activity: Login and Logout
#csc-207-project-event-discovery
207 Final Project

In this team lab activity, your team will:
- explore an existing use case (login)
- add a new use case (logout).

To earn credit:
- your team must demo your working `logout` use case.
# Table of Contents
- [Overview](#overview)
- [Usage Guide](#guide)
- [Contributors](#contributors)
- [Demo/Screenshots](#demo)
- [PR Style](#style)
- [Setup](#setup)

Your demo should be similar to the below example:

![](images/sample-logout.gif)
<h1></h1>

---
# Overview:
Event Gate: This project acts like an alternative to Ticketmaster, allowing users to search for local events, view them through a calendar, and saving these events into memory for viewing at later times.

## Task 0: Fork this repo on GitHub
**To get started, one team member should fork this repo on GitHub and share it with the team.
All team members should then clone it.**
# TODOs


**Suggested logistics:** One of you should invite the others to collaborate on their fork of the original repo on GitHub. You can do this in your repo on GitHub under `Settings -> Collaborators`. This will allow you to push branches to a common repo and then use pull requests to contribute your code and review. To prevent others from pushing directly to the main branch, we recommend that you set branch protection rules on GitHub. Below are how the settings might look if you add branch protection rules:

![image of branch protection rules for main with a requirement of two approvers to merge in pull requests.](images/branch_protection_rules.png)
# File Structure
- Users can create accounts with a personal username and password to be stored into local memory
- Users can search for events near them based on location
- Users can categorize the events they search for based on specific categories
- Users can view events in a calendar format, viewing events based off of date
- Users can save events to be viewed later
- Users can view the description of the events

---

## Task 1: Understanding the Program
#Contributors:
1. Christopher Mong
2. Joyi Xue

Open the project in IntelliJ. Open `app.Main` and read it as a team.
- What are the currently implemented Views and Use Cases in the program?
- Which Use Cases are triggered from each View?
- Which version of the DAO is `app.Main` using?

> Observe that the main method makes use of the `app.AppBuilder` class which
is responsible for constructing our CA engine for each use case of the application. To answer the last two questions above, you will need to look inside the details of the `app.AppBuilder` class.

**Make sure that each member of your team can successfully run `app/Main.java`.**
- Ensure that you are each able to create a new user and log in using the username and password.
# PR Style:
- [chore]: Used to represent menial tasks that were simple fixes or style cleanup.

> Note: you may need to set the Project SDK in the `Project Structure...` menu, and possibly
> also manually link the Maven project if the app won't run when you try to run Main.
# Initial Setup:
In order to properly use the Ticketmaster API, you must sign up to Ticketmaster's open source developer site; then you will receive an API Key from the Discovery API. This should be substituted into the EventDataAccessObject's API_KEY constant. Only from here will you have access to real time events from Ticketmaster.

### Task 1.1: Exploring the login use case
<img width="739" height="114" alt="Screenshot 2025-11-24 at 6 59 17 PM" src="https://github.com/user-attachments/assets/543518f4-4a39-4e21-8520-e2e40281e90e" />

Let's take a tour of the login use case code:
# Usage Guide
## Features

- In IntelliJ, find the `LoginController` class and open it.
### Searching for Events

- Set a breakpoint inside its `execute` method.
#### Login/Signup
1. Launch the application
2. You will see a sign up page
3. Sign up, or navigate to the login page to login to a pre-existing user
4. Click the log in/sign up button

- Run the program in debug mode.

- On the login page, attempt to log in with an existing account. When you click the button, the breakpoint that you set will be triggered.
#### Via Search Bar
1. Sign Up/ Log In
2. You'll see a search bar at the top of the dashboard
3. Type an event name (e.g., "Raptors", "Drake", "Hamilton")
4. Press **Enter** or click the search button
5. The app will display matching events near your default location (Toronto)

- **Step through the code to trace the execution of the login use case.**
Importantly, pay extra close attention to what the Presenter does to ensure that the LoggedInView gets displayed after the user successfully gets logged into the application.
#### Via Location
1. Sign Up / Log In
2. If you wish to change the location in viewing events, click the location drop down
3. Change to one of the pre-saved locations
4. Click search

> Pay attention to the classes involved and the flow of execution. When your team implements the logout use case next, your code will need to have a very similar structure.
#### ViA Category
1. Sign Up / Log In
2. If you wish to diplay events by different categories, click the category drop down
3. Change it to the category you want

To better understand how the view gets updated, your team may find it useful to review the [Extra Advice about the Presenters, Views, and ViewModels](#extra-advice-about-the-presenters-views-and-viewmodels) section at the end of this README.
#### ViA Distance/Datetime/Name
1. Sign Up / Log In
2. If you wish to diplay events by Distance/Datetime/Name, click the Distance drop down which is Distance default
3. Change to the events which you want these to be sorted by

## Task 2: Implementing the Logout Use Case
#### ViA Calender
1. Sign Up / Log In
2. Click on the calender button at the left side of the dashboard
3. You will see all the events displayed in a calendar view

Currently, you'll notice that the "Log Out" button in the `LoggedInView` still doesn't actually log you out of the program. Let's fix this.
**Example Searches:**
- `Raptors` → Find Toronto Raptors basketball games
- `Concert` → Find all concerts in your area

We have created all the classes for your team, but some of the code is missing. **As a team, your task is to fill in the missing code so that the logout use case is functional.**
#### Changing Search Location
The default search location is Toronto, ON. To change it:

> The next part of the readme describes how your team will do this.

Your team will know when you are done when:

- Clicking the "Log Out" button takes the user back to the Login View when you use the program.
- On the Login View, the username of the logged-out user is filled in.
- The provided `LogoutInteractorTest` test passes.

### Task 2.1: Dividing up the work

There are `TODO` comments left in the files.

> Recall that you can use the TODO tool window to conveniently pull up a complete list.

Once all TODOs are complete, the "Log Out" button _should_ work!

**As a team, split up the TODOs (see below) between the members of your team.**

> Optionally, your team can make GitHub Issues and assign them to each team member.

Make sure that each member has at least one TODO that they will be responsible for completing.
If your team prefers to work in pairs, that is fine too.

The TODOs are summarized below (by file) to help your team decide how to split them up:

---

- `Main.java` (tip: look at how other use cases have been added)
-[ ] TODO: add the logout use case to the app

---

- `LoggedInView.java` (tip: refer to the other views for similar code)
-[ ] TODO: save the logout controller in the instance variable.
-[ ] TODO: execute the logout use case through the Controller

---

- `LogoutController.java` (tip: refer to the other controllers for similar code)
-[ ] TODO: Save the interactor in the instance variable.
-[ ] TODO: run the use case interactor for the logout use case

> Note: there is no input data necessary for this use case.

---

- `LogoutInteractor.java` (tip: refer to `ChangePasswordInteractor.java` for similar code)
-[ ] TODO: save the DAO and Presenter in the instance variables.
-[ ] TODO: implement the logic of the Logout Use Case

> Note: there is no input data necessary for this use case.

---

- `LogoutPresenter.java` (tip: refer to `SignupPresenter.java` for similar code)
-[ ] TODO: assign to the three instance variables.
-[ ] TODO: have prepareSuccessView update the LoggedInState
-[ ] TODO: have prepareSuccessView update the LoginState

---

### Task 2.2: Complete your TODOs!
With the work divided up, your team should complete the TODOs through a sequence of PRs.

1. Make a branch for your work.

> Make sure that you switch to your new branch!

2. Complete your assigned TODO and make a pull request on GitHub. In your pull request,
briefly describe what your TODO was and how you implemented it. If you aren't sure
about part of it, include this in your pull request so that everyone knows what to look
for when reviewing — or you can of course discuss with your team before making your
pull request.

3. Review all pull requests to ensure each TODO is correctly implemented.

4. Once all TODOs are completed, your team should debug as needed to ensure the
correctness of the code. Setting a breakpoint where the logout use case
interactor starts its work will likely be a great place to start when debugging.

And that's it; your team should now have a working logout use case!

**Demo your working code to your TA to earn credit.**

---

# Extra Advice about the Presenters, Views, and ViewModels

One of the trickiest parts of the code will be the flow of information between these pieces of the program. Below briefly explains how these pieces fit together and work in the context of the login use case.

## ViewModels and States

In the design of this program, `ViewModel` is written using generics to allow
for different "state" objects to be stored. For a `LoginViewModel`, the state is an instance of class `LoginState`. Each state object will just contain a basic constructor, getters, and setters to store the data of the view model.

## A View and its ViewModel

In the constructor of `LoginView`, the following line of code connects this instance of `LoginView` to its associated `LoginViewModel`:

```java
this.loginViewModel.addPropertyChangeListener(this);
```

This should remind you of the code we write when adding an action listener to a button. The code is following the same structure.

> We'll talk more about this "pattern" of _events_ and _listeners_ in our next module.

When the presenter updates the view model later, an event will be triggered — resulting in the view's `propertyChange` method getting called, with a `PropertyChangeEvent` object being passed through as the argument to the call.

For example, the `LoginView.propertyChange` method looks like:

```java
public void propertyChange(PropertyChangeEvent evt) {
final LoginState state = (LoginState) evt.getNewValue();
setFields(state);
usernameErrorField.setText(state.getLoginError());
}
```

The `LoginView` gets the `LoginState` object stored in the `LoginViewModel` and updates itself with that information.

## A Presenter and its ViewModel(s)

A presenter may have one or more view models associated with it. For example, the login use case's presenter has a reference to a `LoginViewModel` and a `LoggedInViewModel`, since it will need to update both view models. Additionally, our implementation makes use of a `ViewManager` and `ViewManagerModel` to keep track of which view
the user should currently see.

Let's take a look at the `LoginPresenter.prepareSuccessView` method as an example:

```java
public void prepareSuccessView(LoginOutputData response) {
// On success, update the loggedInViewModel's state
final LoggedInState loggedInState = loggedInViewModel.getState();
loggedInState.setUsername(response.getUsername());
this.loggedInViewModel.firePropertyChanged();

// and clear everything from the LoginViewModel's state
this.loginViewModel.setState(new LoginState());
this.loginViewModel.firePropertyChanged();

// switch to the logged in view
this.viewManagerModel.setState(loggedInViewModel.getViewName());
this.viewManagerModel.firePropertyChanged();
}
```

The first part of the code updates the view model for the logged-in view so that the newly logged-in username will be displayed. Once the state is updated, the `firePropertyChanged` method is called, which is what will trigger the call to the view's `propertyChange` method which will update the view based on the updated view model.

This can be visualized as a sequence diagram as follows:

> Note: this diagram has been simplified to focus on the high-level flow of information; the actual stack trace includes some additional intermediate calls which you can see if you step through the code in the debugger or manually click through the code.

![sequence diagram of the LoginPresenter code](images/login_presenter_sequence_diagram.png)

We then do the same, but for the login view model whose state we want to clear.

Lastly, we update the state of the `viewManagerModel`, and alert the viewManager that it should switch to displaying the logged-in view.

> Setting a breakpoint in the code and stepping through can help you see how the information flows through the system. Pay attention to the contents of the call stack to help you track where you are in the execution of the use case.

## The ViewManager

This class may stand out as a bit unclear about how it fits into our architecture, as it isn't in the CA Engine diagram at all. Remember that the CA Engine is representing a single use case in our program. Once our program has _multiple_ use cases, we naturally need some kind of additional code to connect them together. As we have seen, one use case can lead to a change in which view is presented to the user. To facilitate this, our implementation used a `ViewManager` and associated `ViewManagerModel` to take care of this switching for us. The state of a `ViewManagerModel` object is simply a string that indicates the name of the currently visible view (`JPanel` in this implementation). The `ViewManager` uses a `CardLayout` to conveniently display only the currently active view at a given time.

When the `ViewManager` is alerted of a change to its associated `ViewManagerModel`, its `propertyChange` method is executed:

```java
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getPropertyName().equals("state")) {
final String viewModelName = (String) evt.getNewValue();
cardLayout.show(views, viewModelName);
}
}
```

This code will update the application to display the view corresponding to the `viewModelName` string.

> In the `AppBuilder` code, you can see how the views are originally added to the `cardLayout`.

> Thought Question: Can you think of any alternatives to our `ViewManager` implementation for managing multiple views?

---
13 changes: 13 additions & 0 deletions events_saved/demo_user_events.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
[{
"imageUrl": "https://via.placeholder.com/500x700",
"name": "Toronto Raptors vs Los Angeles Lakers",
"description": "An epic showdown between two NBA powerhouses. Watch the Raptors take on LeBron James and the Lakers in what promises to be an unforgettable night of basketball action!",
"startTime": "2025-12-15T19:30",
"location": {
"address": "Scotiabank Arena, 40 Bay St, Toronto, ON",
"latitude": 43.6435,
"longitude": -79.3791
},
"id": "event-1",
"category": "SPORTS"
}]
Loading