From bc2ca5424950e8ac83a75e6a91d0c51876cdefe8 Mon Sep 17 00:00:00 2001 From: UO288443 Date: Tue, 27 Feb 2024 09:58:46 +0100 Subject: [PATCH 01/18] UML 07 --- docs/images/DeplymentView.svg | 4 ++++ docs/src/07_deployment_view.adoc | 21 +++------------------ 2 files changed, 7 insertions(+), 18 deletions(-) create mode 100644 docs/images/DeplymentView.svg diff --git a/docs/images/DeplymentView.svg b/docs/images/DeplymentView.svg new file mode 100644 index 00000000..3b3d9207 --- /dev/null +++ b/docs/images/DeplymentView.svg @@ -0,0 +1,4 @@ + + + +
User (player)
User...
MongoDB
MongoDB
Singin/Loging Form
Singin/Loging Form
Wikidata
Wikidata
User Service
User Service
Question generator
Question generator
Web app
Web app
User Interface
User Interface
Use
Use
Use
Use
1
1
1
1
1
1
KEY
KEY
componentName
componentName
Component:
Component:
apiName
apiName
Api:
Api:
appName
appName
Aplication:
Aplication:
Use
Use
A
A
B
B
A use b
A use b
1
1
Composition
Composition
Association
Association
Text is not SVG - cannot display
\ No newline at end of file diff --git a/docs/src/07_deployment_view.adoc b/docs/src/07_deployment_view.adoc index b5c01034..0f305d1e 100644 --- a/docs/src/07_deployment_view.adoc +++ b/docs/src/07_deployment_view.adoc @@ -45,29 +45,14 @@ See https://docs.arc42.org/section-7/[Deployment View] in the arc42 documentatio === Infrastructure Level 1 [role="arc42help"] -**** -Describe (usually in a combination of diagrams, tables, and text): - -* distribution of a system to multiple locations, environments, computers, processors, .., as well as physical connections between them -* important justifications or motivations for this deployment structure -* quality and/or performance features of this infrastructure -* mapping of software artifacts to elements of this infrastructure -For multiple environments or alternative deployments please copy and adapt this section of arc42 for all relevant environments. -**** -_****_ +_**Deployment diagram**_ +image::DeploymentView.svg["Deployment View"] Motivation:: -__ - -Quality and/or Performance Features:: - -__ - -Mapping of Building Blocks to Infrastructure:: -__ +This diagram shows us the process the application goes through when it is deployed. === Infrastructure Level 2 From b5c0335d711736433edc8d12b576f8ad2c907213 Mon Sep 17 00:00:00 2001 From: UO288443 Date: Tue, 27 Feb 2024 10:03:02 +0100 Subject: [PATCH 02/18] 2 --- docs/src/07_deployment_view.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/07_deployment_view.adoc b/docs/src/07_deployment_view.adoc index 0f305d1e..92507d3c 100644 --- a/docs/src/07_deployment_view.adoc +++ b/docs/src/07_deployment_view.adoc @@ -48,7 +48,7 @@ See https://docs.arc42.org/section-7/[Deployment View] in the arc42 documentatio _**Deployment diagram**_ -image::DeploymentView.svg["Deployment View"] +image::DeploymentView.svg[Deployment View] Motivation:: From ab3cb34d81347a6b65a069aab4ce16db021a70d2 Mon Sep 17 00:00:00 2001 From: UO288443 Date: Tue, 27 Feb 2024 10:05:40 +0100 Subject: [PATCH 03/18] UML 7 (creo que bien) --- .../{DeplymentView.svg => DeploymentView.svg} | 0 docs/src/07_deployment_view.adoc | 49 +------------------ 2 files changed, 1 insertion(+), 48 deletions(-) rename docs/images/{DeplymentView.svg => DeploymentView.svg} (100%) diff --git a/docs/images/DeplymentView.svg b/docs/images/DeploymentView.svg similarity index 100% rename from docs/images/DeplymentView.svg rename to docs/images/DeploymentView.svg diff --git a/docs/src/07_deployment_view.adoc b/docs/src/07_deployment_view.adoc index 92507d3c..b28e28f4 100644 --- a/docs/src/07_deployment_view.adoc +++ b/docs/src/07_deployment_view.adoc @@ -3,51 +3,11 @@ ifndef::imagesdir[:imagesdir: ../images] [[section-deployment-view]] -== Deployment View +== Deplyment View -[role="arc42help"] -**** -.Content -The deployment view describes: - - 1. technical infrastructure used to execute your system, with infrastructure elements like geographical locations, environments, computers, processors, channels and net topologies as well as other infrastructure elements and - -2. mapping of (software) building blocks to that infrastructure elements. - -Often systems are executed in different environments, e.g. development environment, test environment, production environment. In such cases you should document all relevant environments. - -Especially document a deployment view if your software is executed as distributed system with more than one computer, processor, server or container or when you design and construct your own hardware processors and chips. - -From a software perspective it is sufficient to capture only those elements of an infrastructure that are needed to show a deployment of your building blocks. Hardware architects can go beyond that and describe an infrastructure to any level of detail they need to capture. - -.Motivation -Software does not run without hardware. -This underlying infrastructure can and will influence a system and/or some -cross-cutting concepts. Therefore, there is a need to know the infrastructure. - -.Form - -Maybe a highest level deployment diagram is already contained in section 3.2. as -technical context with your own infrastructure as ONE black box. In this section one can -zoom into this black box using additional deployment diagrams: - -* UML offers deployment diagrams to express that view. Use it, probably with nested diagrams, -when your infrastructure is more complex. -* When your (hardware) stakeholders prefer other kinds of diagrams rather than a deployment diagram, let them use any kind that is able to show nodes and channels of the infrastructure. - - -.Further Information - -See https://docs.arc42.org/section-7/[Deployment View] in the arc42 documentation. - -**** === Infrastructure Level 1 -[role="arc42help"] - - -_**Deployment diagram**_ image::DeploymentView.svg[Deployment View] Motivation:: @@ -57,13 +17,6 @@ This diagram shows us the process the application goes through when it is deploy === Infrastructure Level 2 -[role="arc42help"] -**** -Here you can include the internal structure of (some) infrastructure elements from level 1. - -Please copy the structure from level 1 for each selected element. -**** - ==== APP "App": It is the part with which the user interacts. This part would be responsible for providing the visual interface and using the rest of the created classes. From 08dc5b324c67fa7ab20b7fc183b999bd4d9a4b5a Mon Sep 17 00:00:00 2001 From: UO288443 Date: Tue, 27 Feb 2024 10:08:48 +0100 Subject: [PATCH 04/18] . --- debug.log | 1 + 1 file changed, 1 insertion(+) diff --git a/debug.log b/debug.log index 77d60f2b..c22dcbec 100644 --- a/debug.log +++ b/debug.log @@ -1 +1,2 @@ [0220/104149.273:ERROR:registration_protocol_win.cc(107)] CreateFile: El sistema no puede encontrar el archivo especificado. (0x2) +[0227/100625.318:ERROR:registration_protocol_win.cc(107)] CreateFile: El sistema no puede encontrar el archivo especificado. (0x2) From 2e0c16b6379b96f3f0cb4333adba0765238f38c5 Mon Sep 17 00:00:00 2001 From: rodrox11 Date: Tue, 5 Mar 2024 13:34:15 +0100 Subject: [PATCH 05/18] =?UTF-8?q?Modidicar=20punto=204=20de=20documentaci?= =?UTF-8?q?=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/src/04_solution_strategy.adoc | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/src/04_solution_strategy.adoc b/docs/src/04_solution_strategy.adoc index 32fe86f8..7b0744a8 100644 --- a/docs/src/04_solution_strategy.adoc +++ b/docs/src/04_solution_strategy.adoc @@ -10,7 +10,6 @@ A ranking with the maximum score of the user and can be compared with other user * MongoDB: MongoDB is an open-source NoSQL database that uses a document-based data model for information storage and retrieval. * React JS: It's a framework created by Facebook that's widely used to create user interface components. Chosen for the large volume of documentation and the fact that it is the framework used during the previous courses. -* WikiData: It's a free knowledge base modified by humans as well as machines, and it's where we'll get our questions from. * Microsoft Azure: A cloud computing platform that provides infrastructure, platform, and software-as-a-service services to host, manage, and scale online applications and services. === Design From 32b62366c8b9647c98060d6c7670635fbebfc0ea Mon Sep 17 00:00:00 2001 From: rodrox11 Date: Mon, 11 Mar 2024 20:03:02 +0100 Subject: [PATCH 06/18] Corregir doc 6 --- docs/images/6.1.png | Bin 0 -> 25569 bytes docs/images/6.2.png | Bin 0 -> 16844 bytes docs/src/06_runtime_view.adoc | 8 ++++---- 3 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 docs/images/6.1.png create mode 100644 docs/images/6.2.png diff --git a/docs/images/6.1.png b/docs/images/6.1.png new file mode 100644 index 0000000000000000000000000000000000000000..3ce968fe3201040e4041a3a658fb4a84c30778f5 GIT binary patch literal 25569 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 LtDnm{r-UW|EDr*F literal 0 HcmV?d00001 diff --git a/docs/images/6.2.png b/docs/images/6.2.png new file mode 100644 index 0000000000000000000000000000000000000000..fe2743930dfacb2456dea86609468b86d1fbd456 GIT binary patch literal 16844 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 literal 0 HcmV?d00001 diff --git a/docs/src/06_runtime_view.adoc b/docs/src/06_runtime_view.adoc index 7886952d..dde2226f 100644 --- a/docs/src/06_runtime_view.adoc +++ b/docs/src/06_runtime_view.adoc @@ -4,14 +4,14 @@ ifndef::imagesdir[:imagesdir: ../images] == Runtime View -=== +=== The user plays The user starts a game, and the game uses the questions service to run it. -image::juega.png["Hierarchy of building blocks"] +image::6.1.png["Hierarchy of building blocks"] -=== +=== The user looks at their history The user checks their scores and statistics. -image::historial.png["Hierarchy of building blocks"] \ No newline at end of file +image::6.2.png["Hierarchy of building blocks"] \ No newline at end of file From 19292e7ced77978b172aa0e6bb213dfa12fe19e0 Mon Sep 17 00:00:00 2001 From: rodrox11 Date: Mon, 11 Mar 2024 21:10:27 +0100 Subject: [PATCH 07/18] actualizacion doc 5 --- docs/images/diagrama5.2.png | Bin 0 -> 16988 bytes docs/images/diagrama5.png | Bin 0 -> 35996 bytes docs/src/05_building_block_view.adoc | 4 ++-- 3 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 docs/images/diagrama5.2.png create mode 100644 docs/images/diagrama5.png diff --git a/docs/images/diagrama5.2.png b/docs/images/diagrama5.2.png new file mode 100644 index 0000000000000000000000000000000000000000..eb6f5bc43ff6ca59a7741bf668451a7a4e1b111f GIT binary patch literal 16988 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 CkLR)g literal 0 HcmV?d00001 diff --git a/docs/images/diagrama5.png b/docs/images/diagrama5.png new file mode 100644 index 0000000000000000000000000000000000000000..dadaf15fe16b39a65fbaba673b739896ba80f36a GIT binary patch literal 35996 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 literal 0 HcmV?d00001 diff --git a/docs/src/05_building_block_view.adoc b/docs/src/05_building_block_view.adoc index 010f4318..0c3bfbd9 100644 --- a/docs/src/05_building_block_view.adoc +++ b/docs/src/05_building_block_view.adoc @@ -9,7 +9,7 @@ ifndef::imagesdir[:imagesdir: ../images] The code is broken down in a structured way by levels, in which the internal dependencies of each element are taught. The system is divided into Whitebox and Blackbox. -image::whiteBox5.1.png["Hierarchy of building blocks"] +image::diagrama5.png["Hierarchy of building blocks"] |=== | *_Actors_* | *_Description_* @@ -30,7 +30,7 @@ image::whiteBox5.1.png["Hierarchy of building blocks"] === Level 2 -image::Level2.png["Hierarchy of building blocks"] +image::diagrama5.2.png["Hierarchy of building blocks"] .Motivation From 8294d299728b9280d02f925f737b69624b72aa70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iy=C3=A1n=20Fern=C3=A1ndez=20Riol?= <145439249+iyanfdezz@users.noreply.github.com> Date: Sat, 13 Apr 2024 11:33:09 +0200 Subject: [PATCH 08/18] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 4cfce5de..bfdcf460 100644 --- a/README.md +++ b/README.md @@ -20,8 +20,8 @@ This repo is a basic application composed of several components. - **User service**. Express service that handles the insertion of new users in the system. - **Auth service**. Express service that handles the authentication of users. - **Webapp**. React web application that uses the gateway service to allow basic login and new user features. -- **Question service**. Express service that handles question generation -- **Stats service**. Exoress service that handles game stats. +- **Question service**. Express service that handles question generation. +- **Stats service**. Express service that handles game stats and rankings Both the user and auth service share a Mongo database that is accessed with mongoose. From abf1d2d533e9bb44aa401ccabea31c15112bfb27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iy=C3=A1n=20Fern=C3=A1ndez=20Riol?= <145439249+iyanfdezz@users.noreply.github.com> Date: Sat, 13 Apr 2024 11:34:08 +0200 Subject: [PATCH 09/18] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index bfdcf460..cfa60ca4 100644 --- a/README.md +++ b/README.md @@ -21,9 +21,10 @@ This repo is a basic application composed of several components. - **Auth service**. Express service that handles the authentication of users. - **Webapp**. React web application that uses the gateway service to allow basic login and new user features. - **Question service**. Express service that handles question generation. -- **Stats service**. Express service that handles game stats and rankings +- **Stats service**. Express service that handles game stats and rankings. Both the user and auth service share a Mongo database that is accessed with mongoose. +Stats service has its own database that is also accessed with mongoose. ## Quick start guide From fc7a148246fa2dc8d4eb602bb07367070fef3bc1 Mon Sep 17 00:00:00 2001 From: rodrox11 Date: Tue, 16 Apr 2024 10:30:17 +0200 Subject: [PATCH 10/18] Metrica azure ver si funciona --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 58958ad1..5435842b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -99,7 +99,7 @@ services: prometheus: image: prom/prometheus container_name: prometheus-${teamname:-defaultASW} - profiles: ["dev"] + profiles: ["dev","prod"] networks: - mynetwork volumes: From 32afaa49dcb7bf1d9159f3a18bc90c5e357a8fcd Mon Sep 17 00:00:00 2001 From: CANCI0 Date: Tue, 16 Apr 2024 19:58:39 +0200 Subject: [PATCH 11/18] =?UTF-8?q?Decisiones=20arquitect=C3=B3nicas=20actua?= =?UTF-8?q?lizadas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/src/09_architecture_decisions.adoc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/src/09_architecture_decisions.adoc b/docs/src/09_architecture_decisions.adoc index c569aca3..b0d39ed9 100644 --- a/docs/src/09_architecture_decisions.adoc +++ b/docs/src/09_architecture_decisions.adoc @@ -26,5 +26,10 @@ MySQL: https://github.com/Arquisoft/wiq_es1a/wiki/(ADR-%236)-MySQL[ADR#6] +Chakra UI: +https://github.com/Arquisoft/wiq_es1a/wiki/(ADR-%237)-Chakra-UI[ADR#7] +BDD de estadísticas: + +https://github.com/Arquisoft/wiq_es1a/wiki/(ADR-%238)-BD-de-estad%C3%ADsticas From 0fb8e7ad641b04370be0bd3ca6ab255e2a2adc3a Mon Sep 17 00:00:00 2001 From: CANCI0 Date: Tue, 16 Apr 2024 21:08:27 +0200 Subject: [PATCH 12/18] Mejoras en los diagramas del runtime view --- docs/images/06-login.svg | 4 ++++ docs/images/06-play.svg | 4 ++++ docs/images/06-register.svg | 4 ++++ docs/images/06-stats.svg | 4 ++++ docs/src/04_solution_strategy.adoc | 1 + docs/src/06_runtime_view.adoc | 35 +++++++++++++++++++++++++----- 6 files changed, 47 insertions(+), 5 deletions(-) create mode 100644 docs/images/06-login.svg create mode 100644 docs/images/06-play.svg create mode 100644 docs/images/06-register.svg create mode 100644 docs/images/06-stats.svg diff --git a/docs/images/06-login.svg b/docs/images/06-login.svg new file mode 100644 index 00000000..09892001 --- /dev/null +++ b/docs/images/06-login.svg @@ -0,0 +1,4 @@ + + + +
User
User
Webap%3CmxGraphModel%3E%3Croot%3E%3CmxCell%20id%3D%220%22%2F%3E%3CmxCell%20id%3D%221%22%20parent%3D%220%22%2F%3E%3CmxCell%20id%3D%222%22%20value%3D%22User%22%20style%3D%22shape%3DumlLifeline%3Bperimeter%3DlifelinePerimeter%3BwhiteSpace%3Dwrap%3Bhtml%3D1%3Bcontainer%3D1%3BdropTarget%3D0%3Bcollapsible%3D0%3BrecursiveResize%3D0%3BoutlineConnect%3D0%3BportConstraint%3Deastwest%3BnewEdgeStyle%3D%7B%26quot%3Bcurved%26quot%3B%3A0%2C%26quot%3Brounded%26quot%3B%3A0%7D%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%22130%22%20height%3D%22870%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3C%2Froot%3E%3C%2FmxGraphModel%3Ep
Webap%3CmxGra...
Gateway service
Gateway servi...
Authentication service
Authenticatio...
fills up login form and presses login
fills up login form and presses login
successful login
successful login
axios.post('/login')
axios.post('/lo...
MongoDB
MongoDB
axios.post('/login')
axios.post('/lo...
User.findOne(...)
User.findOne(.....
response
response
response
response
response
response
redirect to main page
redirect to main page
show main page view
show main page view
Text is not SVG - cannot display
\ No newline at end of file diff --git a/docs/images/06-play.svg b/docs/images/06-play.svg new file mode 100644 index 00000000..bc2207dc --- /dev/null +++ b/docs/images/06-play.svg @@ -0,0 +1,4 @@ + + + +
User
User
Webap%3CmxGraphModel%3E%3Croot%3E%3CmxCell%20id%3D%220%22%2F%3E%3CmxCell%20id%3D%221%22%20parent%3D%220%22%2F%3E%3CmxCell%20id%3D%222%22%20value%3D%22User%22%20style%3D%22shape%3DumlLifeline%3Bperimeter%3DlifelinePerimeter%3BwhiteSpace%3Dwrap%3Bhtml%3D1%3Bcontainer%3D1%3BdropTarget%3D0%3Bcollapsible%3D0%3BrecursiveResize%3D0%3BoutlineConnect%3D0%3BportConstraint%3Deastwest%3BnewEdgeStyle%3D%7B%26quot%3Bcurved%26quot%3B%3A0%2C%26quot%3Brounded%26quot%3B%3A0%7D%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%22130%22%20height%3D%22870%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3C%2Froot%3E%3C%2FmxGraphModel%3Ep
Webap%3CmxGra...
Gateway service
Gateway servi...
Question service
Question serv...
presses a gamemode button
presses a gamemode button
questions successfuly retrieved. 
First question shows
questions successfuly retrieved....
fetch('/questions')
fetch('/questio...
axios.post('/questions')
axios.post('/qu...
questions response (JSON)
questions response (JSON)
response
response
Answers a question
Answers a question
Returns answer. 
The game does (or does not) add up to a score
Returns answer....
loop
loop
alt
alt
shows end game view
shows end game view
axios.post('/saveGame')
axios.post('/sa...
Stats service
Stats service
MongoDB
MongoDB
axios.post('/saveGame')
axios.post('/sa...
new Stats(...).save()
new Stats(...)....
returns OK%3CmxGraphModel%3E%3Croot%3E%3CmxCell%20id%3D%220%22%2F%3E%3CmxCell%20id%3D%221%22%20parent%3D%220%22%2F%3E%3CmxCell%20id%3D%222%22%20value%3D%22axios.post('%2FsaveGame')%22%20style%3D%22html%3D1%3BverticalAlign%3Dbottom%3BendArrow%3Dblock%3Bcurved%3D0%3Brounded%3D0%3B%22%20edge%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%2280%22%20relative%3D%221%22%20as%3D%22geometry%22%3E%3CmxPoint%20x%3D%22360%22%20y%3D%22560%22%20as%3D%22sourcePoint%22%2F%3E%3CmxPoint%20x%3D%22640%22%20y%3D%22560%22%20as%3D%22targetPoint%22%2F%3E%3CmxPoint%20as%3D%22offset%22%2F%3E%3C%2FmxGeometry%3E%3C%2FmxCell%3E%3C%2Froot%3E%3C%2FmxGraphModel%3E
returns OK%3CmxGraphModel%3E%3Croot%3E%3CmxCell%20id%3D%220%22%2F%3E%3CmxCell%20id%3D%221%22%20parent%3D%220%22%2F%3E%3CmxCell%20id%3D%222%22%20value%3D%22axios.post('%2FsaveGame')%22%20style%3D%22html%3D1%3BverticalAlign%3Dbottom%3BendArrow%3Dblock%3Bcurved%3D0%3Brounded%3D0%3B%22%20edge%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%2280%22%20relative%3D%221%22%20as%3D%22geometry%22%3E%3CmxPoint%20x%3D%22360%22%20y%3D%22560%22%20as%3D%22sourcePoint%22%2F%3E%3CmxPoint%20x%3D%22640%22%20y%3D%22560%22%20as%3D%22targetPoint%22%2F%3E%3CmxPoint%20as%3D%22offset%22%2F%3E%3C%2FmxGeometry%3E%3C%2FmxCell%3E%3C%2Froot%3E%3C%2FmxGraphModel%3E
axios.post('/saveGameList')
axios.post('/sa...
axios.post('/saveGameList')
axios.post('/sa...
User.findOne(...).games.push(....save())
User.findOne(.....
User service
User service
returns OK%3CmxGraphModel%3E%3Croot%3E%3CmxCell%20id%3D%220%22%2F%3E%3CmxCell%20id%3D%221%22%20parent%3D%220%22%2F%3E%3CmxCell%20id%3D%222%22%20value%3D%22Stats%20service%22%20style%3D%22shape%3DumlLifeline%3Bperimeter%3DlifelinePerimeter%3BwhiteSpace%3Dwrap%3Bhtml%3D1%3Bcontainer%3D1%3BdropTarget%3D0%3Bcollapsible%3D0%3BrecursiveResize%3D0%3BoutlineConnect%3D0%3BportConstraint%3Deastwest%3BnewEdgeStyle%3D%7B%26quot%3Bcurved%26quot%3B%3A0%2C%26quot%3Brounded%26quot%3B%3A0%7D%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%221080%22%20width%3D%2280%22%20height%3D%22880%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3C%2Froot%3E%3C%2FmxGraphModel%3E
returns OK%3CmxGraphModel%3E%3Croot%3E%3CmxCell%20id%3D%220%22%2F%3E%3CmxCell%20id%3D%221%22%20parent%3D%220%22%2F%3E%3CmxCell%20id%3D%222%22%20value%3D%22Stats%20service%22%20style%3D%22shape%3DumlLifeline%3Bperimeter%3DlifelinePerimeter%3BwhiteSpace%3Dwrap%3Bhtml%3D1%3Bcontainer%3D1%3BdropTarget%3D0%3Bcollapsible%3D0%3BrecursiveResize%3D0%3BoutlineConnect%3D0%3BportConstraint%3Deastwest%3BnewEdgeStyle%3D%7B%26quot%3Bcurved%26quot%3B%3A0%2C%26quot%3Brounded%26quot%3B%3A0%7D%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%221080%22%20width%3D%2280%22%20height%3D%22880%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3C%2Froot%3E%3C%2FmxGraphModel%3E
Text is not SVG - cannot display
\ No newline at end of file diff --git a/docs/images/06-register.svg b/docs/images/06-register.svg new file mode 100644 index 00000000..d37ef8aa --- /dev/null +++ b/docs/images/06-register.svg @@ -0,0 +1,4 @@ + + + +
User
User
Webap%3CmxGraphModel%3E%3Croot%3E%3CmxCell%20id%3D%220%22%2F%3E%3CmxCell%20id%3D%221%22%20parent%3D%220%22%2F%3E%3CmxCell%20id%3D%222%22%20value%3D%22User%22%20style%3D%22shape%3DumlLifeline%3Bperimeter%3DlifelinePerimeter%3BwhiteSpace%3Dwrap%3Bhtml%3D1%3Bcontainer%3D1%3BdropTarget%3D0%3Bcollapsible%3D0%3BrecursiveResize%3D0%3BoutlineConnect%3D0%3BportConstraint%3Deastwest%3BnewEdgeStyle%3D%7B%26quot%3Bcurved%26quot%3B%3A0%2C%26quot%3Brounded%26quot%3B%3A0%7D%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%22130%22%20height%3D%22870%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3C%2Froot%3E%3C%2FmxGraphModel%3Ep
Webap%3CmxGra...
Gateway service
Gateway servi...
Authentication service
Authenticatio...
fills up register form and presses register
fills up register form and presses register
successful register
successful register
axios.post('/adduser')
axios.post('/ad...
MongoDB
MongoDB
axios.post('/adduser')
axios.post('/ad...
User.insertOne(...)
User.insertOne(...
response
response
response
response
response
response
auto-logins and redirects to main page 
auto-logins and redirects to main page 
show main page view
show main page view
Text is not SVG - cannot display
\ No newline at end of file diff --git a/docs/images/06-stats.svg b/docs/images/06-stats.svg new file mode 100644 index 00000000..502d14a7 --- /dev/null +++ b/docs/images/06-stats.svg @@ -0,0 +1,4 @@ + + + +
User
User
Webap%3CmxGraphModel%3E%3Croot%3E%3CmxCell%20id%3D%220%22%2F%3E%3CmxCell%20id%3D%221%22%20parent%3D%220%22%2F%3E%3CmxCell%20id%3D%222%22%20value%3D%22User%22%20style%3D%22shape%3DumlLifeline%3Bperimeter%3DlifelinePerimeter%3BwhiteSpace%3Dwrap%3Bhtml%3D1%3Bcontainer%3D1%3BdropTarget%3D0%3Bcollapsible%3D0%3BrecursiveResize%3D0%3BoutlineConnect%3D0%3BportConstraint%3Deastwest%3BnewEdgeStyle%3D%7B%26quot%3Bcurved%26quot%3B%3A0%2C%26quot%3Brounded%26quot%3B%3A0%7D%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%22130%22%20height%3D%22870%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3C%2Froot%3E%3C%2FmxGraphModel%3Ep
Webap%3CmxGra...
Gateway service
Gateway servi...
presses a gamemode button
presses a gamemode button
User stats successfuly retrieved. 
Stats view is shown
User stats successfuly retrieved....
fetch('/stats')
fetch('/stats')
axios.post('/stats')
axios.post('/st...
stasts response (JSON)
stasts response (JSON)
response
response
Stats service
Stats service
Text is not SVG - cannot display
\ No newline at end of file diff --git a/docs/src/04_solution_strategy.adoc b/docs/src/04_solution_strategy.adoc index 32fe86f8..b645009e 100644 --- a/docs/src/04_solution_strategy.adoc +++ b/docs/src/04_solution_strategy.adoc @@ -10,6 +10,7 @@ A ranking with the maximum score of the user and can be compared with other user * MongoDB: MongoDB is an open-source NoSQL database that uses a document-based data model for information storage and retrieval. * React JS: It's a framework created by Facebook that's widely used to create user interface components. Chosen for the large volume of documentation and the fact that it is the framework used during the previous courses. +* Chakra UI: It's a simple, modular and accessible component library that gives us the ability to create a responsive and accessible design. * WikiData: It's a free knowledge base modified by humans as well as machines, and it's where we'll get our questions from. * Microsoft Azure: A cloud computing platform that provides infrastructure, platform, and software-as-a-service services to host, manage, and scale online applications and services. diff --git a/docs/src/06_runtime_view.adoc b/docs/src/06_runtime_view.adoc index 7886952d..5ccf6397 100644 --- a/docs/src/06_runtime_view.adoc +++ b/docs/src/06_runtime_view.adoc @@ -3,15 +3,40 @@ ifndef::imagesdir[:imagesdir: ../images] [[section-runtime-view]] == Runtime View +=== + +The user logs in by entering his username and password. The system checks the credentials and if they are correct, the user is redirected to the main page. Otherwise, an error message is shown. + +image::06-login.svg[] + +=== + +The user registers by entering his username, password, email and other optional information. The system checks if the username is unique and if the email is valid. If everything is correct, the user is redirected to the main page. Otherwise, an error message is shown. + +image::06-register.svg[] === -The user starts a game, and the game uses the questions service to run it. +The user selects a game to play. The system loads the game and the user can start playing. The user can pause the game, save it and resume it later. When the game is over, the user can see his score and the game is saved in the user's history. + +It should be noted that this does not require access to wikidata data, as the system has a data caching system that allows wikidata data to be stored in the system's database, so it is not necessary to access wikidata every time a game is played. + +image::06-play.svg[] + +=== + +The user can see his stats by pressing stats button. It shows things such as games played, average score, total score, total correct questions, total incorrect questions, correct answer ratio or average time per question. + +image::06-stats.svg[] + +=== + +=== -image::juega.png["Hierarchy of building blocks"] +=== -=== +=== -The user checks their scores and statistics. +=== -image::historial.png["Hierarchy of building blocks"] \ No newline at end of file +=== \ No newline at end of file From cebf49e78aefa60ad3a001b728fc32799b944cd2 Mon Sep 17 00:00:00 2001 From: CANCI0 Date: Tue, 16 Apr 2024 21:26:28 +0200 Subject: [PATCH 13/18] Todos los diagramas de runtime view --- docs/images/06-friends.svg | 4 +++ docs/images/06-groups.svg | 4 +++ docs/images/06-history.svg | 4 +++ docs/images/06-ranking.svg | 4 +++ docs/images/06-users.svg | 4 +++ docs/src/06_runtime_view.adoc | 46 ++++++++++++++++++++++++----------- 6 files changed, 52 insertions(+), 14 deletions(-) create mode 100644 docs/images/06-friends.svg create mode 100644 docs/images/06-groups.svg create mode 100644 docs/images/06-history.svg create mode 100644 docs/images/06-ranking.svg create mode 100644 docs/images/06-users.svg diff --git a/docs/images/06-friends.svg b/docs/images/06-friends.svg new file mode 100644 index 00000000..5bb2d482 --- /dev/null +++ b/docs/images/06-friends.svg @@ -0,0 +1,4 @@ + + + +
User
User
Webap%3CmxGraphModel%3E%3Croot%3E%3CmxCell%20id%3D%220%22%2F%3E%3CmxCell%20id%3D%221%22%20parent%3D%220%22%2F%3E%3CmxCell%20id%3D%222%22%20value%3D%22User%22%20style%3D%22shape%3DumlLifeline%3Bperimeter%3DlifelinePerimeter%3BwhiteSpace%3Dwrap%3Bhtml%3D1%3Bcontainer%3D1%3BdropTarget%3D0%3Bcollapsible%3D0%3BrecursiveResize%3D0%3BoutlineConnect%3D0%3BportConstraint%3Deastwest%3BnewEdgeStyle%3D%7B%26quot%3Bcurved%26quot%3B%3A0%2C%26quot%3Brounded%26quot%3B%3A0%7D%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%22130%22%20height%3D%22870%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3C%2Froot%3E%3C%2FmxGraphModel%3Ep
Webap%3CmxGra...
Gateway service
Gateway servi...
presses ranking button
presses ranking button
Friends successfuly retrieved. 
Friends is shown.
Friends successfuly retrieved....
fetch('/friends')
fetch('/friends...
axios.post('/friends')
axios.post('/fr...
friends response (JSON)
friends response (JSON)
response
response
User service
User service
Text is not SVG - cannot display
\ No newline at end of file diff --git a/docs/images/06-groups.svg b/docs/images/06-groups.svg new file mode 100644 index 00000000..ab30d696 --- /dev/null +++ b/docs/images/06-groups.svg @@ -0,0 +1,4 @@ + + + +
User
User
Webap%3CmxGraphModel%3E%3Croot%3E%3CmxCell%20id%3D%220%22%2F%3E%3CmxCell%20id%3D%221%22%20parent%3D%220%22%2F%3E%3CmxCell%20id%3D%222%22%20value%3D%22User%22%20style%3D%22shape%3DumlLifeline%3Bperimeter%3DlifelinePerimeter%3BwhiteSpace%3Dwrap%3Bhtml%3D1%3Bcontainer%3D1%3BdropTarget%3D0%3Bcollapsible%3D0%3BrecursiveResize%3D0%3BoutlineConnect%3D0%3BportConstraint%3Deastwest%3BnewEdgeStyle%3D%7B%26quot%3Bcurved%26quot%3B%3A0%2C%26quot%3Brounded%26quot%3B%3A0%7D%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%22130%22%20height%3D%22870%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3C%2Froot%3E%3C%2FmxGraphModel%3Ep
Webap%3CmxGra...
Gateway service
Gateway servi...
presses users button
presses users button
Group list successfuly retrieved. 
Group list is shown.
Group list successfuly retrieved....
fetch('/group/list')
fetch('/group/l...
axios.post('/group/list')
axios.post('/gr...
friends response (JSON)
friends response (JSON)
response
response
User service
User service
Text is not SVG - cannot display
\ No newline at end of file diff --git a/docs/images/06-history.svg b/docs/images/06-history.svg new file mode 100644 index 00000000..ddca3b3e --- /dev/null +++ b/docs/images/06-history.svg @@ -0,0 +1,4 @@ + + + +
User
User
Webap%3CmxGraphModel%3E%3Croot%3E%3CmxCell%20id%3D%220%22%2F%3E%3CmxCell%20id%3D%221%22%20parent%3D%220%22%2F%3E%3CmxCell%20id%3D%222%22%20value%3D%22User%22%20style%3D%22shape%3DumlLifeline%3Bperimeter%3DlifelinePerimeter%3BwhiteSpace%3Dwrap%3Bhtml%3D1%3Bcontainer%3D1%3BdropTarget%3D0%3Bcollapsible%3D0%3BrecursiveResize%3D0%3BoutlineConnect%3D0%3BportConstraint%3Deastwest%3BnewEdgeStyle%3D%7B%26quot%3Bcurved%26quot%3B%3A0%2C%26quot%3Brounded%26quot%3B%3A0%7D%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%22130%22%20height%3D%22870%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3C%2Froot%3E%3C%2FmxGraphModel%3Ep
Webap%3CmxGra...
Gateway service
Gateway servi...
presses a gamemode button
presses a gamemode button
User stats successfuly retrieved. 
Stats view is shown
User stats successfuly retrieved....
fetch('/userInfo')
fetch('/userInf...
axios.post('/userInfo')
axios.post('/us...
history response (JSON)
history response (JSON)
response
response
Stats service
Stats service
Text is not SVG - cannot display
\ No newline at end of file diff --git a/docs/images/06-ranking.svg b/docs/images/06-ranking.svg new file mode 100644 index 00000000..3a9c955f --- /dev/null +++ b/docs/images/06-ranking.svg @@ -0,0 +1,4 @@ + + + +
User
User
Webap%3CmxGraphModel%3E%3Croot%3E%3CmxCell%20id%3D%220%22%2F%3E%3CmxCell%20id%3D%221%22%20parent%3D%220%22%2F%3E%3CmxCell%20id%3D%222%22%20value%3D%22User%22%20style%3D%22shape%3DumlLifeline%3Bperimeter%3DlifelinePerimeter%3BwhiteSpace%3Dwrap%3Bhtml%3D1%3Bcontainer%3D1%3BdropTarget%3D0%3Bcollapsible%3D0%3BrecursiveResize%3D0%3BoutlineConnect%3D0%3BportConstraint%3Deastwest%3BnewEdgeStyle%3D%7B%26quot%3Bcurved%26quot%3B%3A0%2C%26quot%3Brounded%26quot%3B%3A0%7D%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%22130%22%20height%3D%22870%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3C%2Froot%3E%3C%2FmxGraphModel%3Ep
Webap%3CmxGra...
Gateway service
Gateway servi...
presses a gamemode button
presses a gamemode button
Ranking successfuly retrieved. 
Ranking is shown.
Ranking successfuly retrieved....
fetch('/ranking')
fetch('/ranking...
axios.post('/ranking')
axios.post('/ra...
ranking response (JSON)
ranking response (JSON)
response
response
Stats service
Stats service
Text is not SVG - cannot display
\ No newline at end of file diff --git a/docs/images/06-users.svg b/docs/images/06-users.svg new file mode 100644 index 00000000..6bebc3af --- /dev/null +++ b/docs/images/06-users.svg @@ -0,0 +1,4 @@ + + + +
User
User
Webap%3CmxGraphModel%3E%3Croot%3E%3CmxCell%20id%3D%220%22%2F%3E%3CmxCell%20id%3D%221%22%20parent%3D%220%22%2F%3E%3CmxCell%20id%3D%222%22%20value%3D%22User%22%20style%3D%22shape%3DumlLifeline%3Bperimeter%3DlifelinePerimeter%3BwhiteSpace%3Dwrap%3Bhtml%3D1%3Bcontainer%3D1%3BdropTarget%3D0%3Bcollapsible%3D0%3BrecursiveResize%3D0%3BoutlineConnect%3D0%3BportConstraint%3Deastwest%3BnewEdgeStyle%3D%7B%26quot%3Bcurved%26quot%3B%3A0%2C%26quot%3Brounded%26quot%3B%3A0%7D%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%22130%22%20height%3D%22870%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3C%2Froot%3E%3C%2FmxGraphModel%3Ep
Webap%3CmxGra...
Gateway service
Gateway servi...
presses friends button
presses friends button
Non-friend users successfuly retrieved. 
Non-friend users is shown.
Non-friend users successfuly retrieved....
fetch('/users/search')
fetch('/users/s...
axios.post('/users/search')
axios.post('/us...
friends response (JSON)
friends response (JSON)
response
response
User service
User service
Text is not SVG - cannot display
\ No newline at end of file diff --git a/docs/src/06_runtime_view.adoc b/docs/src/06_runtime_view.adoc index 5ccf6397..e4a7a4bf 100644 --- a/docs/src/06_runtime_view.adoc +++ b/docs/src/06_runtime_view.adoc @@ -3,40 +3,58 @@ ifndef::imagesdir[:imagesdir: ../images] [[section-runtime-view]] == Runtime View -=== +=== User logs in -The user logs in by entering his username and password. The system checks the credentials and if they are correct, the user is redirected to the main page. Otherwise, an error message is shown. +User logs in by entering his username and password. The system checks the credentials and if they are correct, the user is redirected to the main page. Otherwise, an error message is shown. image::06-login.svg[] -=== +=== User registers -The user registers by entering his username, password, email and other optional information. The system checks if the username is unique and if the email is valid. If everything is correct, the user is redirected to the main page. Otherwise, an error message is shown. +User registers by entering his username, password, email and other optional information. The system checks if the username is unique and if the email is valid. If everything is correct, the user is redirected to the main page. Otherwise, an error message is shown. image::06-register.svg[] -=== +=== User plays a game -The user selects a game to play. The system loads the game and the user can start playing. The user can pause the game, save it and resume it later. When the game is over, the user can see his score and the game is saved in the user's history. +User selects a game to play. The system loads the game and the user can start playing. The user can pause the game, save it and resume it later. When the game is over, the user can see his score and the game is saved in the user's history. It should be noted that this does not require access to wikidata data, as the system has a data caching system that allows wikidata data to be stored in the system's database, so it is not necessary to access wikidata every time a game is played. image::06-play.svg[] -=== +=== User looks his stats -The user can see his stats by pressing stats button. It shows things such as games played, average score, total score, total correct questions, total incorrect questions, correct answer ratio or average time per question. +User can see his stats by pressing stats button. It shows things such as games played, average score, total score, total correct questions, total incorrect questions, correct answer ratio or average time per question. image::06-stats.svg[] -=== +=== User looks his game history -=== +User can see his game history by pressing history button. It shows a list of games played, with answered questions. -=== +image::06-history.svg[] -=== +=== User looks at ranking -=== +User can see the ranking of the users. This ranking can be filtered by average points, total points, correct answer ratio or average time. -=== \ No newline at end of file +image::06-ranking.svg[] + +=== User checks his friends + +User can see his friends. He can also get into their profile to see their stats. + +image::06-friends.svg[] + +=== User looks for users to be friends + +User can see a list of non-friends users. He can send a friend request to them. + +image::06-users.svg[] + +=== User looks for available groups to join + +User can see a list of available groups to join. He can send a request to join them. + +image::06-groups.svg[] \ No newline at end of file From 9ee6eed1b917c49e0332bfffebe8daf95777f9a3 Mon Sep 17 00:00:00 2001 From: CANCI0 Date: Tue, 16 Apr 2024 22:17:46 +0200 Subject: [PATCH 14/18] 7 - Deployment view actualizado --- docker-compose.yml | 2 +- docs/images/07-deployment.svg | 4 ++++ docs/images/DeploymentView.svg | 4 ---- docs/src/07_deployment_view.adoc | 35 +++++++++++++++++++++++--------- 4 files changed, 30 insertions(+), 15 deletions(-) create mode 100644 docs/images/07-deployment.svg delete mode 100644 docs/images/DeploymentView.svg diff --git a/docker-compose.yml b/docker-compose.yml index 5435842b..e01eaed6 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -113,7 +113,7 @@ services: grafana: image: grafana/grafana container_name: grafana-${teamname:-defaultASW} - profiles: ["dev"] + profiles: ["dev", "prod"] networks: - mynetwork volumes: diff --git a/docs/images/07-deployment.svg b/docs/images/07-deployment.svg new file mode 100644 index 00000000..1b0a7219 --- /dev/null +++ b/docs/images/07-deployment.svg @@ -0,0 +1,4 @@ + + + +
Azure cloud
Azure cloud
Docker container
Docker container
Webapp
Webapp
Question service
Question service
Stats service
Stats service
User service
User service
Auth service
Auth service
Docker container
Docker container
Prometheus
Prometheus
Grafana
Grafana
Gateway service
Gateway service
MongoDB
MongoDB
Docker container
Docker container
Docker container
Docker container
Docker container
Docker container
Docker container
Docker container
Docker container
Docker container
Docker container
Docker container
Docker container
Docker container
Web browser
Web browser
PC Device
PC Device
Mobile browser
Mobile browser
Mobile device
Mobile device
HTTP
HTTP
HTTP
HTTP
WIKIDATA
WIKIDATA
Text is not SVG - cannot display
\ No newline at end of file diff --git a/docs/images/DeploymentView.svg b/docs/images/DeploymentView.svg deleted file mode 100644 index 3b3d9207..00000000 --- a/docs/images/DeploymentView.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
User (player)
User...
MongoDB
MongoDB
Singin/Loging Form
Singin/Loging Form
Wikidata
Wikidata
User Service
User Service
Question generator
Question generator
Web app
Web app
User Interface
User Interface
Use
Use
Use
Use
1
1
1
1
1
1
KEY
KEY
componentName
componentName
Component:
Component:
apiName
apiName
Api:
Api:
appName
appName
Aplication:
Aplication:
Use
Use
A
A
B
B
A use b
A use b
1
1
Composition
Composition
Association
Association
Text is not SVG - cannot display
\ No newline at end of file diff --git a/docs/src/07_deployment_view.adoc b/docs/src/07_deployment_view.adoc index b28e28f4..80bec9dd 100644 --- a/docs/src/07_deployment_view.adoc +++ b/docs/src/07_deployment_view.adoc @@ -8,35 +8,50 @@ ifndef::imagesdir[:imagesdir: ../images] === Infrastructure Level 1 -image::DeploymentView.svg[Deployment View] +image::07-deployment.svg[Deployment View] Motivation:: -This diagram shows us the process the application goes through when it is deployed. - +The infrastructure consists on a set of containers that will be deployed in a cloud provider. This containers will be responsible for the different parts of the application. The infrastructure will be monitored by Prometheus and Grafana. The data will be stored in a MongoDB database. The application will use Wikidata to obtain the data for the questions. === Infrastructure Level 2 -==== APP +==== Webapp -"App": It is the part with which the user interacts. This part would be responsible for providing the visual interface and using the rest of the created classes. +This container is responsible for the user interface. -==== LINK +==== Question Generator "Link" is the part of the application that connects the rest of the parts. This will facilitate the use of the different parts of the application in the App section. -==== REGISTER +==== User Service "Register" is the part of the application that handles user registration and login. It's very important as it's the first thing a potential user will encounter when they visit our page. -==== USER SERVICE +==== Auth Service "User service" is the part of the application that generates the various services within the application to the user, such as a ranking, correctly answered questions, and so on. -==== QUESTION GENERATOR +==== Stats Service "Question generator" is the part of the application that, using the data from Wikidata and some pre-created templates, generates the questions and possible answers of the application. -==== WIKIDATA +==== Gateway service Wikidata” is the API that you will use to obtain the data for the questions. Wikidata is a free and collaborative database that can be read and edited by both humans and machines. It provides a common source of certain types of data that can be used by Wikimedia projects. + +==== MongoDB + +"MongoDB" is the database that will store the data of the users, the questions, the answers, and the statistics of the application. + +==== Prometheus + +"Prometheus" is the monitoring tool that will be used to monitor the application. + +==== Grafana + +"Grafana" is the visualization tool that will be used to visualize the monitoring of the application. + +==== WIkidata + +"WikiData" is the API that you we willll use to obtain the data for the questions. Wikidata is a free and collaborative database that can be read and edited by both humans and machines. It provides a common source of certain types of data that can be used by Wikimedia projects. From a5b00ad76fc582b941e08f5ae7e5b7c1eb040f88 Mon Sep 17 00:00:00 2001 From: CANCI0 Date: Tue, 16 Apr 2024 22:34:46 +0200 Subject: [PATCH 15/18] Diagramas apartado 03 actualizados --- docs/images/03-Business.svg | 4 ++++ docs/images/03-Technical.svg | 4 ++++ docs/src/03_system_scope_and_context.adoc | 4 ++-- 3 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 docs/images/03-Business.svg create mode 100644 docs/images/03-Technical.svg diff --git a/docs/images/03-Business.svg b/docs/images/03-Business.svg new file mode 100644 index 00000000..b067646a --- /dev/null +++ b/docs/images/03-Business.svg @@ -0,0 +1,4 @@ + + + +
User
User
<<system>>
WIQ
<<system>>...
<<extern>>
Wikidata
<<extern>>...
Interacts
Interacts
request data
request data
Text is not SVG - cannot display
\ No newline at end of file diff --git a/docs/images/03-Technical.svg b/docs/images/03-Technical.svg new file mode 100644 index 00000000..96b57011 --- /dev/null +++ b/docs/images/03-Technical.svg @@ -0,0 +1,4 @@ + + + +
Device
Device
Browser
Browser
Azure cloud
Azure cloud
WIQ
WIQ
MongoDB
MongoDB
Wikidata
Wikidata
REST
REST
Actor
Actor
uses
uses
Admin

Admin
Text is not SVG - cannot display
\ No newline at end of file diff --git a/docs/src/03_system_scope_and_context.adoc b/docs/src/03_system_scope_and_context.adoc index c8b3ebff..eab200ce 100644 --- a/docs/src/03_system_scope_and_context.adoc +++ b/docs/src/03_system_scope_and_context.adoc @@ -4,7 +4,7 @@ ifndef::imagesdir[:imagesdir: ../images] == System Scope and Context === Business Context -image::businesscontext.svg[Business context] +image::03-Business.svg[Business context] |=== | *Entity* | *_Description_* @@ -14,7 +14,7 @@ image::businesscontext.svg[Business context] |=== === Technical Context -image::technicalcontext.svg[Technical Context] +image::03-Technical.svg[Technical Context] |=== | *Entity* | *_Description_* | *_User_* | Represents the user interacting with the system. In this case, the user is interacting with the "WIQ!" application through the device and the web browser. From df6a23d3cd911d7ea2a698806b1833dd19806b3f Mon Sep 17 00:00:00 2001 From: CANCI0 Date: Wed, 17 Apr 2024 15:49:39 +0200 Subject: [PATCH 16/18] =?UTF-8?q?M=C3=A1s=20mejoras=20en=20diagramas=20apa?= =?UTF-8?q?rtado=2004=20y=2005?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/images/05-Level1.svg | 4 ++ docs/images/05-Overall.svg | 4 ++ docs/images/05-Question-service.svg | 4 ++ docs/images/05-Webapp.svg | 4 ++ docs/src/04_solution_strategy.adoc | 3 -- docs/src/05_building_block_view.adoc | 62 +++++++++++++++++++++++----- docs/src/07_deployment_view.adoc | 2 +- 7 files changed, 68 insertions(+), 15 deletions(-) create mode 100644 docs/images/05-Level1.svg create mode 100644 docs/images/05-Overall.svg create mode 100644 docs/images/05-Question-service.svg create mode 100644 docs/images/05-Webapp.svg diff --git a/docs/images/05-Level1.svg b/docs/images/05-Level1.svg new file mode 100644 index 00000000..433f0b86 --- /dev/null +++ b/docs/images/05-Level1.svg @@ -0,0 +1,4 @@ + + + +
Webapp
Webapp
MongoDB
MongoDB
Wikidata
Wikidata
Gateway service
Gateway servi...
Question service
Question serv...
Stats service%3CmxGraphModel%3E%3Croot%3E%3CmxCell%20id%3D%220%22%2F%3E%3CmxCell%20id%3D%221%22%20parent%3D%220%22%2F%3E%3CmxCell%20id%3D%222%22%20value%3D%22Webapp%22%20style%3D%22shape%3Dmodule%3Balign%3Dleft%3BspacingLeft%3D20%3Balign%3Dcenter%3BverticalAlign%3Dtop%3BwhiteSpace%3Dwrap%3Bhtml%3D1%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%22435%22%20y%3D%22420%22%20width%3D%22100%22%20height%3D%2250%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3C%2Froot%3E%3C%2FmxGraphModel%3E
Stats service...
User service
User service
Auth service

Auth service
Grafana
Grafana
Prometheus
Prometheus
Whitebox WIQ
Whitebox WIQ
User

User
Text
Text
Text
Text
interacts
interacts
Text is not SVG - cannot display
\ No newline at end of file diff --git a/docs/images/05-Overall.svg b/docs/images/05-Overall.svg new file mode 100644 index 00000000..f415c4a5 --- /dev/null +++ b/docs/images/05-Overall.svg @@ -0,0 +1,4 @@ + + + +
Wikidata
Wikidata
User

User
interacts
interacts
WIQ
WIQ
accesses
accesses
Text is not SVG - cannot display
\ No newline at end of file diff --git a/docs/images/05-Question-service.svg b/docs/images/05-Question-service.svg new file mode 100644 index 00000000..5346b322 --- /dev/null +++ b/docs/images/05-Question-service.svg @@ -0,0 +1,4 @@ + + + +
Whitebox question service
Whitebox question service
Question service
Question service
Generat%3CmxGraphModel%3E%3Croot%3E%3CmxCell%20id%3D%220%22%2F%3E%3CmxCell%20id%3D%221%22%20parent%3D%220%22%2F%3E%3CmxCell%20id%3D%222%22%20value%3D%22Question%20service%22%20style%3D%22shape%3Dmodule%3Balign%3Dleft%3BspacingLeft%3D20%3Balign%3Dcenter%3BverticalAlign%3Dtop%3BwhiteSpace%3Dwrap%3Bhtml%3D1%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%22190%22%20y%3D%22260%22%20width%3D%22120%22%20height%3D%2250%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3C%2Froot%3E%3C%2FmxGraphModel%3Eor choose%3CmxGraphModel%3E%3Croot%3E%3CmxCell%20id%3D%220%22%2F%3E%3CmxCell%20id%3D%221%22%20parent%3D%220%22%2F%3E%3CmxCell%20id%3D%222%22%20value%3D%22Question%20service%22%20style%3D%22shape%3Dmodule%3Balign%3Dleft%3BspacingLeft%3D20%3Balign%3Dcenter%3BverticalAlign%3Dtop%3BwhiteSpace%3Dwrap%3Bhtml%3D1%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%22190%22%20y%3D%22260%22%20width%3D%22120%22%20height%3D%2250%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3C%2Froot%3E%3C%2FmxGraphModel%3Er%3CmxGraphModel%3E%3Croot%3E%3CmxCell%20id%3D%220%22%2F%3E%3CmxCell%20id%3D%221%22%20parent%3D%220%22%2F%3E%3CmxCell%20id%3D%222%22%20value%3D%22Question%20service%22%20style%3D%22shape%3Dmodule%3Balign%3Dleft%3BspacingLeft%3D20%3Balign%3Dcenter%3BverticalAlign%3Dtop%3BwhiteSpace%3Dwrap%3Bhtml%3D1%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%22190%22%20y%3D%22260%22%20width%3D%22120%22%20height%3D%2250%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3C%2Froot%3E%3C%2FmxGraphModel%3E
Generat%3CmxGrap...
Generic 
generator
Generic...
Gateway service
Gateway servi...
%3CmxGraphModel%3E%3Croot%3E%3CmxCell%20id%3D%220%22%2F%3E%3CmxCell%20id%3D%221%22%20parent%3D%220%22%2F%3E%3CmxCell%20id%3D%222%22%20value%3D%22Generat%26lt%3Bspan%20style%3D%26quot%3Bcolor%3A%20rgba(0%2C%200%2C%200%2C%200)%3B%20font-family%3A%20monospace%3B%20font-size%3A%200px%3B%20text-align%3A%20start%3B%20text-wrap%3A%20nowrap%3B%26quot%3B%26gt%3B%253CmxGraphModel%253E%253Croot%253E%253CmxCell%2520id%253D%25220%2522%252F%253E%253CmxCell%2520id%253D%25221%2522%2520parent%253D%25220%2522%252F%253E%253CmxCell%2520id%253D%25222%2522%2520value%253D%2522Question%2520service%2522%2520style%253D%2522shape%253Dmodule%253Balign%253Dleft%253BspacingLeft%253D20%253Balign%253Dcenter%253BverticalAlign%253Dtop%253BwhiteSpace%253Dwrap%253Bhtml%253D1%253B%2522%2520vertex%253D%25221%2522%2520parent%253D%25221%2522%253E%253CmxGeometry%2520x%253D%2522190%2522%2520y%253D%2522260%2522%2520width%253D%2522120%2522%2520height%253D%252250%2522%2520as%253D%2522geometry%2522%252F%253E%253C%252FmxCell%253E%253C%252Froot%253E%253C%252FmxGraphModel%253E%26lt%3B%2Fspan%26gt%3Bor%20choose%26lt%3Bspan%20style%3D%26quot%3Bcolor%3A%20rgba(0%2C%200%2C%200%2C%200)%3B%20font-family%3A%20monospace%3B%20font-size%3A%200px%3B%20text-align%3A%20start%3B%20text-wrap%3A%20nowrap%3B%26quot%3B%26gt%3B%253CmxGraphModel%253E%253Croot%253E%253CmxCell%2520id%253D%25220%2522%252F%253E%253CmxCell%2520id%253D%25221%2522%2520parent%253D%25220%2522%252F%253E%253CmxCell%2520id%253D%25222%2522%2520value%253D%2522Question%2520service%2522%2520style%253D%2522shape%253Dmodule%253Balign%253Dleft%253BspacingLeft%253D20%253Balign%253Dcenter%253BverticalAlign%253Dtop%253BwhiteSpace%253Dwrap%253Bhtml%253D1%253B%2522%2520vertex%253D%25221%2522%2520parent%253D%25221%2522%253E%253CmxGeometry%2520x%253D%2522190%2522%2520y%253D%2522260%2522%2520width%253D%2522120%2522%2520height%253D%252250%2522%2520as%253D%2522geometry%2522%252F%253E%253C%252FmxCell%253E%253C%252Froot%253E%253C%252FmxGraphModel%253E%26lt%3B%2Fspan%26gt%3Br%26lt%3Bspan%20style%3D%26quot%3Bcolor%3A%20rgba(0%2C%200%2C%200%2C%200)%3B%20font-family%3A%20monospace%3B%20font-size%3A%200px%3B%20text-align%3A%20start%3B%20text-wrap%3A%20nowrap%3B%26quot%3B%26gt%3B%253CmxGraphModel%253E%253Croot%253E%253CmxCell%2520id%253D%25220%2522%252F%253E%253CmxCell%2520id%253D%25221%2522%2520parent%253D%25220%2522%252F%253E%253CmxCell%2520id%253D%25222%2522%2520value%253D%2522Question%2520service%2522%2520style%253D%2522shape%253Dmodule%253Balign%253Dleft%253BspacingLeft%253D20%253Balign%253Dcenter%253BverticalAlign%253Dtop%253BwhiteSpace%253Dwrap%253Bhtml%253D1%253B%2522%2520vertex%253D%25221%2522%2520parent%253D%25221%2522%253E%253CmxGeometry%2520x%253D%2522190%2522%2520y%253D%2522260%2522%2520width%253D%2522120%2522%2520height%253D%252250%2522%2520as%253D%2522geometry%2522%252F%253E%253C%252FmxCell%253E%253C%252Froot%253E%253C%252FmxGraphModel%253E%26lt%3B%2Fspan%26gt%3B%22%20style%3D%22shape%3Dmodule%3Balign%3Dleft%3BspacingLeft%3D20%3Balign%3Dcenter%3BverticalAlign%3Dtop%3BwhiteSpace%3Dwrap%3Bhtml%3D1%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%22354%22%20y%3D%22250%22%20width%3D%22120%22%20height%3D%2250%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3C%2Froot%3E%3C%2FmxGraphModel%3Equestion%3CmxGraphModel%3E%3Croot%3E%3CmxCell%20id%3D%220%22%2F%3E%3CmxCell%20id%3D%221%22%20parent%3D%220%22%2F%3E%3CmxCell%20id%3D%222%22%20value%3D%22Generat%26lt%3Bspan%20style%3D%26quot%3Bcolor%3A%20rgba(0%2C%200%2C%200%2C%200)%3B%20font-family%3A%20monospace%3B%20font-size%3A%200px%3B%20text-align%3A%20start%3B%20text-wrap%3A%20nowrap%3B%26quot%3B%26gt%3B%253CmxGraphModel%253E%253Croot%253E%253CmxCell%2520id%253D%25220%2522%252F%253E%253CmxCell%2520id%253D%25221%2522%2520parent%253D%25220%2522%252F%253E%253CmxCell%2520id%253D%25222%2522%2520value%253D%2522Question%2520service%2522%2520style%253D%2522shape%253Dmodule%253Balign%253Dleft%253BspacingLeft%253D20%253Balign%253Dcenter%253BverticalAlign%253Dtop%253BwhiteSpace%253Dwrap%253Bhtml%253D1%253B%2522%2520vertex%253D%25221%2522%2520parent%253D%25221%2522%253E%253CmxGeometry%2520x%253D%2522190%2522%2520y%253D%2522260%2522%2520width%253D%2522120%2522%2520height%253D%252250%2522%2520as%253D%2522geometry%2522%252F%253E%253C%252FmxCell%253E%253C%252Froot%253E%253C%252FmxGraphModel%253E%26lt%3B%2Fspan%26gt%3Bor%20choose%26lt%3Bspan%20style%3D%26quot%3Bcolor%3A%20rgba(0%2C%200%2C%200%2C%200)%3B%20font-family%3A%20monospace%3B%20font-size%3A%200px%3B%20text-align%3A%20start%3B%20text-wrap%3A%20nowrap%3B%26quot%3B%26gt%3B%253CmxGraphModel%253E%253Croot%253E%253CmxCell%2520id%253D%25220%2522%252F%253E%253CmxCell%2520id%253D%25221%2522%2520parent%253D%25220%2522%252F%253E%253CmxCell%2520id%253D%25222%2522%2520value%253D%2522Question%2520service%2522%2520style%253D%2522shape%253Dmodule%253Balign%253Dleft%253BspacingLeft%253D20%253Balign%253Dcenter%253BverticalAlign%253Dtop%253BwhiteSpace%253Dwrap%253Bhtml%253D1%253B%2522%2520vertex%253D%25221%2522%2520parent%253D%25221%2522%253E%253CmxGeometry%2520x%253D%2522190%2522%2520y%253D%2522260%2522%2520width%253D%2522120%2522%2520height%253D%252250%2522%2520as%253D%2522geometry%2522%252F%253E%253C%252FmxCell%253E%253C%252Froot%253E%253C%252FmxGraphModel%253E%26lt%3B%2Fspan%26gt%3Br%26lt%3Bspan%20style%3D%26quot%3Bcolor%3A%20rgba(0%2C%200%2C%200%2C%200)%3B%20font-family%3A%20monospace%3B%20font-size%3A%200px%3B%20text-align%3A%20start%3B%20text-wrap%3A%20nowrap%3B%26quot%3B%26gt%3B%253CmxGraphModel%253E%253Croot%253E%253CmxCell%2520id%253D%25220%2522%252F%253E%253CmxCell%2520id%253D%25221%2522%2520parent%253D%25220%2522%252F%253E%253CmxCell%2520id%253D%25222%2522%2520value%253D%2522Question%2520service%2522%2520style%253D%2522shape%253Dmodule%253Balign%253Dleft%253BspacingLeft%253D20%253Balign%253Dcenter%253BverticalAlign%253Dtop%253BwhiteSpace%253Dwrap%253Bhtml%253D1%253B%2522%2520vertex%253D%25221%2522%2520parent%253D%25221%2522%253E%253CmxGeometry%2520x%253D%2522190%2522%2520y%253D%2522260%2522%2520width%253D%2522120%2522%2520height%253D%252250%2522%2520as%253D%2522geometry%2522%252F%253E%253C%252FmxCell%253E%253C%252Froot%253E%253C%252FmxGraphModel%253E%26lt%3B%2Fspan%26gt%3B%22%20style%3D%22shape%3Dmodule%3Balign%3Dleft%3BspacingLeft%3D20%3Balign%3Dcenter%3BverticalAlign%3Dtop%3BwhiteSpace%3Dwrap%3Bhtml%3D1%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%22354%22%20y%3D%22250%22%20width%3D%22120%22%20height%3D%2250%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3C%2Froot%3E%3C%2FmxGraphModel%3Es
%3CmxGraph...
question generators
question generators
Gateway service
Gateway servi...
Gets data
Gets data
Text is not SVG - cannot display
\ No newline at end of file diff --git a/docs/images/05-Webapp.svg b/docs/images/05-Webapp.svg new file mode 100644 index 00000000..f9e376b8 --- /dev/null +++ b/docs/images/05-Webapp.svg @@ -0,0 +1,4 @@ + + + +
Whitebox webapp service
Whitebox webapp service
Gateway service
Gateway servi...
App
App
Register
Register
Login
Login
Clasico%3CmxGraphModel%3E%3Croot%3E%3CmxCell%20id%3D%220%22%2F%3E%3CmxCell%20id%3D%221%22%20parent%3D%220%22%2F%3E%3CmxCell%20id%3D%222%22%20value%3D%22Register%22%20style%3D%22shape%3Dmodule%3Balign%3Dleft%3BspacingLeft%3D20%3Balign%3Dcenter%3BverticalAlign%3Dtop%3BwhiteSpace%3Dwrap%3Bhtml%3D1%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%22450%22%20y%3D%22270%22%20width%3D%22100%22%20height%3D%2250%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3C%2Froot%3E%3C%2FmxGraphModel%3E
Clasico%3CmxG...
Batería de sabios%3CmxGraphModel%3E%3Croot%3E%3CmxCell%20id%3D%220%22%2F%3E%3CmxCell%20id%3D%221%22%20parent%3D%220%22%2F%3E%3CmxCell%20id%3D%222%22%20value%3D%22Clasico%26lt%3Bspan%20style%3D%26quot%3Bcolor%3A%20rgba(0%2C%200%2C%200%2C%200)%3B%20font-family%3A%20monospace%3B%20font-size%3A%200px%3B%20text-align%3A%20start%3B%20text-wrap%3A%20nowrap%3B%26quot%3B%26gt%3B%253CmxGraphModel%253E%253Croot%253E%253CmxCell%2520id%253D%25220%2522%252F%253E%253CmxCell%2520id%253D%25221%2522%2520parent%253D%25220%2522%252F%253E%253CmxCell%2520id%253D%25222%2522%2520value%253D%2522Register%2522%2520style%253D%2522shape%253Dmodule%253Balign%253Dleft%253BspacingLeft%253D20%253Balign%253Dcenter%253BverticalAlign%253Dtop%253BwhiteSpace%253Dwrap%253Bhtml%253D1%253B%2522%2520vertex%253D%25221%2522%2520parent%253D%25221%2522%253E%253CmxGeometry%2520x%253D%2522450%2522%2520y%253D%2522270%2522%2520width%253D%2522100%2522%2520height%253D%252250%2522%2520as%253D%2522geometry%2522%252F%253E%253C%252FmxCell%253E%253C%252Froot%253E%253C%252FmxGraphModel%253E%26lt%3B%2Fspan%26gt%3B%22%20style%3D%22shape%3Dmodule%3Balign%3Dleft%3BspacingLeft%3D20%3Balign%3Dcenter%3BverticalAlign%3Dtop%3BwhiteSpace%3Dwrap%3Bhtml%3D1%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%22580%22%20y%3D%22270%22%20width%3D%22100%22%20height%3D%2250%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3C%2Froot%3E%3C%2FmxGraphModel%3E
Batería de sa...
Calculadora humana
Calculadora h...
Config%3CmxGraphModel%3E%3Croot%3E%3CmxCell%20id%3D%220%22%2F%3E%3CmxCell%20id%3D%221%22%20parent%3D%220%22%2F%3E%3CmxCell%20id%3D%222%22%20value%3D%22Calculadora%20humana%22%20style%3D%22shape%3Dmodule%3Balign%3Dleft%3BspacingLeft%3D20%3Balign%3Dcenter%3BverticalAlign%3Dtop%3BwhiteSpace%3Dwrap%3Bhtml%3D1%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%22450%22%20y%3D%22200%22%20width%3D%22100%22%20height%3D%2250%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3C%2Froot%3E%3C%2FmxGraphModel%3E
Config%3CmxGr...
Home%3CmxGraphModel%3E%3Croot%3E%3CmxCell%20id%3D%220%22%2F%3E%3CmxCell%20id%3D%221%22%20parent%3D%220%22%2F%3E%3CmxCell%20id%3D%222%22%20value%3D%22Config%26lt%3Bspan%20style%3D%26quot%3Bcolor%3A%20rgba(0%2C%200%2C%200%2C%200)%3B%20font-family%3A%20monospace%3B%20font-size%3A%200px%3B%20text-align%3A%20start%3B%20text-wrap%3A%20nowrap%3B%26quot%3B%26gt%3B%253CmxGraphModel%253E%253Croot%253E%253CmxCell%2520id%253D%25220%2522%252F%253E%253CmxCell%2520id%253D%25221%2522%2520parent%253D%25220%2522%252F%253E%253CmxCell%2520id%253D%25222%2522%2520value%253D%2522Calculadora%2520humana%2522%2520style%253D%2522shape%253Dmodule%253Balign%253Dleft%253BspacingLeft%253D20%253Balign%253Dcenter%253BverticalAlign%253Dtop%253BwhiteSpace%253Dwrap%253Bhtml%253D1%253B%2522%2520vertex%253D%25221%2522%2520parent%253D%25221%2522%253E%253CmxGeometry%2520x%253D%2522450%2522%2520y%253D%2522200%2522%2520width%253D%2522100%2522%2520height%253D%252250%2522%2520as%253D%2522geometry%2522%252F%253E%253C%252FmxCell%253E%253C%252Froot%253E%253C%252FmxGraphModel%253E%26lt%3B%2Fspan%26gt%3B%22%20style%3D%22shape%3Dmodule%3Balign%3Dleft%3BspacingLeft%3D20%3Balign%3Dcenter%3BverticalAlign%3Dtop%3BwhiteSpace%3Dwrap%3Bhtml%3D1%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%22580%22%20y%3D%22200%22%20width%3D%22100%22%20height%3D%2250%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3C%2Froot%3E%3C%2FmxGraphModel%3E
Home%3CmxGrap...
Perfil
Perfil
Ranking
Ranking
Sobre
Sobre
Social
Social
Stats
Stats
Stats service
Stats service
User service
User service
Question service
Question serv...
Text is not SVG - cannot display
\ No newline at end of file diff --git a/docs/src/04_solution_strategy.adoc b/docs/src/04_solution_strategy.adoc index b645009e..92047afe 100644 --- a/docs/src/04_solution_strategy.adoc +++ b/docs/src/04_solution_strategy.adoc @@ -17,9 +17,6 @@ A ranking with the maximum score of the user and can be compared with other user === Design The designed website is composed of a frontend in React, a backend in Node.js and is documented using Asciidoc. Each user will have their own account where their information will be saved. Design-related decisions are detailed in point 9. -=== Security -We guarantee the safety of the user - === Testability Tests will be carried out for each individual part of the application, thus ensuring the correct operation of the different modules both individually and together. diff --git a/docs/src/05_building_block_view.adoc b/docs/src/05_building_block_view.adoc index 0c3bfbd9..4cef4c33 100644 --- a/docs/src/05_building_block_view.adoc +++ b/docs/src/05_building_block_view.adoc @@ -7,13 +7,12 @@ ifndef::imagesdir[:imagesdir: ../images] === Whitebox Overall System -The code is broken down in a structured way by levels, in which the internal dependencies of each element are taught. The system is divided into Whitebox and Blackbox. +The code is broken down in a structured way by levels, in which the internal dependencies of each element are taught. The system is divided into Whitebox and Blackbox. -image::diagrama5.png["Hierarchy of building blocks"] +image::05-Overall.svg["Hierarchy of building blocks"] |=== | *_Actors_* | *_Description_* -| *_Admin_* | You have access to the entire app and can manage it to make it work properly. | *_User_* | It's the one that interacts directly with the app. |=== @@ -23,9 +22,28 @@ image::diagrama5.png["Hierarchy of building blocks"] |=== | *_Name_* | *_Description_* -| *_Interface_* | The interface with which the user interacts -| *_WikiData_* | Provide the questions that will be used in the app -| *_MongoDB_* | Store user data +| *_WIQ_* | The application which users will interact with. +| *_Wikidata API_* | The API that will provide data to the application, in order to generate the questions. +|=== + +=== Level 1 + +image::05-Level1.svg["Hierarchy of building blocks"] + + +The system is divided into nine components, each of which is responsible for a specific task. These components are. + +|=== +| *_Component_* | *_Description_* +| *_Webapp_* | The main component of the application, which will be responsible for the user interface and game logic. +| *_Gateway service_* | The component that will be responsible for the communication between the web application and the other microservices. +| *_Auth service_* | The component that will be responsible for the authentication of the users. +| *_User service_* | The component that will be responsible for the user data. +| *_Question service_* | The component that will be responsible for generating the questions. +| *_Stats service_* | The component that will be responsible for the statistics of the game. +| *_Prometheus service_* | The component that will be responsible for monitoring the application. +| *_Grafana service_* | The component that will be responsible for visualizing the monitoring data. +| *_MongoDB_* | The database that will store the user data. |=== === Level 2 @@ -37,10 +55,32 @@ image::diagrama5.2.png["Hierarchy of building blocks"] In this diagram we can see the decided microservices that will provide all the operations necessary for the application to work properly. +==== Question Service + +image::05-Question-service.svg["Hierarchy of building blocks"] + |=== -| *_Name_* | *_Description_* -| *_Game Service_* | It is the microservice that will be in charge of the correct functioning of the game and calculate the user's score. -| *_UserData Service_* | It is the microservice that provides the necessary user data. -| *_Authetification Service_* | It's a microservice that users use to sign in to your app. -| *_Question Service_* | It is the microservice that will generate the questions through the WikiData API. +| *_Building block_* | *_Description_* +| *_Question service_* | The component that will be responsible for receiving requests from gateway service and responding with the questions. +| *_Generator chooser_* | The component that will be responsible for generating generic generators, which will be used to generate the questions. +| *_Generic generator_* | The component that will be responsible for generating the questions about one specific topic. +|=== + +==== Webapp + +image::05-Webapp.svg["Hierarchy of building blocks"] + +|=== +| *_Building block_* | *_Description_* +| *_App_* | Main component of the application, which will be responsible for routing. +| *_Home_* | The component that will be responsible for the home page. +| *_Login_* | The component that will be responsible for the login page. +| *_Register_* | The component that will be responsible for the register page. +| *_Clasico_* | The component that will be responsible for the classic game mode. +| *_Batería de sabios_* | The component that will be responsible for the wise battery game mode. +| *_Calculadora_* | The component that will be responsible for the human calculator game mode. +| *_Stats_* | The component that will be responsible for the statistics page. +| *_Profile_* | The component that will be responsible for the profile page. +| *_Settings_* | The component that will be responsible for the settings page. +| *_Sobre_* | The component that will be responsible for the about page. |=== \ No newline at end of file diff --git a/docs/src/07_deployment_view.adoc b/docs/src/07_deployment_view.adoc index 80bec9dd..575f621c 100644 --- a/docs/src/07_deployment_view.adoc +++ b/docs/src/07_deployment_view.adoc @@ -54,4 +54,4 @@ Wikidata” is the API that you will use to obtain the data for the questions. W ==== WIkidata -"WikiData" is the API that you we willll use to obtain the data for the questions. Wikidata is a free and collaborative database that can be read and edited by both humans and machines. It provides a common source of certain types of data that can be used by Wikimedia projects. +"WikiData" is the API that you we will use to obtain the data for the questions. Wikidata is a free and collaborative database that can be read and edited by both humans and machines. It provides a common source of certain types of data that can be used by Wikimedia projects. From aabe40aae1827253da0802097db62a09fe0cea04 Mon Sep 17 00:00:00 2001 From: CANCI0 Date: Wed, 17 Apr 2024 16:53:07 +0200 Subject: [PATCH 17/18] Apartados 7 y 8 arreglados --- docs/images/08-Concepts.svg | 4 ++ docs/images/08-Domain.svg | 4 ++ docs/src/07_deployment_view.adoc | 20 +++--- docs/src/08_concepts.adoc | 116 +++++++------------------------ 4 files changed, 45 insertions(+), 99 deletions(-) create mode 100644 docs/images/08-Concepts.svg create mode 100644 docs/images/08-Domain.svg diff --git a/docs/images/08-Concepts.svg b/docs/images/08-Concepts.svg new file mode 100644 index 00000000..bbe84763 --- /dev/null +++ b/docs/images/08-Concepts.svg @@ -0,0 +1,4 @@ + + + +
Cross-cutting concepts
Cross-cutting concep...
Domain concepts
Domain concepts
Domain model
Domain model
Architecture and design patterns
Architecture and des...
User Experience
User Experience
User interface
User interface
Ergonomics%3CmxGraphModel%3E%3Croot%3E%3CmxCell%20id%3D%220%22%2F%3E%3CmxCell%20id%3D%221%22%20parent%3D%220%22%2F%3E%3CmxCell%20id%3D%222%22%20value%3D%22User%20interface%22%20style%3D%22ellipse%3BwhiteSpace%3Dwrap%3Bhtml%3D1%3Baspect%3Dfixed%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%22650%22%20y%3D%22210%22%20width%3D%22100%22%20height%3D%22100%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3C%2Froot%3E%3C%2FmxGraphModel%3E
Ergonomics%3CmxGraph...
Internacionalization
Internacionalization
Development concepts
Development concepts
Build, Test, Deploy
Build, Test, De...
Configurability
Configurability
Security and safety
Security and safety
Security
Security
Safety
Safety
Operation concepts
Operation concepts
Disaster-Recovery
Disaster-Reco...
Monitoring
Monitoring
Text is not SVG - cannot display
\ No newline at end of file diff --git a/docs/images/08-Domain.svg b/docs/images/08-Domain.svg new file mode 100644 index 00000000..5ec29f45 --- /dev/null +++ b/docs/images/08-Domain.svg @@ -0,0 +1,4 @@ + + + +
*
*
belongs to
belongs to
Group
Group
name : String
name : String
createdAt : Datetime
createdAt : Datetime
Game
Game
gamemode: String
gamemode: String
password: String
password: String
correctAnswers: int
correctAnswers: int
incorrectAnswers: int
incorrectAnswers: int
points: int
points: int
avgTime: double
avgTime: double
User
User
username: String
username: String
password: String
password: String
createdAt: Datetime
createdAt: Datetime
*
*
*
*
is friend of
is friend of
plays
plays
1
1
*
*
*
*
Stats
Stats
username : String
username : String
gamemode: String
gamemode: String
nGamesPlayed: int
nGamesPlayed: int
avgPoints: double
avgPoints: double
totalPoints: int
totalPoints: int
totalCorrectQuestions: int
totalCorrectQuestions: int
totalIncorrectQuestions: int
totalIncorrectQuestions: int
ratioCorrect: double
ratioCorrect: double
avgTime: double
avgTime: double
1
1
*
*
Text is not SVG - cannot display
\ No newline at end of file diff --git a/docs/src/07_deployment_view.adoc b/docs/src/07_deployment_view.adoc index 575f621c..9ecf5f47 100644 --- a/docs/src/07_deployment_view.adoc +++ b/docs/src/07_deployment_view.adoc @@ -22,36 +22,36 @@ This container is responsible for the user interface. ==== Question Generator -"Link" is the part of the application that connects the rest of the parts. This will facilitate the use of the different parts of the application in the App section. +Question generator is the part of the application that generates the questions for the users. ==== User Service -"Register" is the part of the application that handles user registration and login. It's very important as it's the first thing a potential user will encounter when they visit our page. +User Service is the part of the application that handles users information. ==== Auth Service -"User service" is the part of the application that generates the various services within the application to the user, such as a ranking, correctly answered questions, and so on. +Auth Service is the part of the application that handles the authentication of the users. It's very important as it's the first thing a potential user will encounter when they visit our page. ==== Stats Service -"Question generator" is the part of the application that, using the data from Wikidata and some pre-created templates, generates the questions and possible answers of the application. +Stats Service is the part of the application that handles the statistics of the users. ==== Gateway service -Wikidata” is the API that you will use to obtain the data for the questions. Wikidata is a free and collaborative database that can be read and edited by both humans and machines. It provides a common source of certain types of data that can be used by Wikimedia projects. +Gateway service is the part of the application that handles the communication between the different parts of the application. ==== MongoDB -"MongoDB" is the database that will store the data of the users, the questions, the answers, and the statistics of the application. +MongoDB is the database that will store the data of the users, the questions, the answers, and the statistics of the application. ==== Prometheus -"Prometheus" is the monitoring tool that will be used to monitor the application. +Prometheus is the monitoring tool that will be used to monitor the application. ==== Grafana -"Grafana" is the visualization tool that will be used to visualize the monitoring of the application. +Grafana is the visualization tool that will be used to visualize the monitoring of the application. -==== WIkidata +==== Wikidata -"WikiData" is the API that you we will use to obtain the data for the questions. Wikidata is a free and collaborative database that can be read and edited by both humans and machines. It provides a common source of certain types of data that can be used by Wikimedia projects. +WikiData is the API that you we will use to obtain the data for the questions. Wikidata is a free and collaborative database that can be read and edited by both humans and machines. It provides a common source of certain types of data that can be used by Wikimedia projects. diff --git a/docs/src/08_concepts.adoc b/docs/src/08_concepts.adoc index 53562a23..c24281c8 100644 --- a/docs/src/08_concepts.adoc +++ b/docs/src/08_concepts.adoc @@ -3,123 +3,61 @@ ifndef::imagesdir[:imagesdir: ../images] [[section-concepts]] == Cross-cutting Concepts +=== Domain Concepts -[role="arc42help"] -**** -.Content -This section describes overall, principal regulations and solution ideas that are relevant in multiple parts (= cross-cutting) of your system. -Such concepts are often related to multiple building blocks. -They can include many different topics, such as +This is the actual domain of the application, which is the area of knowledge or activity that the application is designed to support. In this case, the domain is quiz games, which are games that test the player's knowledge on a specific topic. -* models, especially domain models -* architecture or design patterns -* rules for using specific technology -* principal, often technical decisions of an overarching (= cross-cutting) nature -* implementation rules +image::08-Domain.svg[Domain] +=== Architecture and Design Patterns -.Motivation -Concepts form the basis for _conceptual integrity_ (consistency, homogeneity) of the architecture. -Thus, they are an important contribution to achieve inner qualities of your system. +The project follows a microservices architecture, which is a design pattern that structures an application as a collection of loosely coupled services. This makes the application more scalable, flexible, and easier to maintain. -Some of these concepts cannot be assigned to individual building blocks, e.g. security or safety. +=== User Experience (UX) - -.Form -The form can be varied: - -* concept papers with any kind of structure -* cross-cutting model excerpts or scenarios using notations of the architecture views -* sample implementations, especially for technical concepts -* reference to typical usage of standard frameworks (e.g. using Hibernate for object/relational mapping) - -.Structure -A potential (but not mandatory) structure for this section could be: - -* Domain concepts -* User Experience concepts (UX) -* Safety and security concepts -* Architecture and design patterns -* "Under-the-hood" -* development concepts -* operational concepts - -Note: it might be difficult to assign individual concepts to one specific topic -on this list. - -image::08-Crosscutting-Concepts-Structure-EN.png["Possible topics for crosscutting concepts"] - - -.Further Information - -See https://docs.arc42.org/section-8/[Concepts] in the arc42 documentation. -**** - - -=== User Interface +==== User Interface A user interface is the space where a human and a computer or device communicate and exchange information The user interface is the part of the application that directly interacts with the client, in our case, the player. It should function correctly and be user-friendly. -=== Ergonomics -Ergonomics is the science of designing and arranging workplaces, products, and systems to fit and adapt to the people who use them. Ergonomics aims to improve comfort, efficiency, and safety by considering human physical and psychological needs and limitations. - -=== Internationalization - -Internationalization is the practice of designing and developing applications that can support multiple languages, formats, and conventions. - -Internationalization consists of adapting to the language and culture depending on the location, this is very important as it helps users from different regions to be able to use our game - -=== Security - -Security is a broad term that can refer to different aspects of protection, resilience, or prevention of harm. +==== Ergonomics -A minimum of security in the application is important to save our customers' data -=== Safety - -Is the state of being protected from danger or harm. - -=== Build, Test, Deploy - -- Build: This stage involves compiling, validating, and packaging the source code into executable or deployable artifacts. -- Test: This stage involves running various tests, such as unit tests, integration tests, and regression tests, to ensure the quality and functionality of the software. -- Deploy: This stage involves delivering or releasing the software to the target environment, such as a server, a cloud platform, or a user device. - -=== Code Generation +Ergonomics is the science of designing and arranging workplaces, products, and systems to fit and adapt to the people who use them. Ergonomics aims to improve comfort, efficiency, and safety by considering human physical and psychological needs and limitations. -Code generation is the process of creating executable or deployable code from various sources of information, such as natural language, images, or other code. +==== Internationalization -Generating code makes it easier for the programmer to create functions without wasting a lot of time and simply focusing on the correct implementation of the code, an example is for example generating the getters and setters +The application should be able to support multiple languages and regions, so that it can be used by people from different countries and cultures. As of today it has been translated into Spanish and English. -=== Migration +=== Development Concepts -Migrating from one software application or platform to another, such as switching from a legacy system to a modern one, or from a local server to a cloud service. +==== Build, Test, Deploy -=== Configurability +The project follows a CI/CD pipeline that automates the build, test, and deployment processes. This ensures that the application is always up-to-date and working correctly. -Configurability is the ability to modify or customize something, especially in computing, electronics, or devices +==== Configurability -=== Administration +The project has a configuration file that allows the developer to generate new types of questions just by modifying the file. This makes the application more flexible to topic addition. -The process or activity of managing, directing, or organizing something or someone. +=== Security and safety -Administering an application consists of managing all the resources, users to be able to maintain it in a correct way +==== Security -=== Management +The app REST API verifies the user's identity and permissions before allowing access to the resources. It also prevents sensitive data from being exposed to unauthorized users. This ensures that the application is secure and protects the user's data. -Management is the process of organizing and directing the resources of a business or organization to achieve its goals. +==== Safety -=== Disaster-Recovery +The application has a backup system that automatically saves the user's progress in case of a failure. This ensures that the user's data is always safe and can be recovered in case of a problem. -Is the process of restoring the functionality and data of software applications after a disaster, such as a natural calamity, a cyberattack, or a human error. +=== Operation concepts -It is important to have a plan to recover the data in case of a system failure, it is usually a backup. +==== Disaster-Recovery -=== Architecture and design patterns +App containers have restart policies that automatically restart the container in case of a failure. This ensures that the application is always available and running despite any failures. -Architecture and design patterns are concepts that help software developers and architects design and build software systems that are efficient, scalable, and maintainable. +==== Monitoring -Design patterns are important so that your application can scale without cascading changes. +The application has a monitoring system that tracks the performance and availability of the application. This allows the developer to identify and fix any issues before they affect the user's experience. +image::08-Concepts.svg[Architecture] From a214758dc93fdeb2c715fee6e8ff6349177b64b7 Mon Sep 17 00:00:00 2001 From: CANCI0 Date: Wed, 17 Apr 2024 16:57:16 +0200 Subject: [PATCH 18/18] =?UTF-8?q?=C3=9Altimos=20puntos=20actualizados?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/src/09_architecture_decisions.adoc | 19 ++++++++++--------- docs/src/11_technical_risks.adoc | 2 +- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/docs/src/09_architecture_decisions.adoc b/docs/src/09_architecture_decisions.adoc index b0d39ed9..acce062f 100644 --- a/docs/src/09_architecture_decisions.adoc +++ b/docs/src/09_architecture_decisions.adoc @@ -2,34 +2,35 @@ ifndef::imagesdir[:imagesdir: ../images] [[section-design-decisions]] == Architecture Decisions -JavaScript: + +=== JavaScript https://github.com/Arquisoft/wiq_es1a/wiki/(ADR-%231)-JavaScript[ADR#1] -ReactJS: +=== ReactJS https://github.com/Arquisoft/wiq_es1a/wiki/(ADR-%232)-ReactJS[ADR#2] -NodeJS: +=== NodeJS https://github.com/Arquisoft/wiq_es1a/wiki/(ADR-%233)-NodeJS[ADR#3] -MongoDB: +=== MongoDB https://github.com/Arquisoft/wiq_es1a/wiki/(ADR-%234)-MongoDB[ADR#4] -Docker: +=== Docker https://github.com/Arquisoft/wiq_es1a/wiki/(ADR-%235)-Docker[ADR#5] -MySQL: +=== MySQL https://github.com/Arquisoft/wiq_es1a/wiki/(ADR-%236)-MySQL[ADR#6] -Chakra UI: +=== Chakra UI https://github.com/Arquisoft/wiq_es1a/wiki/(ADR-%237)-Chakra-UI[ADR#7] -BDD de estadísticas: +=== BDD de estadísticas -https://github.com/Arquisoft/wiq_es1a/wiki/(ADR-%238)-BD-de-estad%C3%ADsticas +https://github.com/Arquisoft/wiq_es1a/wiki/(ADR-%238)-BD-de-estad%C3%ADsticas[ADR#8] diff --git a/docs/src/11_technical_risks.adoc b/docs/src/11_technical_risks.adoc index 0af49a6f..aca5efe1 100644 --- a/docs/src/11_technical_risks.adoc +++ b/docs/src/11_technical_risks.adoc @@ -9,7 +9,7 @@ ifndef::imagesdir[:imagesdir: ../images] | High | Potential application malfunctions | Implement unit tests for key components and critical functions, along with extensive testing with real users | Medium | Slow performance of database queries | Optimize database queries, avoid unnecessary queries | Medium | Potential unavailability of Wikidata | Design the UI to handle missing or incomplete data from Wikidata. -| Low | Unoptimized styles | Optimize CSS styles to improve application performance and loading times +| Low | Unoptimized styles | Optimize styles to improve application performance and loading times | Low | Insufficient documentation | Provide comprehensive documentation of architecture, code structure, development processes, and deployment to facilitate team maintenance and collaboration | Low | Vulnerabilities in user authentication | Implement additional security measures, such as password encryption |===