diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..dbe9c82 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.vscode/ \ No newline at end of file diff --git a/assets/src/example.js b/assets/src/example.js index deb9631..f31ea75 100644 --- a/assets/src/example.js +++ b/assets/src/example.js @@ -1,7 +1,7 @@ var exampleLog = () => { - console.log('This is an example log message.'); -} + console.log("This is an example log message."); +}; var aFunctionCall = () => { - alert('You have clicked the primary button!'); -} \ No newline at end of file + alert("You have clicked the primary button!"); +}; diff --git a/assets/src/service/config-service.js b/assets/src/service/config-service.js new file mode 100644 index 0000000..c15fcfa --- /dev/null +++ b/assets/src/service/config-service.js @@ -0,0 +1,5 @@ +const config = { + API_BASE_URL: "https://316214-1.web.fhgr.education/10001/api/" +} + +window.config = config; \ No newline at end of file diff --git a/assets/src/service/leaderboard-service.js b/assets/src/service/leaderboard-service.js new file mode 100644 index 0000000..ccab26d --- /dev/null +++ b/assets/src/service/leaderboard-service.js @@ -0,0 +1,29 @@ +class LeaderboardService { + constructor(config) { + this.baseUrl = config.API_BASE_URL; + this.urlTail = "leaderboard"; + } + + async getLeaderboard(offset, limit) { + const response = await fetch( + `${this.baseUrl}${this.urlTail}?offset=${offset}&limit=${limit}`, + { + method: "GET", + }, + ); + let body = null; + try { + body = await response.json(); + } catch { + console.error("Error in getLeaderboard"); + } + + return { + status: response.status, + ok: response.ok, + body: body, + }; + } +} + +window.LeaderboardService = LeaderboardService; diff --git a/assets/src/service/score-service.js b/assets/src/service/score-service.js new file mode 100644 index 0000000..4204943 --- /dev/null +++ b/assets/src/service/score-service.js @@ -0,0 +1,79 @@ +class ScoreService { + constructor(config) { + this.baseUrl = config.API_BASE_URL; + this.urlTail = "score"; + } + + async getScoreByName(username) { + // Note: When user does not exist, we get a 200 with empty array, not a 404 + const response = await fetch(`${this.baseUrl}${this.urlTail}/${username}`, { + method: "GET", + }); + let body = null; + try { + body = await response.json(); + } catch { + console.error("Error in getScoreByName"); + } + + return { + status: response.status, + ok: response.ok, + body: body, + }; + } + + async postScore(username, password, score, time, text, userWrittenText) { + const response = await fetch(`${this.baseUrl}${this.urlTail}`, { + method: "POST", + headers: { + "Content-Type": "application/json", + "X-Username": username, + "X-Password": password, + }, + body: JSON.stringify({ + score: score, + time: time, + text: text, + userWrittenText: userWrittenText, + }), + }); + + let body = null; + try { + body = await response.json(); + } catch { + console.error("Error in postScore"); + } + + return { + status: response.status, + ok: response.ok, + body: body, + }; + } + + async deleteScore(username, password, scoreId) { + const response = await fetch(`${this.baseUrl}${this.urlTail}/${scoreId}`, { + method: "DELETE", + headers: { + "X-Username": username, + "X-Password": password, + }, + }); + let body = null; + try { + body = await response.json(); + } catch { + console.error("Error in deleteScore"); + } + + return { + status: response.status, + ok: response.ok, + body: body, + }; + } +} + +window.ScoreService = ScoreService; diff --git a/assets/src/service/user-service.js b/assets/src/service/user-service.js new file mode 100644 index 0000000..6c730c4 --- /dev/null +++ b/assets/src/service/user-service.js @@ -0,0 +1,77 @@ +class UserService { + constructor(config) { + this.baseUrl = config.API_BASE_URL; + this.urlTail = "user"; + } + + async getUser(username, password) { + const response = await fetch(`${this.baseUrl}${this.urlTail}`, { + method: "GET", + headers: { + "X-Username": username, + "X-Password": password, + }, + }); + let body = null; + try { + body = await response.json(); + } catch { + console.error("Error in getUser"); + } + + return { + status: response.status, + ok: response.ok, + body: body, + }; + } + + async deleteUser(username, password) { + const response = await fetch(`${this.baseUrl}${this.urlTail}`, { + method: "DELETE", + headers: { + "X-Username": username, + "X-Password": password, + }, + }); + let body = null; + try { + body = await response.json(); + } catch { + console.error("Error in deleteUser"); + } + + return { + status: response.status, + ok: response.ok, + body: body, + }; + } + + async postUser(username) { + const response = await fetch(`${this.baseUrl}${this.urlTail}`, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + username: username, + }), + }); + + let body = null; + try { + body = await response.json(); + } catch { + console.error("Error in postUser"); + } + + return { + status: response.status, + ok: response.ok, + body: body, + }; + } +} + +window.UserService = UserService; diff --git a/assets/src/sites/exampleAPI.js b/assets/src/sites/exampleAPI.js new file mode 100644 index 0000000..d6bc885 --- /dev/null +++ b/assets/src/sites/exampleAPI.js @@ -0,0 +1,122 @@ +const userService = new UserService(config); +const scoreService = new ScoreService(config); +const leaderboardService = new LeaderboardService(config); + +document.addEventListener("DOMContentLoaded", () => { + const usernameForm = document.getElementById("usernameForm"); + const loginForm = document.getElementById("loginForm"); + + const postFormScore = document.getElementById("postScoreForm"); + const getScoreForm = document.getElementById("getScoreForm"); + const deleteScoreForm = document.getElementById("deleteScoreForm"); + const getLeaderboardForm = document.getElementById("getLeaderboardForm"); + + usernameForm.addEventListener("submit", handleUsernameSubmit); + loginForm.addEventListener("submit", handleLoginSubmit); + postFormScore.addEventListener("submit", handlePostScoreSubmit); + getScoreForm.addEventListener("submit", handleGetScoreSubmit); + deleteScoreForm.addEventListener("submit", handleDeleteScoreSubmit); + getLeaderboardForm.addEventListener("submit", handleGetLeaderboardSubmit); +}); + +async function handleUsernameSubmit(event) { + event.preventDefault(); + + const username = document.getElementById("desiredUsername").value; + + console.log("Username form submitted:", username); + + const result = userService.postUser(username); + console.log("API response:", result); +} + +async function handleLoginSubmit(event) { + event.preventDefault(); + + const username = document.getElementById("username").value; + const password = document.getElementById("password").value; + + console.log("Login form submitted:", username, password); + + const result = await userService.getUser(username, password); + console.log("API response:", result); +} + +async function handleDeleteUserSubmit(event) { + event.preventDefault(); + + const username = document.getElementById("username").value; + const password = document.getElementById("password").value; + + console.log("Delete User form submitted:", username, password); + + const result = await userService.deleteUser(username, password); + console.log("API response:", result); +} + +async function handlePostScoreSubmit(event) { + event.preventDefault(); + + const username = document.getElementById("username").value; + const password = document.getElementById("password").value; + const score = document.getElementById("score").value; + const time = document.getElementById("time").value; + const text = document.getElementById("text").value; + const userWrittenText = document.getElementById("userWrittenText").value; + + console.log( + "Post Score form submitted:", + username, + password, + score, + time, + text, + userWrittenText, + ); + + const result = await scoreService.postScore( + username, + password, + score, + time, + text, + userWrittenText, + ); + console.log("API response:", result); +} + +async function handleGetScoreSubmit(event) { + event.preventDefault(); + + const username = document.getElementById("scoreUsername").value; + + console.log("Get Score form submitted:", username); + + const result = await scoreService.getScoreByName(username); + console.log("API response:", result); +} + +async function handleDeleteScoreSubmit(event) { + event.preventDefault(); + + const username = document.getElementById("username").value; + const password = document.getElementById("password").value; + const scoreId = document.getElementById("scoreId").value; + + console.log("Delete Score form submitted:", username, password, scoreId); + + const result = await scoreService.deleteScore(username, password, scoreId); + console.log("API response:", result); +} + +async function handleGetLeaderboardSubmit(event) { + event.preventDefault(); + + const offset = document.getElementById("offset").value; + const limit = document.getElementById("limit").value; + + console.log("Get Leaderboard form submitted:", offset, limit); + + const result = await leaderboardService.getLeaderboard(offset, limit); + console.log("API response:", result); +} diff --git a/exampleAPI.html b/exampleAPI.html new file mode 100644 index 0000000..27d2678 --- /dev/null +++ b/exampleAPI.html @@ -0,0 +1,310 @@ + + +
+