Skip to content

Commit eafc7ac

Browse files
committed
Added project
1 parent 383cfc1 commit eafc7ac

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+31890
-1
lines changed

README.TXT

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
To execute ciborg-server in the regular way just execute :
2+
3+
`npm start`
4+
5+
If you wish to run ciborg-server using mock data execute it in the following way :
6+
7+
`npm run start-test`
8+
9+
If you don't define ciborg-server execution like in the previous example, ciborg-server will execute the regular way.

README.md

+34-1
Original file line numberDiff line numberDiff line change
@@ -1 +1,34 @@
1-
# BoardGames
1+
## Board Games API and Web Application
2+
3+
The Board Games Web Application was built for a project in the Programming in the Internet course in ISEL.
4+
Developed this project with [Rui](https://github.com/RuiPacas) and [Margarida](https://github.com/MargaridaNunes) during my course.
5+
6+
Manage your own board games groups, edited them, create your own user and more.
7+
8+
Web API built using Node Runtime enviromment, express module, request-promise module, async/await, passport.
9+
10+
Web Application built using HTML, CSS, BootStrap Framework, Handlebars, Fetch API and Webpack.
11+
12+
The API Documentation can be found [here](https://github.com/RodrasSilva/BoardGames/wiki/Board-Games-API-Documentation).
13+
14+
### How to run the App
15+
16+
To run the application you will need :
17+
- Elasticsearch (https://www.elastic.co/downloads/)
18+
- Webpack
19+
- webpack : npm install -g webpack
20+
- webpack-cli : npm install -g webpack-cli
21+
22+
Follow these steps to run the app :
23+
24+
1. Run ElasticSearch
25+
2. Open an terminal window in the project directory
26+
3. Run : `curl -X DELETE "localhost:9200/groups?pretty"` in the command line
27+
4. Run : `curl -X DELETE "localhost:9200/users?pretty"` in the command line
28+
5. Run : `npm install`
29+
6. Run : `npm start` ou `npm run start`
30+
7. Open another terminal in the folder `.../{projectDirectory}/app`
31+
8. Run : `npm install`
32+
9. Run : `webpack -w`
33+
34+
Both the Server and Client are running in the port 8080

app/entry.js

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
'use strict';
2+
require('./node_modules/bootstrap/dist/css/bootstrap.css')
3+
require('jquery')
4+
require('./node_modules/bootstrap/dist/js/bootstrap.js')
5+
require('./js/state-router')

app/index.html

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<link rel="icon" href="https://www.boardgameatlas.com/imgs/5cc-api-logo.png">
5+
<title>Chelas Internet Board Games</title>
6+
</head>
7+
<body>
8+
<nav class="navbar navbar-expand-lg navbar-light bg-light">
9+
10+
<a class="navbar-brand" href="#home">
11+
Chelas Internet Board Games
12+
<img src="data:image/jpeg;base64,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"
13+
width ="20" height="20">
14+
</a>
15+
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNavAltMarkup" aria-controls="navbarNavAltMarkup" aria-expanded="false" aria-label="Toggle navigation">
16+
<span class="navbar-toggler-icon"></span>
17+
</button>
18+
<div class="collapse navbar-collapse" id="navbarNavAltMarkup">
19+
<div class="navbar-nav" id = "navBarResults">
20+
21+
</div>
22+
</div>
23+
</nav>
24+
<div id ="ciborg-alert"></div>
25+
<div id="results"></div>
26+
</body>
27+
</html>
+112
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
const data = require('../model/ciborg-data')
2+
3+
function updateState(routeManager){
4+
return data.isSessionActive()
5+
.then(session => {
6+
routeManager.context.login = session
7+
})
8+
}
9+
10+
11+
module.exports = {
12+
home: async function (routeManager) {
13+
return updateState(routeManager).then(()=>{})
14+
},
15+
games: async function (routeManager) {
16+
return updateState(routeManager).then(()=>data.getPopularGames().then( data => {
17+
data.games.map( game => {
18+
game.description = game.description.slice(0,100) + "..." // Description too long
19+
return game
20+
})
21+
return data;
22+
}))
23+
},
24+
searchGamesWithName: async function (routeManager, name, ) {
25+
return updateState(routeManager).then(()=>data.getSpecificGameWithName(name)
26+
.then(data => {
27+
data.games.map( game => {
28+
game.description = game.description.slice(0,100) + "..." // Description too long
29+
return game
30+
})
31+
return data;
32+
}))
33+
},
34+
groups: async function (routeManager) {
35+
return updateState(routeManager).then(()=> data.getGroups()
36+
.then( data => {
37+
data.groups = data.groups.sort((g1,g2) => g1.name>g2.name ? 1 : g1.name<g2.name ? -1 : 0 )
38+
return data
39+
})
40+
)
41+
},
42+
about: async function (routeManager) {
43+
return updateState(routeManager).then(()=>{})
44+
},
45+
specificGroup: async function (routeManager, id) {
46+
return updateState(routeManager).then(()=>data.getSpecificGroupWithId(id).then(
47+
data=>{
48+
data.data.games.map( game => {
49+
game.description = game.description.slice(0,100) + "..." // Description too long
50+
return game
51+
})
52+
return data
53+
}
54+
))
55+
},
56+
createGroup: async function (routeManager, groupInfo) {
57+
return updateState(routeManager).then(()=>data.postGroup(groupInfo))
58+
},
59+
addGameToGroup: async function (routeManager, gameId) {
60+
return updateState(routeManager).then(()=>data.getGroups()
61+
.then((groups) => {
62+
groups.groups = groups.groups.filter( group => !group.games.includes(gameId))
63+
groups.groups = groups.groups.sort((g1,g2) => g1.name>g2.name ? 1 : g1.name<g2.name ? -1 : 0 )
64+
return { groups, gameId }
65+
}))
66+
},
67+
putGameIntoGroup: async function (routeManager, gameGroupInfo) {
68+
return updateState(routeManager).then(()=>data.putGameIntoGroup(gameGroupInfo))
69+
},
70+
editGroup: async function (routeManager, groupInfo) {
71+
return updateState(routeManager).then(()=>data.editGroup(groupInfo))
72+
},
73+
deleteGroup: async function (routeManager, groupId) {
74+
return updateState(routeManager).then(()=>data.deleteGroup(groupId))
75+
},
76+
deleteGroupGame: async function (routeManager, gameGroupInfo) {
77+
return updateState(routeManager).then(()=>data.deleteGroupGame(gameGroupInfo))
78+
},
79+
groupGamesBetweenTime: async function (routeManager, groupId, queryString) {
80+
return updateState(routeManager).then(()=>data.groupGamesBetweenTime(queryString,groupId))
81+
},
82+
signUp: async function (routeManager) {
83+
return updateState(routeManager).then(()=>{})
84+
},
85+
createUser: async function (routeManager, userInfo) {
86+
return updateState(routeManager).then(()=>data.createUser(userInfo))
87+
},
88+
userLogin: async function (routeManager) {
89+
return updateState(routeManager).then(()=>{})
90+
},
91+
login: async function (routeManager, loginInfo) {
92+
const username = loginInfo.username
93+
const password = loginInfo.password
94+
if(!routeManager.context.login){
95+
return data.login(username, password)
96+
.then( (data) => {
97+
routeManager.context.login = true
98+
routeManager.context.username = username
99+
return data
100+
})
101+
}
102+
},
103+
logout: async function (routeManager) {
104+
return updateState(routeManager)
105+
.then(() => data.logout())
106+
.then( (data) => {
107+
routeManager.context.login = false
108+
routeManager.context.username = undefined
109+
return data
110+
})
111+
}
112+
}

app/js/model/ciborg-data.js

+108
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
2+
function fetchResponse(uri, options, sucessStatusCode) {
3+
return fetch(uri, options
4+
).then(response => {
5+
return response.json()
6+
.then(parsedBody => {
7+
if (response.status == sucessStatusCode) return parsedBody
8+
parsedBody.statusCode = response.status;
9+
throw parsedBody
10+
})
11+
})
12+
}
13+
14+
function buildOptions(method, body) {
15+
const toReturn = {}
16+
toReturn.method = method
17+
toReturn.body = JSON.stringify(body)
18+
toReturn.headers = { 'Accept': 'application/json', 'Content-Type': 'application/json' }
19+
return toReturn
20+
}
21+
22+
function CiborgApiUris() {
23+
const baseUri = "http://localhost:8080/ciborg/api/"
24+
const baseUriAuth = `${baseUri}auth/`
25+
26+
this.getPopularGamesUri = () => `${baseUri}games`
27+
this.getSpecificGameWithNameUri = (name) => `${baseUri}games/${name}`
28+
this.getGroupsUri = () => `${baseUriAuth}groups`
29+
this.getSpecificGroupWithIdUri = (id) => `${baseUriAuth}groups/${id}`
30+
this.putGameIntoGroupUri = (groupId) => `${baseUriAuth}groups/${groupId}/games`
31+
this.deleteGroupGameUri = (groupId, gameId) => `${baseUriAuth}groups/${groupId}/games/${gameId}`
32+
this.groupGamesBetweenTimeUri = (queryString, groupId) => `${baseUriAuth}groups/${groupId}/games${queryString}`
33+
this.createUser = () => `${baseUri}users`
34+
this.login = () => `${baseUri}login`
35+
this.logout = () => `${baseUriAuth}logout`
36+
this.session = () => `${baseUri}session`
37+
}
38+
39+
const apiUris = new CiborgApiUris();
40+
41+
module.exports = {
42+
getPopularGames: function () {
43+
return fetchResponse(apiUris.getPopularGamesUri(), {}, 200)
44+
},
45+
getSpecificGameWithName: function (name) {
46+
return fetchResponse(apiUris.getSpecificGameWithNameUri(name), {}, 200)
47+
},
48+
getGroups: function () {
49+
return fetchResponse(apiUris.getGroupsUri(), {}, 200)
50+
},
51+
getSpecificGroupWithId: function (id) {
52+
return fetchResponse(apiUris.getSpecificGroupWithIdUri(id), {}, 200)
53+
.then(data => { return { data, groupId: id } })
54+
},
55+
postGroup: function (groupsInfo) {
56+
const options = buildOptions("POST", { name: groupsInfo.name, description: groupsInfo.description })
57+
return fetchResponse(apiUris.getGroupsUri(), options, 201);
58+
},
59+
putGameIntoGroup: function (gameGroupInfo) {
60+
const options = buildOptions("PUT", { idGame: gameGroupInfo.gameId })
61+
return fetchResponse(apiUris.putGameIntoGroupUri(gameGroupInfo.groupId),
62+
options, 201).then(data => gameGroupInfo)
63+
64+
},
65+
editGroup: function (groupInfo) {
66+
const options = buildOptions("PUT", { name: groupInfo.name, description: groupInfo.description })
67+
return fetchResponse(apiUris.getSpecificGroupWithIdUri(groupInfo.groupId),
68+
options, 200)
69+
.then(data => groupInfo)
70+
},
71+
deleteGroup: function (groupId) {
72+
const options = buildOptions("DELETE", {})
73+
return fetchResponse(apiUris.getSpecificGroupWithIdUri(groupId), options, 200)
74+
},
75+
deleteGroupGame: function (gameGroupInfo) {
76+
const options = buildOptions("DELETE", {})
77+
return fetchResponse(apiUris.deleteGroupGameUri(gameGroupInfo.groupId, gameGroupInfo.gameId),
78+
options, 200
79+
).then(data => gameGroupInfo)
80+
},
81+
groupGamesBetweenTime: function (queryString,groupId) {
82+
return fetchResponse(apiUris.groupGamesBetweenTimeUri(queryString, groupId),
83+
buildOptions("GET"), 200)
84+
.then(games => fetchResponse(apiUris.getSpecificGroupWithIdUri(groupId), buildOptions("GET"), 200)
85+
.then(r => {
86+
r.games = games.games
87+
return r
88+
})
89+
).then(data => { return { data, groupId } })
90+
},
91+
createUser: function (userInfo) {
92+
const options = buildOptions("POST", { username: userInfo.username, password: userInfo.password })
93+
return fetchResponse(apiUris.createUser(), options, 201)
94+
},
95+
login: function (username, password) {
96+
const options = buildOptions("POST", { username, password })
97+
return fetchResponse(apiUris.login(), options, 200)
98+
99+
},
100+
logout: function () {
101+
const options = buildOptions("PUT")
102+
return fetchResponse(apiUris.logout(), options, 200)
103+
.then( data => data )
104+
},
105+
isSessionActive : function () {
106+
return fetchResponse(apiUris.session(),{},200).then(data => data.status )
107+
}
108+
}

0 commit comments

Comments
 (0)