A aplicação Shows & Events Chelas Application (SECA) fornece uma API e um Website com operações que envolvem pesquisa de eventos e utilização de grupos para organizar ditos eventos.
Esta wiki visa descrever a aplicação desenvolvida, bem como fornecer instruções de utilização da mesma. Será também incluída nesta wiki a documentação da API para uso.
O componente servidor, representado por “seca-server”, é responsável pela interação entre diferentes módulos, componentes e serviços externos. O servidor utiliza um conjunto de módulos Node.js, incluindo Express, Express-session, Handlebars (hbs) e Passport, que contribuem coletivamente para o funcionamento do site e da API. É também responsável pela criação das rotas que são utilizadas pelo site e pela api
Os componentes seca-web-site e seca-web-api são responsáveis pela implementação das rotas utilizadas no servidor, para o site e a api respetivamente.
A API, representada por "seca-web-api", é responsável pela implementação das rotas da API que fornecem operações de grupos e pesquisa de eventos. Esta API processa os pedidos dos utilizadores, gere a autenticação do utilizador e a interação com os serviços da aplicação.
O site, representado por "seca-web-site", é responsável pela implementação das rotas que permitem ao utilizador utilizar um browser, continuando a ter acesso a todas as funcionalidades fornecidas pela API.
O componente "seca-services" inclui vários serviços responsáveis pelo processamento de pedidos do utilizador, abrangendo a criação e gestão de dados de utilizadores, grupos e a integração com fontes externas de dados como a API do TicketMaster.
O cliente web, designado como "WebClient", é a interface do utilizador que interage com o a aplicação SECA, permitindo aos utilizadores ter acesso às funcionalidades oferecidas pela aplicação.
"seca-data-elastic" gere os dados do ElasticSearch. Este garante o armazenamento das informações dos utilizadores e grupos e permite a gestão dos mesmos.
"tm-events-data" faz a ligação dos dados externos da API TicketMaster com a aplicação. Esta integração permite os pedidos à API TicketMaster com base nos parametros definidos pelo utlizador, de forma a obter informação acerca de eventos.
Para armazenamento de dados foram criados os seguintes índices:
-
ID - Identificador único do grupo
-
userID - Utilizador a que o grupo pertence (inclui as propriedades ID, name, e token do utilizador)
-
name - Nome do grupo
-
description : Descrição do grupo
-
ID - Identificador único do utilizador
-
name - Nome do utilizador
-
token - Token do utilizador para autorização
-
hash - Palavra-passe do utilizador encriptada
Cada utilizador pode ter vários grupos e cada grupo pertence a apenas um utilizador (1:N).
Um grupo pode ter vários eventos, com a exceção de que não pode ter eventos repetidos.
- Deve ter Node.js instalado na sua máquina
- Deve ter ElasticSearch instalado na sua máquina
- Executar o comando
npm install
em linha de comandos no diretório da aplicação para instalar todas as dependências - Executar ElasticSearch localmente no porto 9200
- Executar o comando
node seca-server.mjs
em linha de comandos no diretório da aplicação
Para utilizar o site, abrir um browser e inserir o url http://localhost:1904/site/home
.
Para utilizar a API, utilizar Postman ou outra ferramenta que permita realizar pedidos HTTP à API.
Para executar os testes, executar o comando npm test
Event Operations do not require authorization
Search events by name
By passing in a name, you can search for events
Name | In | Type | Required | Description |
---|---|---|---|---|
name | query | string | true | The name to search for |
s | query | integer | false | number of events to return |
p | query | integer | false | the page number of the results to show |
Status | Meaning | Description |
---|---|---|
200 | OK | Returns events that match the name, with the specified amount of results and page number |
400 | Bad Request | Invalid Request because of a missing Parameter, invalid body content or lack of authorization |
200
[
{
"id": "Z7r9jZ1A7e9ZU",
"name": "Washington Huskies Football vs. Weber State Wildcats Football",
"genre": "Football",
"segment": "Sports"
},
{
"id": "Z7r9jZ1A7e9ZM",
"name": "Washington Huskies Football vs. Eastern Michigan Eagles Football",
"genre": "Football",
"segment": "Sports"
},
{
"id": "Z7r9jZ1A77v4N",
"name": "Rutgers Scarlet Knights Football vs. Washington Huskies Football",
"genre": "Football",
"segment": "Sports"
}
]
Javascript Example
const headers = {
'Accept':'application/json'
};
fetch('http://localhost:1904/events?name=string',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
Search most popular eventss
By passing in arguments, you can search for the most popular events
Name | In | Type | Required | Description |
---|---|---|---|---|
s | query | integer | false | number of events to return |
p | query | integer | false | the page number of the results to show |
Status | Meaning | Description |
---|---|---|
200 | OK | Returns the list of most popular events |
400 | Bad Request | Invalid Request because of a missing Parameter, invalid body content or lack of authorization |
Javascript Example
const headers = {
'Accept':'application/json'
};
fetch('http://localhost:1904/events/popular',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
Get more details of specific event
Name | In | Type | Required | Description |
---|---|---|---|---|
id | query | string | false | The event id |
Status | Meaning | Description |
---|---|---|
200 | OK | Event details returned |
400 | Bad Request | Invalid Request because of a missing Parameter |
200
{
"id": "Z7r9jZ1A7e9ZU",
"name": "Washington Huskies Football vs. Weber State Wildcats Football",
"genre": "Football",
"segment": "Sports",
"subGenre": "College",
"image": "https://s1.ticketm.net/dam/a/24a/6bd9bf77-cfc8-4922-aad8-f1687834d24a_1257311_TABLET_LANDSCAPE_16_9.jpg",
"salesStartTime": "1900-01-01T18:00:00Z",
"salesEndTime": "2024-09-01T06:59:20Z"
}
Javascript Example
const headers = {
'Accept':'application/json'
};
fetch('http://localhost:1904/events/Z7r9jZ1A7e9ZU',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
Creates a user
Body parameter
{
"username": "António Paulino"
}
Name | In | Type | Required | Description |
---|---|---|---|---|
username | body | string | true | New user name |
Status | Meaning | Description |
---|---|---|
201 | Created | New user created |
400 | Bad Request | Invalid Request because of a missing Parameter, invalid body content or lack of authorization |
201
{
"token":"497f6eca-6276-4993-bfeb-53cbbbba6f08"
}
Javascript Example
const inputBody = {
"username": "António Paulino"
};
const headers = {
'Content-Type':'application/json',
'Accept':'application/json'
};
fetch('http://localhost:1904/users',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
To perform group operations, you must be authenticated via HTTP bearerAuth
Gets all groups belonging to a user
Name | In | Type | Required | Description |
---|---|---|---|---|
Authorization | header | string(uuid) | true | user token for identification |
Status | Meaning | Description |
---|---|---|
200 | OK | Groups returned |
400 | Bad Request | Invalid Request because of a missing Parameter, invalid body content or lack of authorization |
401 | Unauthorized | No Authorization |
404 | Not Found | Resource not found |
JavaScript Example
const headers = {
'Accept':'application/json',
'Authorization':'497f6eca-6276-4993-bfeb-53cbbbba6f08'
};
fetch('http://localhost:1904/groups',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
Create Group
Add group to list of groups belonging to user
Body parameter
{
"name": "Football group",
"description": "Group that contains football events"
}
Name | In | Type | Required | Description |
---|---|---|---|---|
Authorization | header | string(uuid) | true | user token for identification |
name | body | string | true | Group name |
description | body | string | true | Group description |
Status | Meaning | Description |
---|---|---|
201 | Created | Group created |
400 | Bad Request | Invalid Request because of a missing Parameter, invalid body content or lack of authorization |
401 | Unauthorized | No Authorization |
404 | Not Found | Resource not found |
Javascript example
const inputBody = {
"name": "Football group",
"description": "Group that contains football events"
};
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'497f6eca-6276-4993-bfeb-53cbbbba6f08'
};
fetch('http://localhost:1904/groups',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
Get a specific group given its id
Name | In | Type | Required | Description |
---|---|---|---|---|
Authorization | header | string(uuid) | true | user token for identification |
id | path | string(uuid) | true | ID of group to get |
Status | Meaning | Description |
---|---|---|
200 | OK | Group returned |
400 | Bad Request | Invalid Request because of a missing Parameter, invalid body content or lack of authorization |
401 | Unauthorized | No Authorization |
404 | Not Found | Resource not found |
200
{
"id": "a5ab7d81-f7df-4d76-9acf-0d3c0c73649f",
"userID": {
"name": "user 1",
"token": "e5ab7d81-f7df-4d76-9acf-0d3c0c73649f",
"id": "f0sKv4wBUSONURCKVo76"
},
"name": "Test group user 1",
"description": "This is a test group that belongs to user 1",
"events": []
}
Javascript Example
const headers = {
'Accept':'application/json',
'Authorization':'497f6eca-6276-4993-bfeb-53cbbbba6f08'
};
fetch('http://localhost:1904/group/{id}',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
Delete a Group given its id
Name | In | Type | Required | Description |
---|---|---|---|---|
Authorization | header | string(uuid) | true | user token for identification |
id | path | string(uuid) | true | ID of group to delete |
Status | Meaning | Description |
---|---|---|
200 | OK | Group deleted |
400 | Bad Request | Invalid Request because of a missing Parameter, invalid body content or lack of authorization |
401 | Unauthorized | No Authorization |
404 | Not Found | Resource not found |
Javascript Example
const headers = {
'Accept':'application/json',
'Authorization':'497f6eca-6276-4993-bfeb-53cbbbba6f08'
};
fetch('http://localhost:1904/group/{id}',
{
method: 'DELETE',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
Update a group's name and description given its id
Body parameter
{
"name": "Football group",
"description": "Group that contains football events"
}
Name | In | Type | Required | Description |
---|---|---|---|---|
Authorization | header | string(uuid) | true | user token for identification |
id | path | string(uuid) | true | ID of group to update |
name | body | string | true | New group name |
description | body | string | true | New group description |
Status | Meaning | Description |
---|---|---|
200 | OK | Group Updated |
400 | Bad Request | Invalid Request because of a missing Parameter, invalid body content or lack of authorization |
401 | Unauthorized | No Authorization |
404 | Not Found | Resource not found |
Javascript Example
const inputBody = {
"name": "Football group",
"description": "Group that contains football events"
};
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'497f6eca-6276-4993-bfeb-53cbbbba6f08'
};
fetch('http://localhost:1904/group/{id}',
{
method: 'PUT',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
Add new event to Group
Body parameter
{
"id": "Z7r9jZ1AdOvFN"
}
Name | In | Type | Required | Description |
---|---|---|---|---|
Authorization | header | string(uuid) | true | user token for identification |
id | path | string(uuid) | true | ID of group to add event |
id | body | string | true | ID of event to add |
Status | Meaning | Description |
---|---|---|
200 | OK | Event added |
400 | Bad Request | Invalid Request because of a missing Parameter, invalid body content or lack of authorization |
401 | Unauthorized | No Authorization |
404 | Not Found | Resource not found |
Javascript Example
const inputBody = {
"id": "Z7r9jZ1AdOvFN"
};
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'497f6eca-6276-4993-bfeb-53cbbbba6f08'
};
fetch('http://localhost:1904/group/{id}/events',
{
method: 'PUT',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
Remove event from group
Name | In | Type | Required | Description |
---|---|---|---|---|
Authorization | header | string(uuid) | true | user token for identification |
groupID | path | string(uuid) | true | ID of group to add event |
eventID | path | string | true | ID of event to remove |
Status | Meaning | Description |
---|---|---|
200 | OK | Event removed |
400 | Bad Request | Invalid Request because of a missing Parameter, invalid body content or lack of authorization |
401 | Unauthorized | No Authorization |
404 | Not Found | Resource not found |
Javascript Example
const headers = {
'Accept':'application/json',
'Authorization':'497f6eca-6276-4993-bfeb-53cbbbba6f08'
};
fetch('http://localhost:1904/group/{groupID}/events/${eventID}',
{
method: 'DELETE',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});