From 500baa59b8e283960dd70876b16d0cb649b93686 Mon Sep 17 00:00:00 2001 From: Gonzalo Alonso Fernandez Date: Fri, 2 Feb 2024 17:48:10 +0100 Subject: [PATCH 01/55] chore: Add my name to the readme --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 5b42a0b5..950ef4c0 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,9 @@ This is a base repo for the [Software Architecture course](http://arquisoft.github.io/) in [2023/2024 edition](https://arquisoft.github.io/course2324.html). +## Contributors +Gonzalo Alonso Fernández - UO282104 + This repo is a basic application composed of several components. - **Gateway service**. Express service that is exposed to the public and serves as a proxy to the two previous ones. From dd129f1fc28046aad6891b52eaac864f3a5ba92e Mon Sep 17 00:00:00 2001 From: Sergio Rodriguez Date: Fri, 2 Feb 2024 18:03:32 +0100 Subject: [PATCH 02/55] chore: Add my name to the readme --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 5b42a0b5..bbf07c90 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,10 @@ This is a base repo for the [Software Architecture course](http://arquisoft.github.io/) in [2023/2024 edition](https://arquisoft.github.io/course2324.html). +## Contributors +Gonzalo Alonso Fernández - UO282104 +Sergio Rodríguez García - UO282598 + This repo is a basic application composed of several components. - **Gateway service**. Express service that is exposed to the public and serves as a proxy to the two previous ones. From ca17abed580b532f300db31e1d3b56a39867e44c Mon Sep 17 00:00:00 2001 From: jjgancfer Date: Fri, 2 Feb 2024 18:20:57 +0100 Subject: [PATCH 03/55] chore: add my name to the readme --- README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index bbf07c90..d29edf4a 100644 --- a/README.md +++ b/README.md @@ -7,8 +7,11 @@ This is a base repo for the [Software Architecture course](http://arquisoft.github.io/) in [2023/2024 edition](https://arquisoft.github.io/course2324.html). ## Contributors -Gonzalo Alonso Fernández - UO282104 -Sergio Rodríguez García - UO282598 +| Nombre | UO | +|--------|----| +| Gonzalo Alonso Fernández | UO282104 | +| Sergio Rodríguez García | UO282598 | +| Jorge Joaquín Gancedo Fernández | UO282161 | This repo is a basic application composed of several components. From 459f778342d4e0a8eff85e17218c86e82b376eda Mon Sep 17 00:00:00 2001 From: UO288090 Date: Sat, 3 Feb 2024 17:06:13 +0100 Subject: [PATCH 04/55] chore: add name to contributors in README --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index d29edf4a..f09fd34b 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ This is a base repo for the [Software Architecture course](http://arquisoft.gith | Gonzalo Alonso Fernández | UO282104 | | Sergio Rodríguez García | UO282598 | | Jorge Joaquín Gancedo Fernández | UO282161 | +| Sergio Quintana Fernández | UO288090 | This repo is a basic application composed of several components. From efd0dfe48f8b4c6708e08c6469bd28ed6a8f7a24 Mon Sep 17 00:00:00 2001 From: Dario Date: Sat, 3 Feb 2024 19:51:48 +0100 Subject: [PATCH 05/55] chore: name in README.md --- README.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index f09fd34b..34fd9828 100644 --- a/README.md +++ b/README.md @@ -7,12 +7,13 @@ This is a base repo for the [Software Architecture course](http://arquisoft.github.io/) in [2023/2024 edition](https://arquisoft.github.io/course2324.html). ## Contributors -| Nombre | UO | -|--------|----| -| Gonzalo Alonso Fernández | UO282104 | -| Sergio Rodríguez García | UO282598 | +| Nombre | UO | +|---------------------------------|----------| +| Gonzalo Alonso Fernández | UO282104 | +| Darío Gutiérrez Mori | UO282435 | +| Sergio Rodríguez García | UO282598 | | Jorge Joaquín Gancedo Fernández | UO282161 | -| Sergio Quintana Fernández | UO288090 | +| Sergio Quintana Fernández | UO288090 | This repo is a basic application composed of several components. From 6f036c9f445ac0ca362995fc809e7dad76ffc06c Mon Sep 17 00:00:00 2001 From: Diego Villanueva <98838739+UO283615@users.noreply.github.com> Date: Sun, 4 Feb 2024 10:31:17 +0100 Subject: [PATCH 06/55] Added my name to the readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 34fd9828..f1dab6f8 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,7 @@ This is a base repo for the [Software Architecture course](http://arquisoft.gith | Sergio Rodríguez García | UO282598 | | Jorge Joaquín Gancedo Fernández | UO282161 | | Sergio Quintana Fernández | UO288090 | +| Diego Villanueva Berros | UO283615 | This repo is a basic application composed of several components. From 06b10640292e18c84bd8e9732da6d858d0b1068b Mon Sep 17 00:00:00 2001 From: Diego Villanueva <98838739+UO283615@users.noreply.github.com> Date: Fri, 9 Feb 2024 18:18:41 +0100 Subject: [PATCH 07/55] chore: Updated section 2 Written the first version of the section 2 of the documentation. --- docs/src/02_architecture_constraints.adoc | 40 ++++++++++++++--------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/docs/src/02_architecture_constraints.adoc b/docs/src/02_architecture_constraints.adoc index 226e501f..1269b079 100644 --- a/docs/src/02_architecture_constraints.adoc +++ b/docs/src/02_architecture_constraints.adoc @@ -6,22 +6,30 @@ ifndef::imagesdir[:imagesdir: ../images] [role="arc42help"] **** -.Contents -Any requirement that constraints software architects in their freedom of design and implementation decisions or decision about the development process. These constraints sometimes go beyond individual systems and are valid for whole organizations and companies. +The application must be developed according to some constraints that were defined by the professors. These constraints are meant to be the cornerstones of our project as they are mandatory and provide a baseline to work on. The following tables will define the constraints. + + +*Technical constraints* +|=== +| *Constraint* | *Description* +| Web accesible front-end | The application must be possible to access through a web browser +| Use of WikiData | The system must make use of WikiData to gather information +| Automatic questions | The questions prompted by the game must be generated automatically +|=== + +*Organizational constraints* +|=== +| *Constraint* | *Description* +| Weekly meetings | Each class week, the team must meet and discuss the development +| Use of GitHub | GitHub must be used to communicate and keep track of the development process +| Deliverables | The project will be reviewed by the professors on three occasions +|=== + +*Conventional constraints* +|=== +| *Constraint* | *Description* +| Documentation in Arc42 | The documentation must follow the Arc42 template +|=== -.Motivation -Architects should know exactly where they are free in their design decisions and where they must adhere to constraints. -Constraints must always be dealt with; they may be negotiable, though. - -.Form -Simple tables of constraints with explanations. -If needed you can subdivide them into -technical constraints, organizational and political constraints and -conventions (e.g. programming or versioning guidelines, documentation or naming conventions) - - -.Further Information - -See https://docs.arc42.org/section-2/[Architecture Constraints] in the arc42 documentation. **** From 9b20ea083324aacd05e362ccd61e0b323a7204d3 Mon Sep 17 00:00:00 2001 From: Diego Villanueva <98838739+UO283615@users.noreply.github.com> Date: Fri, 9 Feb 2024 18:20:20 +0100 Subject: [PATCH 08/55] chore: Updated section 8 Written first draft of the section 8 of the documentation, the domain model is temporal. --- docs/src/08_concepts.adoc | 116 +++++++++++++++++--------------------- 1 file changed, 53 insertions(+), 63 deletions(-) diff --git a/docs/src/08_concepts.adoc b/docs/src/08_concepts.adoc index 591ccf1f..6aa3a652 100644 --- a/docs/src/08_concepts.adoc +++ b/docs/src/08_concepts.adoc @@ -6,68 +6,58 @@ ifndef::imagesdir[:imagesdir: ../images] [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 -* 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 - -.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. - -Some of these concepts cannot be assigned to individual building blocks, e.g. security or safety. - - -.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. -**** - - -=== __ - -__ - - - -=== __ - -__ - -... - -=== __ - -__ +.Domain Model +These diagram is just a sketch, it should be replaced by a more accurate version upon discussion. + +[plantuml,"ConceptsDomainModel1",png] +---- +@startuml + +enum Category { + HISTORY + GEOGRAPHY + MATHS +} + +class Question{ + id: int + content: String + category: Category + language: String +} + +class User{ + id: int + name: String + email: String + password: String + answered: List +} + +class Score{ + user: User + rightRate: float + timeAvg: float + answeredQuestions: int +} + +User o--> Question +User --> Score + +@enduml +---- + +|=== +| Class | Explanation +| Question | The model of the questions +| User | The people using the application +| Score | A class that keeps tracks of each user scores +|=== + +.Architecture and design patterns +We decided to use a React based frontend with BootSpring for the backend, which will follow the model view controller pattern to make the code clear. + +.User Experience +As this is a game, the focus must be in user experience so players can have an enjoyable experience, for achieving this, the response time should be as low as possible and the interfaces should be intuitive and beautiful. From 0ce14794846a99e66501e3d420452bc49836e667 Mon Sep 17 00:00:00 2001 From: sergiorodriguezgarcia <113514397+sergiorodriguezgarcia@users.noreply.github.com> Date: Sat, 10 Feb 2024 12:10:10 +0100 Subject: [PATCH 09/55] chore: Updated section 9 First version of section 9 of the documentation --- docs/src/09_architecture_decisions.adoc | 31 ++++++++++--------------- 1 file changed, 12 insertions(+), 19 deletions(-) diff --git a/docs/src/09_architecture_decisions.adoc b/docs/src/09_architecture_decisions.adoc index 51e9aad9..f46b7986 100644 --- a/docs/src/09_architecture_decisions.adoc +++ b/docs/src/09_architecture_decisions.adoc @@ -6,30 +6,23 @@ ifndef::imagesdir[:imagesdir: ../images] [role="arc42help"] **** -.Contents -Important, expensive, large scale or risky architecture decisions including rationales. -With "decisions" we mean selecting one alternative based on given criteria. -Please use your judgement to decide whether an architectural decision should be documented -here in this central section or whether you better document it locally -(e.g. within the white box template of one building block). -Avoid redundancy. -Refer to section 4, where you already captured the most important decisions of your architecture. +|=== +|*Decision* |*Explanation* -.Motivation -Stakeholders of your system should be able to comprehend and retrace your decisions. +|React +|Offers a powerful combination of performance, flexibility, and developer experience, making it a popular choice for building modern web applications. One of the members of the group has already worked with it in the past. It allows us to build a good user interface for the application. -.Form -Various options: +|SpringBoot +|This choice is based on the extensive experience accumulated by our team in developing with Java, as well as the familiarity and comfort offered by the tools and practices associated with the Spring Boot ecosystem. -* ADR (https://cognitect.com/blog/2011/11/15/documenting-architecture-decisions[Documenting Architecture Decisions]) for every important decision -* List or table, ordered by importance and consequences or: -* more detailed in form of separate sections per decision +|PostgreSQL +|We have chosen to use the PostgreSQL database instead of MongoDB due to the relational nature of PostgreSQL, which offers a robust and coherent structure for storing and relating data. We made this decision to ensure data integrity, perform complex queries, and maintain consistency in our storage operations. -.Further Information +|React Libraries +|To enhance the efficiency and effectiveness of our development process, we've taken proactive steps to incorporate specific libraries into our project. These carefully chosen libraries, meticulously outlined in detail within issue #16. +|=== -See https://docs.arc42.org/section-9/[Architecture Decisions] in the arc42 documentation. -There you will find links and examples about ADR. -**** +**** \ No newline at end of file From 251143423c95073bf9c96144285984555c58600e Mon Sep 17 00:00:00 2001 From: sergiorodriguezgarcia <113514397+sergiorodriguezgarcia@users.noreply.github.com> Date: Sat, 10 Feb 2024 12:15:29 +0100 Subject: [PATCH 10/55] chore: Updated section 9 introduction Second version of the section 9 of the documentation. Now includes a brief explanation before the table --- docs/src/09_architecture_decisions.adoc | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/src/09_architecture_decisions.adoc b/docs/src/09_architecture_decisions.adoc index f46b7986..20dd037c 100644 --- a/docs/src/09_architecture_decisions.adoc +++ b/docs/src/09_architecture_decisions.adoc @@ -7,6 +7,7 @@ ifndef::imagesdir[:imagesdir: ../images] [role="arc42help"] **** +During the application development process, decisions had to be made as issues emerged. The most interesting design decisions are reflected in this architectural records: |=== |*Decision* |*Explanation* From 37ccf799c90432a00ec2f3c1d2c92247001077c3 Mon Sep 17 00:00:00 2001 From: sergiorodriguezgarcia <113514397+sergiorodriguezgarcia@users.noreply.github.com> Date: Sat, 10 Feb 2024 12:48:46 +0100 Subject: [PATCH 11/55] chore: Updated section 9 help Third version of the section 9 of the documentation. Deletion of the help part. --- docs/src/09_architecture_decisions.adoc | 6 ------ 1 file changed, 6 deletions(-) diff --git a/docs/src/09_architecture_decisions.adoc b/docs/src/09_architecture_decisions.adoc index 20dd037c..9bf87c3b 100644 --- a/docs/src/09_architecture_decisions.adoc +++ b/docs/src/09_architecture_decisions.adoc @@ -4,9 +4,6 @@ ifndef::imagesdir[:imagesdir: ../images] == Architecture Decisions -[role="arc42help"] -**** - During the application development process, decisions had to be made as issues emerged. The most interesting design decisions are reflected in this architectural records: |=== @@ -24,6 +21,3 @@ During the application development process, decisions had to be made as issues e |React Libraries |To enhance the efficiency and effectiveness of our development process, we've taken proactive steps to incorporate specific libraries into our project. These carefully chosen libraries, meticulously outlined in detail within issue #16. |=== - - -**** \ No newline at end of file From 28ddc8fa6bfae66bc02c053639a7754f57237356 Mon Sep 17 00:00:00 2001 From: sergiorodriguezgarcia <113514397+sergiorodriguezgarcia@users.noreply.github.com> Date: Sat, 10 Feb 2024 12:54:52 +0100 Subject: [PATCH 12/55] chore: Updated section 12 glossary Introduction of the terms from the section 9 to the glossary --- docs/src/12_glossary.adoc | 37 +++++++------------------------------ 1 file changed, 7 insertions(+), 30 deletions(-) diff --git a/docs/src/12_glossary.adoc b/docs/src/12_glossary.adoc index 192b2353..6bf7565d 100644 --- a/docs/src/12_glossary.adoc +++ b/docs/src/12_glossary.adoc @@ -3,40 +3,17 @@ ifndef::imagesdir[:imagesdir: ../images] [[section-glossary]] == Glossary -[role="arc42help"] -**** -.Contents -The most important domain and technical terms that your stakeholders use when discussing the system. - -You can also see the glossary as source for translations if you work in multi-language teams. - -.Motivation -You should clearly define your terms, so that all stakeholders - -* have an identical understanding of these terms -* do not use synonyms and homonyms - - -.Form - -A table with columns and . - -Potentially more columns in case you need translations. - - -.Further Information - -See https://docs.arc42.org/section-12/[Glossary] in the arc42 documentation. - -**** [cols="e,2e" options="header"] |=== |Term |Definition -| -| +|React +|An open-source JavaScript library for developing user interfaces. It can be used to develop web applications, and it has to be complemented with other libraries to develop full-fledged products. + +|SpringBoot +|Java Spring Boot (Spring Boot) is a tool that makes developing web application and microservices with Spring Framework faster and easier through three core capabilities: Autoconfiguration, an opinionated approach to configuration, the ability to create standalone applications. -| -| +|PostgreSQL +|Object-relational database management system (ORDMBS), which means that it has relational capabilities and an object-oriented design |=== From 0bc70d6e9cb568e077a98839ba094ec06f927c59 Mon Sep 17 00:00:00 2001 From: Dario Date: Sat, 10 Feb 2024 23:06:57 +0100 Subject: [PATCH 13/55] chore: documentation section 3 --- docs/diagrams/BusinessContextDiagram.puml | 18 ++++++ docs/diagrams/ContainerDiagram.puml | 24 ++++++++ docs/diagrams/TechnicalContextDiagram.puml | 23 +++++++ docs/src/03_system_scope_and_context.adoc | 71 ++-------------------- 4 files changed, 71 insertions(+), 65 deletions(-) create mode 100644 docs/diagrams/BusinessContextDiagram.puml create mode 100644 docs/diagrams/ContainerDiagram.puml create mode 100644 docs/diagrams/TechnicalContextDiagram.puml diff --git a/docs/diagrams/BusinessContextDiagram.puml b/docs/diagrams/BusinessContextDiagram.puml new file mode 100644 index 00000000..2a2fbdf7 --- /dev/null +++ b/docs/diagrams/BusinessContextDiagram.puml @@ -0,0 +1,18 @@ +@startuml +!includeurl https://raw.githubusercontent.com/RicardoNiepel/C4-PlantUML/master/C4_Container.puml +!include + +title Context Diagram for the WIQ System +LAYOUT_WITH_LEGEND() + +'Containers +Person(player, Player,"An authenticated player that wants to play WIQ games") + +Container(wiq, "WIQ Application","", "Application that allows the users to play WIQ games") + +System_Ext(wikidata,"WikiData API","Contains the information used for the question generation") + +'RELATIONS +Rel(player,wiq,"Plays games") +Rel(wiq,wikidata,"Asks for data for question generation") +@enduml \ No newline at end of file diff --git a/docs/diagrams/ContainerDiagram.puml b/docs/diagrams/ContainerDiagram.puml new file mode 100644 index 00000000..e0bd97a1 --- /dev/null +++ b/docs/diagrams/ContainerDiagram.puml @@ -0,0 +1,24 @@ +@startuml +!includeurl https://raw.githubusercontent.com/RicardoNiepel/C4-PlantUML/master/C4_Container.puml +!include + +title Context Diagram for the WIQ System +LAYOUT_WITH_LEGEND() + +'Containers +Person(player, Player,"An authenticated player that wants to play WIQ games") + +System_Boundary(wiq,"WIQ"){ + Container(web_app, "WIQ Client", "React, Typescript", "Allows the user to play WIQ games") + Container(backend_api, "WIQ REST API","Java SpringBoot 3","Handles the users, game logic and question generation") + ContainerDb(database,"WIQ Database","PostgreSQL","Stores users, questions and other game info") +} + +System_Ext(wikidata,"WikiData API","Contains the information used for the question generation") + +'RELATIONS +Rel(player,web_app,"Uses","HTTPS") +Rel(backend_api,wikidata,"Asks for data","SPARQL,HTTPS") +Rel(web_app,backend_api,"Asks for user/game information","JSON,HTTPS") +Rel(backend_api,database,"Stores game/user information","JPA") +@enduml \ No newline at end of file diff --git a/docs/diagrams/TechnicalContextDiagram.puml b/docs/diagrams/TechnicalContextDiagram.puml new file mode 100644 index 00000000..0c035bb9 --- /dev/null +++ b/docs/diagrams/TechnicalContextDiagram.puml @@ -0,0 +1,23 @@ +@startuml +!includeurl https://raw.githubusercontent.com/RicardoNiepel/C4-PlantUML/master/C4_Container.puml +!include + +title Context Diagram for the WIQ System +LAYOUT_WITH_LEGEND() + +'Containers +Person(player, Player's Browser,"Preferred browser (Firefox, Chrome, Opera...)") + +System_Boundary(wiq,"WIQ Server"){ + Container(web_app, "WIQ Client", "React, Typescript", "nginx web server") + Container(backend_api, "WIQ REST API","Java SpringBoot 3",".jar file") + ContainerDb(database,"WIQ Database","PostgreSQL","PostgreSQL docker container") +} +System_Ext(wikidata,"WikiData API","REST API") + +'RELATIONS +Rel(player,web_app,"Uses","HTTPS") +Rel(backend_api,wikidata,"Asks for data","SPARQL,HTTPS") +Rel(web_app,backend_api,"Asks for user/game information","JSON,HTTPS") +Rel(backend_api,database,"Stores game/user information","JPA") +@enduml \ 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 c528e907..fc3a269e 100644 --- a/docs/src/03_system_scope_and_context.adoc +++ b/docs/src/03_system_scope_and_context.adoc @@ -1,75 +1,16 @@ -ifndef::imagesdir[:imagesdir: ../images] - +ifndef::imagesdir[:imagesdir: ../diagrams] [[section-system-scope-and-context]] == System Scope and Context - - -[role="arc42help"] -**** -.Contents -System scope and context - as the name suggests - delimits your system (i.e. your scope) from all its communication partners -(neighboring systems and users, i.e. the context of your system). It thereby specifies the external interfaces. - -If necessary, differentiate the business context (domain specific inputs and outputs) from the technical context (channels, protocols, hardware). - -.Motivation -The domain interfaces and technical interfaces to communication partners are among your system's most critical aspects. Make sure that you completely understand them. - -.Form -Various options: - -* Context diagrams -* Lists of communication partners and their interfaces. - - -.Further Information - -See https://docs.arc42.org/section-3/[Context and Scope] in the arc42 documentation. - -**** - - === Business Context -[role="arc42help"] -**** -.Contents -Specification of *all* communication partners (users, IT-systems, ...) with explanations of domain specific inputs and outputs or interfaces. -Optionally you can add domain specific formats or communication protocols. - -.Motivation -All stakeholders should understand which data are exchanged with the environment of the system. - -.Form -All kinds of diagrams that show the system as a black box and specify the domain interfaces to communication partners. - -Alternatively (or additionally) you can use a table. -The title of the table is the name of your system, the three columns contain the name of the communication partner, the inputs, and the outputs. - -**** +image::BusinessContext.png[align="center"] -**** - -**** +The WIQ application will communicate with the WikiData API through REST HTTP calls using SPARQL for the queries. It will ask the API for information that will later be used for generating the questions that will be shown to the player. This information will come in the form of text, images or audio. === Technical Context -[role="arc42help"] -**** -.Contents -Technical interfaces (channels and transmission media) linking your system to its environment. In addition a mapping of domain specific input/output to the channels, i.e. an explanation which I/O uses which channel. - -.Motivation -Many stakeholders make architectural decision based on the technical interfaces between the system and its context. Especially infrastructure or hardware designers decide these technical interfaces. - -.Form -E.g. UML deployment diagram describing channels to neighboring systems, -together with a mapping table showing the relationships between channels and input/output. - -**** - -**** +image::TechnicalContextDiagram.png[align="center"] -**** +The WIQ application will be deployed together in the same server. The WIQ client will be deployed on a nginx web server. This client will communicate with the API through HTTPS REST calls and exchange information through JSON objects. The WIQ REST API will be run as a .jar file on the server and connect to a Database run on a postgresql docker container. The connection layer between the SpringBoot API and the database will be JPA. +The REST API will request information to the WikiData REST API through HTTPS calls passing a SPARQL query in order to retrieve data. -**** From aad18e01ba2ee905199330bbc1b0785df143d413 Mon Sep 17 00:00:00 2001 From: Dario Date: Sun, 11 Feb 2024 17:47:34 +0100 Subject: [PATCH 14/55] chore: re-added comments --- docs/src/03_system_scope_and_context.adoc | 59 ++++++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) diff --git a/docs/src/03_system_scope_and_context.adoc b/docs/src/03_system_scope_and_context.adoc index fc3a269e..c367a658 100644 --- a/docs/src/03_system_scope_and_context.adoc +++ b/docs/src/03_system_scope_and_context.adoc @@ -1,13 +1,70 @@ -ifndef::imagesdir[:imagesdir: ../diagrams] +ifndef::imagesdir[:imagesdir: ../images] [[section-system-scope-and-context]] == System Scope and Context +[role="arc42help"] +**** +.Contents +System scope and context - as the name suggests - delimits your system (i.e. your scope) from all its communication partners +(neighboring systems and users, i.e. the context of your system). It thereby specifies the external interfaces. + +If necessary, differentiate the business context (domain specific inputs and outputs) from the technical context (channels, protocols, hardware). + +.Motivation +The domain interfaces and technical interfaces to communication partners are among your system's most critical aspects. Make sure that you completely understand them. + +.Form +Various options: + +* Context diagrams +* Lists of communication partners and their interfaces. + + +.Further Information + +See https://docs.arc42.org/section-3/[Context and Scope] in the arc42 documentation. + +**** === Business Context +[role="arc42help"] +**** +.Contents +Specification of *all* communication partners (users, IT-systems, ...) with explanations of domain specific inputs and outputs or interfaces. +Optionally you can add domain specific formats or communication protocols. + +.Motivation +All stakeholders should understand which data are exchanged with the environment of the system. + +.Form +All kinds of diagrams that show the system as a black box and specify the domain interfaces to communication partners. + +Alternatively (or additionally) you can use a table. +The title of the table is the name of your system, the three columns contain the name of the communication partner, the inputs, and the outputs. + +**** + +**** + +**** + image::BusinessContext.png[align="center"] The WIQ application will communicate with the WikiData API through REST HTTP calls using SPARQL for the queries. It will ask the API for information that will later be used for generating the questions that will be shown to the player. This information will come in the form of text, images or audio. === Technical Context +[role="arc42help"] +**** +.Contents +Technical interfaces (channels and transmission media) linking your system to its environment. In addition a mapping of domain specific input/output to the channels, i.e. an explanation which I/O uses which channel. + +.Motivation +Many stakeholders make architectural decision based on the technical interfaces between the system and its context. Especially infrastructure or hardware designers decide these technical interfaces. + +.Form +E.g. UML deployment diagram describing channels to neighboring systems, +together with a mapping table showing the relationships between channels and input/output. + +**** image::TechnicalContextDiagram.png[align="center"] From 741a3b75a732f07bd0e4c05b05e540c0d08e92b6 Mon Sep 17 00:00:00 2001 From: Gonzalo Alonso Fernandez Date: Sun, 11 Feb 2024 17:49:11 +0100 Subject: [PATCH 15/55] chore: Updating documentation. --- .gitignore | 4 +- docs/diagrams/10_Quality_Tree.puml | 23 +++++ docs/images/10_Quality_Tree.png | Bin 0 -> 27275 bytes docs/src/01_introduction_and_goals.adoc | 119 +++++++++++++++++++++++- docs/src/10_quality_requirements.adoc | 29 +++++- 5 files changed, 167 insertions(+), 8 deletions(-) create mode 100644 docs/diagrams/10_Quality_Tree.puml create mode 100644 docs/images/10_Quality_Tree.png diff --git a/.gitignore b/.gitignore index 8bbe72a8..74da9bc1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ node_modules coverage -docs/build \ No newline at end of file +docs/build +.vscode +.DS_Store \ No newline at end of file diff --git a/docs/diagrams/10_Quality_Tree.puml b/docs/diagrams/10_Quality_Tree.puml new file mode 100644 index 00000000..809e0a0d --- /dev/null +++ b/docs/diagrams/10_Quality_Tree.puml @@ -0,0 +1,23 @@ +@startuml +title Quality attributes +agent Quality +agent Security +agent Reliability +agent Transferability +agent Usability +agent "Performance Efficiency" +agent Maintainability +agent Availability +agent Compatibility +agent "Functional Suitability" + +Quality --- Security +Quality --- Reliability +Quality --- Transferability +Quality --- Usability +Quality --- "Performance Efficiency" +Quality --- Maintainability +Quality --- Availability +Quality --- Compatibility +Quality --- "Functional Suitability" +@enduml diff --git a/docs/images/10_Quality_Tree.png b/docs/images/10_Quality_Tree.png new file mode 100644 index 0000000000000000000000000000000000000000..292718bfe09fbc6b7e546a4c77987a017a674b07 GIT binary patch literal 27275 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%0D@fGIx8(e z*!qv10EDC3y<3cEfGn~^2QE0!8O04NWeZ$pY%YI$f+ZIZ7C~MIcOBos%g4txm_N*e z58DpDD*4JXi%!*V6hvZ5h0cPRf%+yUQPH#r<`9L@jR5qH3T@cJ9KuI;L|~5+W1Yp* z6Ht|bmaBwx-j5M&T570KFp+{Q=Yb{;4+dIxz#OcK&?)KZ`bh3Z;_|QcB;>`2l83B+ zE$6=DHd>`R-c9Mwr_uqf02oou>IjIxp}C;#ydr2K0b$g(N=iteudNrExmxO*<{QeS z$~dr9o<0#xy2nK!#l0&pd;Hi`lw6~zGzW)`K1pUKy3|n(Wo8j7V|SX3fGRpn+Vg50 zM_CFdblXeUlJmFcQ=w|WDmaoNr7RvLH}l(vaP}$A(iX#<k09+(cAq)kC2VhkyKFhbkjjarw=CNX9pW{LLIbKyb=)Y=Ngc$t@eXWs6lcei0Ibw$W^(c?_rdsgcRK|wkDJQESgErV;=U2IMQ zfN>Zg1wQ(;U78~HV72V}P2wSI0-cf^O@LUaIctJ!_wAKvFr+*A+~n@jMK~stMW-7D z(%5%Iit`l11sQSQn;~V|ln*n|cfUNJP%%Ym;6L%~_h^taI zL{@kJ<$EBmh+LM=>4tFTe^P*As#|lu!P4`CaHE%`?#VqqG0~~9T3<+eM8Px(={%Ts zI%A2%ayVQ8M1%lz_5|%NrtJT$lPG))C<@YxBN9DbMU5bohMrB(*@vx-MMKyu6_Gpt zTz>}0o1Xdbj8pPLdNGuz(wnFngkm*Xza{7bM}slc+_Qf_`}VlxrRNDDvKL+4^hS>h zF|OyPQ16JaLtUAB-|v{j?;sPa(7K1Ts$Ff~k0j(Me;Z@RRpGMS-BwXGny=^ZO->sm zp$nKX-7hu+z1o>t`hG6%LwP(C%pvb9JS-TQ`o~*sJ*VVuGc{F3tH(64RDPh*z7Ms| z7jDzzoL}wTvugp++MIjFaqnCh!SfiqbX3{Mz5puD1?1S#Ki{3YEFE$2>{Z z#iUysZ9(C{r&$9k5njjI_;PP7JKFfh< z5-z#6N$Y7CGK2jF&>4(Kh84kv@u%AXHkU3f0eSPq5hy9ZR5HH)!1n%go}qgWw}s%` zIu{sshY`b~%85ntTtt*@x|OECTxdrB-q*>G5axEf1;0tH)Jy@70PR0ZPwI%db50p3 z?`!>7^z&ay`H;ID4vjI}ve2%edLF|qZqkS{iD4FaVENc;xqzaj{f79tz?fQC=acIn z7^Ky&c(WWI&{%pc{>rK~S4$`!U~g_AVdgpUD%|!f2h4~XE}Nd=n&HDfgoHnVBK^{p z!_v;6RI)PSP0Xx=Uw0<+E%~^&OxzOnltIv0yZZr%1*gvXd@$~ATW4qJ=4^EXW;6*D zpgq0mw{Fp|@H#hwf~otPTPsH_G{W#!V0WHAs=g{OD(d)SdyCuyA!MO2CyWp|de4|7 zZ;Viil%lmPPqdfWRKGw(P2KKY|(A@x`Hsj7E`&31?&JFLO8U@gpgHzi$ z)4RQc;1MCsU|#Z=K5)iB;!GbdBWtnH$uL;V=gdVye42cE4NAp@ypBXGDh5D}<`! z4(`i$0_6_i^OS$knZVTn__)^U_iyeVqwN6`Y9)2A{}i=evdSO8LmxE!Uhf_-bv%St zp%G99sz3Z0vG&cY_X0Z7tvceoQSOv$fi^g%_2fU%D&r7N)yK?}K0C!JlbROF*8-S` zBH-+u>2qr|)mZE->OD+U%Uig$k89D;cBcV&F!eLi$`?D=^w@XbGU_$6wzchhqFI3B zjk!+6Cmf>m6$OZ3_b=|8P4)6q6*yQ0E^#eD_zz&r|KltFC%&>)vGzP@HnYmu2`J|8 zAJjYH09|3a+u%b|`xmaI0Jv7b96(j8-CzERg)#C&V&z`)fYziR@7zJhurOUx_wmyg zR{QJg9{^%mLoP@H;{a&xbGkR9ha9u1fL8X-UC+~DPpW;Bia)gZdHK#kfSuIJi{Ji& z5uMn1{h-PWOQ)M64|Ko1)(ihKA`Sl_ZKl5zTgP#DC#NFV@5k_6-%cFk{x#s%&Z|=J zh|BZvh(TTRCE=eg6{u~L7yJAgP>dA@yt$7t;`fUakS#h*#IM&YKjNCs@1N;3g&F?w vtL?qlYsx<$N(24C%a`2+ZQyEbyo2f@4K}bpzusA-QNJ7Ln&=d3IYj&qs&u}K literal 0 HcmV?d00001 diff --git a/docs/src/01_introduction_and_goals.adoc b/docs/src/01_introduction_and_goals.adoc index ddb2ae3d..40950d67 100644 --- a/docs/src/01_introduction_and_goals.adoc +++ b/docs/src/01_introduction_and_goals.adoc @@ -14,6 +14,7 @@ These include * quality goals for the architecture and * relevant stakeholders and their expectations **** +RTVE has hired the company HappySw, composed of students from the Oviedo School of Software Engineering, to develop a new experimental version of the quiz show Saber y Ganar. This application will be called WIQ, where users will be able to register and log in to play. The application will consist of answering questions of different types generated with Wikidata. For each question answered correctly, points will be obtained. === Requirements Overview @@ -38,9 +39,98 @@ Keep these excerpts as short as possible. Balance readability of this document w .Further Information See https://docs.arc42.org/section-1/[Introduction and Goals] in the arc42 documentation. - **** +* The system will provide non-registered users with the option to sign up. +* The system will provide unidentified users with the option to log in. +* The system can only be used by registered users. +* The system will have a game mode with 9 rounds. +* In each round, the system will generate a question. +* In each round, the system will generate four answers, with only one being correct. +* The system will offer registered users access to the number of games they have played. +* The system will offer registered users access the number of questions they have answered correctly. +* The system will offer registered users access the number of questions they have answered incorrectly. +* The system will offer registered users access the time they have spent within the system. +* The system will offer registered users access the ranking of the game. +* The system will set a time limit for registered users to respond to each question. + +==== Functional Requirements +===== Users Sign up. +[none or no-bullet] +* FR-USU 1. The system will offer to an unregistered user a registration form. +* FR-USU 2. The system will request the necessary data to register the new user. +[none or no-bullet] +** FR-USU 2.1. The system will request the following data to register the new user: +[none or no-bullet] +*** FR-USU 2.1.1. Username. +*** FR-USU 2.1.2. Email address. +*** FR-USU 2.1.3. Password. +*** FR-USU 2.1.4. All data fields are mandatory. +* FR-USU 3. When any value entered by the new user is invalid, the user will receive a message notifying the error and will not be able to register. +* FR-USU 4. When all the values entered by the new user are valid, the system will check if the user is already registered in the persistence system. +[none or no-bullet] +** FR-USU 4.1. When a user with the same data is already found in the persistence system, the user will not be able to create a new account since it already exists. +** FR-USU 4.2. When no user matching the data is found in the persistence system. +[none or no-bullet] +*** FR-USU 4.2.1. The new user will be registered in the system. + +===== Users Log in. +[none or no-bullet] +* FR-ULI 1. The system must allow an unidentified user to log in. +[none or no-bullet] +** FR-ULI 1.1. The system will request the email address as the user identifier. +[none or no-bullet] +*** FR-ULI 1.1.1. The system must check that its format is valid. +*** FR-ULI 1.1.2. It is a mandatory field. +** FR-ULI 1.2. The system will request the user's password. +[none or no-bullet] +*** FR-ULI 1.2.1. It is a mandatory field. +** FR-ULI 1.3. The system will automatically validate the entered data to verify when it corresponds to a registered user account. +[none or no-bullet] +*** FR-ULI 1.3.1. When the user is not stored in the persistence system, an error message will be displayed. +*** FR-ULI 1.3.2. When the user exists in the persistence system, but the passwords do not match, a message will be displayed to the user notifying them of the error. +*** FR-ULI 1.3.3. When the user is stored in the persistence system and the passwords match, the user will be logged in. +* FR-ULI 2. The system must allow users who are logged in to log out. + +===== Data management by the user. +[none or no-bullet] +* FR-DMU 1. The system will allow all registered users to access their historical data from their participation. +[none or no-bullet] +** FR-DMU 1.1. Registered users will be able to access the number of games they have played. +** FR-DMU 1.2. Registered users will be able to access the number of questions they have answered correctly. +** FR-DMU 1.3. Registered users will be able to access the number of questions they have answered incorrectly. +** FR-DMU 1.4. Registered users will be able to access the time they have spent within the system. +** FR-DMU 1.5. Registered users will be able to access the ranking of the game. + +===== Play to WIQ. +[none or no-bullet] +* FR-PWIQ 1. The system will only allow registered users to play the WIQ game. +* FR-PWIQ 2. The game consists of nine rounds. +[none or no-bullet] +** FR-PWIQ 2.1. In each round, the system will automatically generate a question to the registered user. +** FR-PWIQ 2.2. In each round, the system will provide the registered user with four automatically generated possible answers. +** FR-PWIQ 2.3. In each round, there will always be only one correct answer. +** FR-PWIQ 2.4. The system will automatically end the game after completing the ninth round. +* FR-PWIQ 3. The registered user must respond to the question before the specified time expires. +[none or no-bullet] +** FR-PWIQ 3.1. When the specified time has not ended, and the registered user has provided an answer: +[none or no-bullet] +*** FR-PWIQ 3.1.1. The system will check if the answer is correct. +[none or no-bullet] +**** FR-PWIQ 3.1.1.1. When the answer is correct: +[none or no-bullet] +***** FR-PWIQ 3.1.1.1.1. The registered user will earn 10 points. +***** FR-PWIQ 3.1.1.1.2. When the registered user is in the ninth round, the system will end the game. +***** FR-PWIQ 3.1.1.1.3. When the registered user is not in the ninth round, the system will move to the next round. +**** FR-PWIQ 3.1.1.2. When the answer is incorrect: +[none or no-bullet] +***** FR-PWIQ 3.1.1.2.1. When the registered user is in the ninth round, the system will end the game. +***** FR-PWIQ 3.1.1.2.2. When the registered user is not in the ninth round, the system will move to the next round. +** FR-PWIQ 3.2. When the specified time has ended: +[none or no-bullet] +*** FR-PWIQ 3.2.1. When the registered user is in the ninth round, the system will end the game. +*** FR-PWIQ 3.2.2. When the registered user is not in the ninth round, the system will move to the next round. + === Quality Goals [role="arc42help"] @@ -63,6 +153,20 @@ If you as an architect do not know how the quality of your work will be judged.. A table with quality goals and concrete scenarios, ordered by priorities **** +[options="header",cols="1,3"] +|=== +|Goal|Description +| Functional suitability | The system must fulfill its intended purpose effectively and efficiently, allowing users to register, log in, play the quiz, and access their historical data. +| Security | The system must prioritize user data security. It must implement robust authentication mechanisms for user registration and login. The API access points for user information and generated questions must be secured with proper authorization. +| Reliability | The system should be reliable in generating questions from Wikidata, ensuring that questions are accurate and diverse. The system must handle user registrations, logins, and game data storage without errors. +| Availability | The system must be available 99.99% of the time a user tries to access it. +| Maintainability | The system must be designed and implemented in a way that facilitates easy maintenance and updates. +| Performance efficiency | The system must deliver optimal performance, ensuring responsive interactions for users. The automatic generation of questions from Wikidata and the real-time gameplay must be efficient. The system must handle 20 concurrent users. +| Usability | The system must provide a user-friendly interface, making it easy for users to register, log in, and play the game. The system learning time for a user should be less than 4 hours. +| Compatibility | The system must be compatible with various web browsers and devices, ensuring a seamless experience for users regardless of their choice of platform. It has to be well-optimized for different screen sizes and functionalities. +| Transferability | The system must allow for easy transfer of user data and game-related information through its APIs. +|=== + === Stakeholders [role="arc42help"] @@ -88,6 +192,15 @@ Table with role names, person names, and their expectations with respect to the [options="header",cols="1,2,2"] |=== |Role/Name|Contact|Expectations -| __ | __ | __ -| __ | __ | __ +| RTVE | Client | __ +| HappySw | Software Development Team | __ +| Registered user | __ | __ +| Usability expert | __ | __ +| Accesibility expert | __ | __ +| Security expert | __ | __ +| Design expert | __ | __ +| DNS provider | __ | __ +| Translation team | __ | __ +| Project Manager | __ | __ +| Wikidata | __ | __ |=== diff --git a/docs/src/10_quality_requirements.adoc b/docs/src/10_quality_requirements.adoc index 68475e80..50c4cf14 100644 --- a/docs/src/10_quality_requirements.adoc +++ b/docs/src/10_quality_requirements.adoc @@ -42,10 +42,10 @@ The quality tree is a high-level overview of the quality goals and requirements: * a mind map with quality categories as main branches In any case the tree should include links to the scenarios of the following section. - - **** +image:10_Quality_Tree.png[] + === Quality Scenarios [role="arc42help"] @@ -64,10 +64,31 @@ For architects, two kinds of scenarios are important: Scenarios make quality requirements concrete and allow to more easily measure or decide whether they are fulfilled. -Especially when you want to assess your architecture using methods like -ATAM you need to describe your quality goals (from section 1.2) +Especially when you want to assess your architecture using methods like ATAM you need to describe your quality goals (from section 1.2) more precisely down to a level of scenarios that can be discussed and evaluated. .Form Tabular or free form text. **** + +==== Usage Scenarios +[options="header",cols="1,3,1"] +|=== +|Quality attribute|Scenario|Priority +| Functional suitability | Users should be able to register, log in, play the quiz, and access historical data without encountering errors or glitches. | High, Medium +| Security | User data must be securely handled. Robust authentication mechanisms should be in place for user registration and login. API access points for user information and generated questions must be secured with proper authorization. | High, High +| Reliability | The system should reliably generate accurate and diverse questions from Wikidata. User registrations, logins, and game data storage should be handled without errors. | High, Medium +| Availability | The system must be available 99.99% of the time when a user attempts to access it. | High, High +| Performance efficiency | The system must deliver optimal performance, ensuring responsive interactions for users. It should efficiently generate questions from Wikidata and handle real-time gameplay with up to 20 concurrent users. | High, High +| Usability | The system must provide a user-friendly interface, allowing users to register, log in, and play the game with a learning time of less than 4 hours. | High, Medium +| Compatibility | The system must be compatible with various web browsers and devices, providing a seamless experience for users regardless of their choice of platform. It should be well-optimized for different screen sizes and functionalities. | High, Medium +| Transferability | The system must allow for easy transfer of user data and game-related information through its APIs. | Medium, High +| Testability | The unit tests must have at least 90% coverage. | High, Medium +|=== +==== Change Scenarios +[options="header",cols="1,3,1"] +|=== +|Quality attribute|Scenario|Priority +| Maintainability | The system should be designed and implemented in a way that allows for easy maintenance and updates. | High, Medium +| Maintainability | The code of the system should be well-documented, and modular, allowing for efficient troubleshooting and modifications. | High, Medium +|=== \ No newline at end of file From e8e313bcf5ee352a735a9565e45ed6d0f7cf3300 Mon Sep 17 00:00:00 2001 From: Dario Date: Sun, 11 Feb 2024 19:01:29 +0100 Subject: [PATCH 16/55] chore: image footers --- docs/src/03_system_scope_and_context.adoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/src/03_system_scope_and_context.adoc b/docs/src/03_system_scope_and_context.adoc index c367a658..20000599 100644 --- a/docs/src/03_system_scope_and_context.adoc +++ b/docs/src/03_system_scope_and_context.adoc @@ -47,7 +47,7 @@ The title of the table is the name of your system, the three columns contain the **** -image::BusinessContext.png[align="center"] +image::BusinessContext.png[align="center",title="Business Context",link="BusinessContext.png] The WIQ application will communicate with the WikiData API through REST HTTP calls using SPARQL for the queries. It will ask the API for information that will later be used for generating the questions that will be shown to the player. This information will come in the form of text, images or audio. @@ -66,7 +66,7 @@ together with a mapping table showing the relationships between channels and inp **** -image::TechnicalContextDiagram.png[align="center"] +image::TechnicalContextDiagram.png[align="center",title="Technical Context",link="TechnicalContextDiagram.png] The WIQ application will be deployed together in the same server. The WIQ client will be deployed on a nginx web server. This client will communicate with the API through HTTPS REST calls and exchange information through JSON objects. The WIQ REST API will be run as a .jar file on the server and connect to a Database run on a postgresql docker container. The connection layer between the SpringBoot API and the database will be JPA. The REST API will request information to the WikiData REST API through HTTPS calls passing a SPARQL query in order to retrieve data. From d6533e293aafae1658db22b98adffbe31693d631 Mon Sep 17 00:00:00 2001 From: Dario Date: Sun, 11 Feb 2024 19:01:53 +0100 Subject: [PATCH 17/55] chore: deployment view --- docs/diagrams/DeploymentDiagram.puml | 32 ++++++++++++++++++++++++++++ docs/src/07_deployment_view.adoc | 2 +- 2 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 docs/diagrams/DeploymentDiagram.puml diff --git a/docs/diagrams/DeploymentDiagram.puml b/docs/diagrams/DeploymentDiagram.puml new file mode 100644 index 00000000..eaa1314c --- /dev/null +++ b/docs/diagrams/DeploymentDiagram.puml @@ -0,0 +1,32 @@ +@startuml + +title WIQ Deployment View + +legend right + |Color| Type | + |<#PeachPuff>| WIQ Server | + |<#DarkSalmon>| External Service | +end legend + +node "Server Hosting WIQ" #PeachPuff { + node "WIQ WebApp Server"{ + component "WIQ React Application" + } + node "WIQ API" { + component "WIQ_API.jar" + } + node "PostgreSQL Docker" { + database "WIQ Database" + } +} +node "User Computer" #DarkSalmon{ + frame "Web Client" +} +node "WikiData Server" #DarkSalmon { + frame "WikiData REST API" +} +"Web Client" ..> "WIQ React Application" : "HTTPS" +"WIQ React Application" ..> "WIQ_API.jar" : "HTTPS" +"WIQ_API.jar" ..> "WIQ Database" : "JPA" +"WIQ API" ..> "WikiData REST API" : "HTTPS, SPARQL" +@enduml \ No newline at end of file diff --git a/docs/src/07_deployment_view.adoc b/docs/src/07_deployment_view.adoc index 22b45c27..a002c4a8 100644 --- a/docs/src/07_deployment_view.adoc +++ b/docs/src/07_deployment_view.adoc @@ -55,7 +55,7 @@ Describe (usually in a combination of diagrams, tables, and text): For multiple environments or alternative deployments please copy and adapt this section of arc42 for all relevant environments. **** - +image::DeploymentView.png[align="center",title="Deployment View",link="DeploymentView.png] _****_ Motivation:: From bd92b5d879a1de23b89a42de7e503e1ab930ec3c Mon Sep 17 00:00:00 2001 From: jjgancfer Date: Sun, 11 Feb 2024 20:32:47 +0100 Subject: [PATCH 18/55] docs: add the solution strategy --- .vscode/settings.json | 1 + docs/src/04_solution_strategy.adoc | 51 +++++++++++++++++++----------- 2 files changed, 34 insertions(+), 18 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/docs/src/04_solution_strategy.adoc b/docs/src/04_solution_strategy.adoc index 7bf03f7a..8aa8bd5e 100644 --- a/docs/src/04_solution_strategy.adoc +++ b/docs/src/04_solution_strategy.adoc @@ -3,30 +3,45 @@ ifndef::imagesdir[:imagesdir: ../images] [[section-solution-strategy]] == Solution Strategy +What follows is a summary of our solution's main decisions, and the approach we decided to use to create the system. -[role="arc42help"] -**** -.Contents -A short summary and explanation of the fundamental decisions and solution strategies, that shape system architecture. It includes +=== Technologies breakdown -* technology decisions -* decisions about the top-level decomposition of the system, e.g. usage of an architectural pattern or design pattern -* decisions on how to achieve key quality goals -* relevant organizational decisions, e.g. selecting a development process or delegating certain tasks to third parties. +Regarding the technologies, we decided to use the following ones: -.Motivation -These decisions form the cornerstones for your architecture. They are the foundation for many other detailed decisions or implementation rules. + * **React** for the frotend, using the **Chakra UI** component library. Although the preferred way to use React is currently through a framework, we preferred this approach due to this being many of us first time using it, as well as a lack of experience using any framework in any of us. -.Form -Keep the explanations of such key decisions short. + ** As a consecuence of this, pure JavaScript is being used due to React 18 not supporting Typescript 5. -Motivate what was decided and why it was decided that way, -based upon problem statement, quality goals and key constraints. -Refer to details in the following sections. + * **PostgreSQL** as DBMS to store the information. We nearly immediately discarded using MongoDB due to many of us not having experience with it, and those that did preferring SQL. Many modern DBMS also include either JSON or JSONB data types, so using a DBMS whose main appeal is JSON and not many of us have experience with did not sit well with us. + * **Java SpringBoot** for the backend/API, it being a language we are all comfortable with. The server will easily support multithreading if needed due to SpringBoot being an abstraction over servlets, something we would be able only to simulate if we used Node.js as it uses a single-threaded event loop. -.Further Information +=== Organizational breakdown -See https://docs.arc42.org/section-4/[Solution Strategy] in the arc42 documentation. +Currently, we have been meeting twice a week, but that may change in the future. Most, if not all of us, were present for these meetings, and relevant decisions were also discussed on the side and between members, as well discussions related to opinions on some matter. Some of these meetings took place in person while others took place on a Discord Server. -**** +We also have a Whatsapp community for the team, and a Notion wiki. + +=== Important quality-related decisions + +|=== +|Quality attribute pursued|Solution chosen +|Privacy|All stored password will be hashed, both client-side and server-side, to avoid password disclosure. The client-side password is also intended to prevent password discoverage in case it is a repeated one.| +|Robustness|Currently, all validations will take place server-side to avoid not being properly taken care of due to JavaScript desactivation, such as when using the NoScript plug-in| +|=== + +=== Workflow + +We have divided ourselves in teams related to our own areas of expertise, but those divisions are indicative, and frontend teams may review or comment PRs if they wish, or vice versa. The frontend team may also ask input from the backend team if they wish, and the backend team may do the same. + +All in all, we strive to achieve a very flexible workflow in which everyone's input may be considered if they wish to give it. + +=== Code style + +Regarding the code style, we must make two important distinctions: the frontend and backend. In the latter, we will mainly use Object Oriented Programming because our language of choice is Java, which strongly favours it. Regarding the former, it will be more of a case-by-case approach, as for instance, OOP-oriented React is deprecated in favor of a functional approach, but sometimes we may need OOP's strengths. + + * In the backend, the structure will that of a typical Maven project. + * In the frontend, the structure will be quite different: + ** The `src/components` will be contain single components which we may reuse. + ** The `src/pages` will contain the endpoints and will follow a simple structure. For instance, given a `/statistics/personal` and a `/statistics/general` endpoints, both will be independent React components that will return the page and be placed under the `src/pages/statistics` folder. \ No newline at end of file From 6758f8ae4e5888093f1bde9a9630df196fb731e4 Mon Sep 17 00:00:00 2001 From: UO288090 Date: Mon, 12 Feb 2024 17:34:25 +0100 Subject: [PATCH 19/55] chore: Starting to modify the documentation --- .idea/.gitignore | 8 + .idea/arquisoft_wib_2b.iml | 9 + .idea/misc.xml | 6 + .idea/modules.xml | 8 + .idea/vcs.xml | 6 + docs/images/BusinessContext.png | Bin 0 -> 26121 bytes docs/images/ContainerDiagram.png | Bin 0 -> 51920 bytes docs/package-lock.json | 876 +++++++++++++++++++++++++++ docs/package.json | 12 +- docs/src/05_building_block_view.adoc | 19 +- 10 files changed, 922 insertions(+), 22 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/arquisoft_wib_2b.iml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 docs/images/BusinessContext.png create mode 100644 docs/images/ContainerDiagram.png diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 00000000..13566b81 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/arquisoft_wib_2b.iml b/.idea/arquisoft_wib_2b.iml new file mode 100644 index 00000000..d6ebd480 --- /dev/null +++ b/.idea/arquisoft_wib_2b.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 00000000..b6087ad2 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 00000000..1f1e0d13 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 00000000..35eb1ddf --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/docs/images/BusinessContext.png b/docs/images/BusinessContext.png new file mode 100644 index 0000000000000000000000000000000000000000..8d332809d33b7df6011f24220971f49a810749d1 GIT binary patch literal 26121 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 literal 0 HcmV?d00001 diff --git a/docs/images/ContainerDiagram.png b/docs/images/ContainerDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..8c1c14887eb0e698269f272e426dae0242ba4f06 GIT binary patch literal 51920 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 literal 0 HcmV?d00001 diff --git a/docs/package-lock.json b/docs/package-lock.json index ab1646f2..8c157537 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -8,10 +8,170 @@ "name": "docs", "version": "1.0.0", "dependencies": { + "asciidoctor": "^3.0.3", "gh-pages": "^3.2.3", "shx": "^0.3.3" } }, + "node_modules/@asciidoctor/cli": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@asciidoctor/cli/-/cli-4.0.0.tgz", + "integrity": "sha512-x2T9gW42921Zd90juEagtbViPZHNP2MWf0+6rJEkOzW7E9m3TGJtz+Guye9J0gwrpZsTMGCpfYMQy1We3X7osg==", + "dependencies": { + "yargs": "17.3.1" + }, + "bin": { + "asciidoctor": "bin/asciidoctor", + "asciidoctorjs": "bin/asciidoctor" + }, + "engines": { + "node": ">=16", + "npm": ">=8.0.0" + }, + "peerDependencies": { + "@asciidoctor/core": ">=2 <4" + } + }, + "node_modules/@asciidoctor/core": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@asciidoctor/core/-/core-3.0.3.tgz", + "integrity": "sha512-XCIRZnYblltGc5COGCtgSQfUqENds1xAHds9GSK31pALfHmxudX1ZAvM7mvwFpZDKUAdWpB3KrDY6oWK7VGM1g==", + "dependencies": { + "@asciidoctor/opal-runtime": "3.0.1", + "unxhr": "1.2.0" + }, + "engines": { + "node": ">=16", + "npm": ">=8" + } + }, + "node_modules/@asciidoctor/opal-runtime": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@asciidoctor/opal-runtime/-/opal-runtime-3.0.1.tgz", + "integrity": "sha512-iW7ACahOG0zZft4A/4CqDcc7JX+fWRNjV5tFAVkNCzwZD+EnFolPaUOPYt8jzadc0+Bgd80cQTtRMQnaaV1kkg==", + "dependencies": { + "glob": "8.1.0", + "unxhr": "1.2.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@asciidoctor/opal-runtime/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@asciidoctor/opal-runtime/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@asciidoctor/opal-runtime/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", + "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", + "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/a-sync-waterfall": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", + "integrity": "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==" + }, + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/array-union": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", @@ -31,6 +191,37 @@ "node": ">=0.10.0" } }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "node_modules/asciidoctor": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/asciidoctor/-/asciidoctor-3.0.3.tgz", + "integrity": "sha512-sBHd8RH1AATrg+tkBdvsb/FFefDY3T3SE5tUBVEUtoT4qrazAfhgvfAI/8td1zGoRf7TwYp4Vfn2stuXBBgzXQ==", + "dependencies": { + "@asciidoctor/cli": "4.0.0", + "@asciidoctor/core": "3.0.3", + "ejs": "^3.1.2", + "handlebars": "^4.7.6", + "nunjucks": "^3.2.1", + "pug": "^3.0.0" + }, + "bin": { + "asciidoctor": "bin/asciidoctor", + "asciidoctorjs": "bin/asciidoctor" + }, + "engines": { + "node": ">=16", + "npm": ">=8" + } + }, + "node_modules/assert-never": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.2.1.tgz", + "integrity": "sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw==" + }, "node_modules/async": { "version": "2.6.4", "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", @@ -39,6 +230,17 @@ "lodash": "^4.17.14" } }, + "node_modules/babel-walk": { + "version": "3.0.0-canary-5", + "resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz", + "integrity": "sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==", + "dependencies": { + "@babel/types": "^7.9.6" + }, + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -53,6 +255,72 @@ "concat-map": "0.0.1" } }, + "node_modules/call-bind": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.6.tgz", + "integrity": "sha512-Mj50FLHtlsoVfRfnHaZvyrooHcrlceNZdL/QBvJJVd9Ta55qCQK0gs4ss2oZDeV9zFCs6ewzYgVE5yfVmfFpVg==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.3", + "set-function-length": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/character-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", + "integrity": "sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==", + "dependencies": { + "is-regex": "^1.0.3" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, "node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -68,11 +336,74 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, + "node_modules/constantinople": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz", + "integrity": "sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==", + "dependencies": { + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.1" + } + }, + "node_modules/define-data-property": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.2.tgz", + "integrity": "sha512-SRtsSqsDbgpJBbW3pABMCOt6rQyeM8s8RiyeSN8jYG8sYmt/kGJejbydttUsnDs1tadr19tvhT4ShwMyoqAm4g==", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.2", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/doctypes": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", + "integrity": "sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==" + }, + "node_modules/ejs": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", + "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/email-addresses": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/email-addresses/-/email-addresses-3.1.0.tgz", "integrity": "sha512-k0/r7GrWVL32kZlGwfPNgB2Y/mMXVTq/decgLczm/j34whdaspNrZO8CnXPf1laaHxI6ptUlsnAxN+UAPw+fzg==" }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "engines": { + "node": ">=6" + } + }, "node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -81,6 +412,33 @@ "node": ">=0.8.0" } }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/filename-reserved-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", @@ -159,6 +517,32 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/gh-pages": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-3.2.3.tgz", @@ -214,11 +598,97 @@ "node": ">=0.10.0" } }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/hasown": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", @@ -263,6 +733,70 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-expression": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-4.0.0.tgz", + "integrity": "sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==", + "dependencies": { + "acorn": "^7.1.1", + "object-assign": "^4.1.1" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/jake": { + "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" + }, + "node_modules/js-stringify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", + "integrity": "sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==" + }, "node_modules/jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", @@ -271,6 +805,15 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jstransformer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", + "integrity": "sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==", + "dependencies": { + "is-promise": "^2.0.0", + "promise": "^7.0.1" + } + }, "node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -320,6 +863,43 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "node_modules/nunjucks": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.4.tgz", + "integrity": "sha512-26XRV6BhkgK0VOxfbU5cQI+ICFUtMLixv1noZn1tGU38kQH5A5nmmbk/O45xdyBhD1esk47nKrY0mvQpZIhRjQ==", + "dependencies": { + "a-sync-waterfall": "^1.0.0", + "asap": "^2.0.3", + "commander": "^5.1.0" + }, + "bin": { + "nunjucks-precompile": "bin/precompile" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "chokidar": "^3.3.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/nunjucks/node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "engines": { + "node": ">= 6" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -428,6 +1008,126 @@ "node": ">=8" } }, + "node_modules/promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dependencies": { + "asap": "~2.0.3" + } + }, + "node_modules/pug": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.2.tgz", + "integrity": "sha512-bp0I/hiK1D1vChHh6EfDxtndHji55XP/ZJKwsRqrz6lRia6ZC2OZbdAymlxdVFwd1L70ebrVJw4/eZ79skrIaw==", + "dependencies": { + "pug-code-gen": "^3.0.2", + "pug-filters": "^4.0.0", + "pug-lexer": "^5.0.1", + "pug-linker": "^4.0.0", + "pug-load": "^3.0.0", + "pug-parser": "^6.0.0", + "pug-runtime": "^3.0.1", + "pug-strip-comments": "^2.0.0" + } + }, + "node_modules/pug-attrs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-3.0.0.tgz", + "integrity": "sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==", + "dependencies": { + "constantinople": "^4.0.1", + "js-stringify": "^1.0.2", + "pug-runtime": "^3.0.0" + } + }, + "node_modules/pug-code-gen": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.2.tgz", + "integrity": "sha512-nJMhW16MbiGRiyR4miDTQMRWDgKplnHyeLvioEJYbk1RsPI3FuA3saEP8uwnTb2nTJEKBU90NFVWJBk4OU5qyg==", + "dependencies": { + "constantinople": "^4.0.1", + "doctypes": "^1.1.0", + "js-stringify": "^1.0.2", + "pug-attrs": "^3.0.0", + "pug-error": "^2.0.0", + "pug-runtime": "^3.0.0", + "void-elements": "^3.1.0", + "with": "^7.0.0" + } + }, + "node_modules/pug-error": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-2.0.0.tgz", + "integrity": "sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ==" + }, + "node_modules/pug-filters": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-4.0.0.tgz", + "integrity": "sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==", + "dependencies": { + "constantinople": "^4.0.1", + "jstransformer": "1.0.0", + "pug-error": "^2.0.0", + "pug-walk": "^2.0.0", + "resolve": "^1.15.1" + } + }, + "node_modules/pug-lexer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-5.0.1.tgz", + "integrity": "sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==", + "dependencies": { + "character-parser": "^2.2.0", + "is-expression": "^4.0.0", + "pug-error": "^2.0.0" + } + }, + "node_modules/pug-linker": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-4.0.0.tgz", + "integrity": "sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==", + "dependencies": { + "pug-error": "^2.0.0", + "pug-walk": "^2.0.0" + } + }, + "node_modules/pug-load": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-3.0.0.tgz", + "integrity": "sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==", + "dependencies": { + "object-assign": "^4.1.1", + "pug-walk": "^2.0.0" + } + }, + "node_modules/pug-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-6.0.0.tgz", + "integrity": "sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==", + "dependencies": { + "pug-error": "^2.0.0", + "token-stream": "1.0.0" + } + }, + "node_modules/pug-runtime": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-3.0.1.tgz", + "integrity": "sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg==" + }, + "node_modules/pug-strip-comments": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz", + "integrity": "sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==", + "dependencies": { + "pug-error": "^2.0.0" + } + }, + "node_modules/pug-walk": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-2.0.0.tgz", + "integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==" + }, "node_modules/rechoir": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", @@ -439,6 +1139,14 @@ "node": ">= 0.10" } }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -463,6 +1171,22 @@ "semver": "bin/semver.js" } }, + "node_modules/set-function-length": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", + "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", + "dependencies": { + "define-data-property": "^1.1.2", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/shelljs": { "version": "0.8.5", "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", @@ -494,6 +1218,38 @@ "node": ">=6" } }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-outer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", @@ -505,6 +1261,17 @@ "node": ">=0.10.0" } }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -516,6 +1283,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "engines": { + "node": ">=4" + } + }, + "node_modules/token-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-1.0.0.tgz", + "integrity": "sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==" + }, "node_modules/trim-repeated": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", @@ -527,6 +1307,18 @@ "node": ">=0.10.0" } }, + "node_modules/uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -535,10 +1327,94 @@ "node": ">= 4.0.0" } }, + "node_modules/unxhr": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unxhr/-/unxhr-1.2.0.tgz", + "integrity": "sha512-6cGpm8NFXPD9QbSNx0cD2giy7teZ6xOkCUH3U89WKVkL9N9rBrWjlCwhR94Re18ZlAop4MOc3WU1M3Hv/bgpIw==", + "engines": { + "node": ">=8.11" + } + }, + "node_modules/void-elements": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", + "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/with": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/with/-/with-7.0.2.tgz", + "integrity": "sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==", + "dependencies": { + "@babel/parser": "^7.9.6", + "@babel/types": "^7.9.6", + "assert-never": "^1.2.1", + "babel-walk": "3.0.0-canary-5" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz", + "integrity": "sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } } } } diff --git a/docs/package.json b/docs/package.json index 22e2370d..0e3c88cf 100644 --- a/docs/package.json +++ b/docs/package.json @@ -4,12 +4,12 @@ "description": "Npm project just for the docs", "main": "index.js", "scripts": { - "build": "shx rm -rf build && asciidoctor -D build -a imagesdir=./images -r asciidoctor-diagram index.adoc && shx cp -R images build", - "deploy": "gh-pages -d build" + "build": "shx rm -rf build && asciidoctor -D build -a imagesdir=./images -r asciidoctor-diagram index.adoc && shx cp -R images build", + "deploy": "gh-pages -d build" }, "dependencies": { - "gh-pages": "^3.2.3", - "shx": "^0.3.3" + "asciidoctor": "^3.0.3", + "gh-pages": "^3.2.3", + "shx": "^0.3.3" } - } - \ No newline at end of file +} diff --git a/docs/src/05_building_block_view.adoc b/docs/src/05_building_block_view.adoc index df5c29c8..5e6ce2b5 100644 --- a/docs/src/05_building_block_view.adoc +++ b/docs/src/05_building_block_view.adoc @@ -44,27 +44,14 @@ See https://docs.arc42.org/section-5/[Building Block View] in the arc42 document [role="arc42help"] **** -Here you describe the decomposition of the overall system using the following white box template. It contains - - * an overview diagram - * a motivation for the decomposition - * black box descriptions of the contained building blocks. For these we offer you alternatives: - - ** use _one_ table for a short and pragmatic overview of all contained building blocks and their interfaces - ** use a list of black box descriptions of the building blocks according to the black box template (see below). - Depending on your choice of tool this list could be sub-chapters (in text files), sub-pages (in a Wiki) or nested elements (in a modeling tool). - - - * (optional:) important interfaces, that are not explained in the black box templates of a building block, but are very important for understanding the white box. -Since there are so many ways to specify interfaces why do not provide a specific template for them. - In the worst case you have to specify and describe syntax, semantics, protocols, error handling, - restrictions, versions, qualities, necessary compatibilities and many things more. -In the best case you will get away with examples or simple signatures. +This is the overall view of the application. The diagram is composed of 3 elements that will interact between each other. **** _****_ +image::BusinessContext.png["Overall view of the business context"] + Motivation:: __ From 8a53c5dc3acbee698110db7359c406ebbbc84d7f Mon Sep 17 00:00:00 2001 From: sergiorodriguezgarcia <113514397+sergiorodriguezgarcia@users.noreply.github.com> Date: Mon, 12 Feb 2024 17:35:15 +0100 Subject: [PATCH 20/55] chore: Updated section 11 risks and technical debts First version of the risks and technical debts section of the documentation --- docs/src/11_technical_risks.adoc | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/docs/src/11_technical_risks.adoc b/docs/src/11_technical_risks.adoc index dc5575fc..3779792b 100644 --- a/docs/src/11_technical_risks.adoc +++ b/docs/src/11_technical_risks.adoc @@ -4,22 +4,19 @@ ifndef::imagesdir[:imagesdir: ../images] == Risks and Technical Debts -[role="arc42help"] -**** -.Contents -A list of identified technical risks or technical debts, ordered by priority +|=== +|*Risk* |*Explanation* | *Mitigation proposed* -.Motivation -“Risk management is project management for grown-ups” (Tim Lister, Atlantic Systems Guild.) +|Little knowledge of the technologies to be used +|For most of the members of the team, is the first time working with technologies as React or Wikidata +|Explore technologies documentation to familiarize ourselves with the technology, and seek examples of use. -This should be your motto for systematic detection and evaluation of risks and technical debts in the architecture, which will be needed by management stakeholders (e.g. project managers, product owners) as part of the overall risk analysis and measurement planning. +|Lack of time +|We may face time constraints in fulfilling all the requirements for each deliverable and meeting every deadline. +|Try to maintain a steady and sustainable development pace. Prioritize building functional components initially, then iterate and enhance from there. -.Form -List of risks and/or technical debts, probably including suggested measures to minimize, mitigate or avoid risks or reduce technical debts. +|Coordination and responsability problems +|It is probably the first time involvement in developing a project from scratch, including decisions on architecture, design, and implementation, introduces various challenges. Misunderstandings regarding tasks and version control management errors can result in individuals inadvertently disrupting the work of others. Additionally, the necessity to make numerous decisions and reach agreements increases the likelihood of errors, potentially consuming significant time and effort. +|To ensure effective collaboration and organization, adhere to the teachers' instructions concerning GitHub, including utilizing features such as issues and pull requests, and maintain a disciplined approach to your work. Furthermore, leverage the collective knowledge and suggestions of every team member, integrating them with your existing expertise. - -.Further Information - -See https://docs.arc42.org/section-11/[Risks and Technical Debt] in the arc42 documentation. - -**** +In terms of technical debt, it's likely to be significant due to our lack of familiarity with the majority of the technologies involved for most of the team. Both Wikidata and React present considerable challenges, and we anticipate accumulating substantial technical debt in both areas. At present, our only strategy for mitigation is to search for potential solutions online. \ No newline at end of file From 3fcb58f336ee262e92abb777ce6f63d8d84a216d Mon Sep 17 00:00:00 2001 From: sergiorodriguezgarcia <113514397+sergiorodriguezgarcia@users.noreply.github.com> Date: Mon, 12 Feb 2024 17:38:48 +0100 Subject: [PATCH 21/55] chore: Updated section 11 risks and technical debts solution to table error Second version of the risks and technical debts section of the documentation --- docs/src/11_technical_risks.adoc | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/src/11_technical_risks.adoc b/docs/src/11_technical_risks.adoc index 3779792b..0b9cbec2 100644 --- a/docs/src/11_technical_risks.adoc +++ b/docs/src/11_technical_risks.adoc @@ -18,5 +18,6 @@ ifndef::imagesdir[:imagesdir: ../images] |Coordination and responsability problems |It is probably the first time involvement in developing a project from scratch, including decisions on architecture, design, and implementation, introduces various challenges. Misunderstandings regarding tasks and version control management errors can result in individuals inadvertently disrupting the work of others. Additionally, the necessity to make numerous decisions and reach agreements increases the likelihood of errors, potentially consuming significant time and effort. |To ensure effective collaboration and organization, adhere to the teachers' instructions concerning GitHub, including utilizing features such as issues and pull requests, and maintain a disciplined approach to your work. Furthermore, leverage the collective knowledge and suggestions of every team member, integrating them with your existing expertise. +|=== In terms of technical debt, it's likely to be significant due to our lack of familiarity with the majority of the technologies involved for most of the team. Both Wikidata and React present considerable challenges, and we anticipate accumulating substantial technical debt in both areas. At present, our only strategy for mitigation is to search for potential solutions online. \ No newline at end of file From 0f5691e9d3bbe9e17ac7dca0b969eb5530dc9bfd Mon Sep 17 00:00:00 2001 From: UO288090 Date: Mon, 12 Feb 2024 18:44:33 +0100 Subject: [PATCH 22/55] chore: Adding info to the documentation --- docs/src/05_building_block_view.adoc | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/docs/src/05_building_block_view.adoc b/docs/src/05_building_block_view.adoc index 5e6ce2b5..c1959b03 100644 --- a/docs/src/05_building_block_view.adoc +++ b/docs/src/05_building_block_view.adoc @@ -44,24 +44,30 @@ See https://docs.arc42.org/section-5/[Building Block View] in the arc42 document [role="arc42help"] **** -This is the overall view of the application. The diagram is composed of 3 elements that will interact between each other. **** -_****_ +This is the overall view of the application. The diagram is composed of 3 elements that will interact between each other. + +_**Overview Diagram**_ image::BusinessContext.png["Overall view of the business context"] Motivation:: +This will be the general sketch of the elements interacting inside the application, including the external elements that will include the application. -__ +Contained Building Blocks:: +**** +* **Player:** This is the user that will be playing with our application. They will need tl be authenticated to be able to play. +* **WIQ Application:** This is the main application that will reproduce how the game will work. This part will be more detailed in the following parts. +* **WikiData API:** This is an external API, which will provide us with the information to produce the questions. -Contained Building Blocks:: -__ +**** Important Interfaces:: __ +//TODO [role="arc42help"] **** From 0f0c32f9dd2e9477b9ec854bcece6d17072ce04f Mon Sep 17 00:00:00 2001 From: UO288090 Date: Mon, 12 Feb 2024 19:10:45 +0100 Subject: [PATCH 23/55] chore: Starting with the level 2 --- docs/src/05_building_block_view.adoc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/src/05_building_block_view.adoc b/docs/src/05_building_block_view.adoc index c1959b03..f2f25ce4 100644 --- a/docs/src/05_building_block_view.adoc +++ b/docs/src/05_building_block_view.adoc @@ -151,13 +151,18 @@ Leave out normal, simple, boring or standardized parts of your system ==== White Box __ +image::ContainerDiagram.png["Container for the WIQ System"] + [role="arc42help"] **** -...describes the internal structure of _building block 1_. +This diagram describes the internal organization of the WIQ Application. **** __ +Motivation:: +The WIQ Application + ==== White Box __ From 2288053ef8b2a7c45aaa57baedb871c591b4d9a7 Mon Sep 17 00:00:00 2001 From: UO288090 Date: Tue, 13 Feb 2024 11:04:17 +0100 Subject: [PATCH 24/55] chore: Few modifications on level 2 --- docs/src/05_building_block_view.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/05_building_block_view.adoc b/docs/src/05_building_block_view.adoc index f2f25ce4..6307dda8 100644 --- a/docs/src/05_building_block_view.adoc +++ b/docs/src/05_building_block_view.adoc @@ -161,7 +161,7 @@ This diagram describes the internal organization of the WIQ Application. __ Motivation:: -The WIQ Application +An inner view on the WIQ Application and its components inside ==== White Box __ From 27970576e6a3b0ef5d9eadbfb4c91416a91a8bd2 Mon Sep 17 00:00:00 2001 From: jjgancfer Date: Tue, 13 Feb 2024 12:49:23 +0100 Subject: [PATCH 25/55] docs: modified the solution strategy according to today's meeting --- docs/src/04_solution_strategy.adoc | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/src/04_solution_strategy.adoc b/docs/src/04_solution_strategy.adoc index 8aa8bd5e..91579fe7 100644 --- a/docs/src/04_solution_strategy.adoc +++ b/docs/src/04_solution_strategy.adoc @@ -26,9 +26,10 @@ We also have a Whatsapp community for the team, and a Notion wiki. === Important quality-related decisions |=== -|Quality attribute pursued|Solution chosen -|Privacy|All stored password will be hashed, both client-side and server-side, to avoid password disclosure. The client-side password is also intended to prevent password discoverage in case it is a repeated one.| -|Robustness|Currently, all validations will take place server-side to avoid not being properly taken care of due to JavaScript desactivation, such as when using the NoScript plug-in| +|*Quality attribute pursued*|*Solution chosen* +|Privacy|All stored password will be hashed, both client-side and server-side, to avoid password disclosure. The client-side password is also intended to prevent password discoverage in case it is a repeated one. +|Robustness|Currently, all validations will take place server-side to avoid not being properly taken care of due to JavaScript desactivation, such as when using the NoScript plug-in +|Speed|Since Wikidata has a 1 minute limit related to the API, the backend will start querying it upon start and fill the database with questions to increase speed and thus improve user experience| |=== === Workflow @@ -37,7 +38,7 @@ We have divided ourselves in teams related to our own areas of expertise, but th All in all, we strive to achieve a very flexible workflow in which everyone's input may be considered if they wish to give it. -=== Code style +=== Code Style Regarding the code style, we must make two important distinctions: the frontend and backend. In the latter, we will mainly use Object Oriented Programming because our language of choice is Java, which strongly favours it. Regarding the former, it will be more of a case-by-case approach, as for instance, OOP-oriented React is deprecated in favor of a functional approach, but sometimes we may need OOP's strengths. From a55740628baad598586dcaea02084280c15579d9 Mon Sep 17 00:00:00 2001 From: "Dario G. Mori" Date: Wed, 14 Feb 2024 10:22:52 +0100 Subject: [PATCH 26/55] chore: added pngs --- docs/images/BusinessContext.png | Bin 0 -> 26099 bytes docs/images/DeploymentDiagram.png | Bin 0 -> 36098 bytes docs/images/TechnicalContextDiagram.png | Bin 0 -> 47467 bytes docs/src/03_system_scope_and_context.adoc | 2 -- 4 files changed, 2 deletions(-) create mode 100644 docs/images/BusinessContext.png create mode 100644 docs/images/DeploymentDiagram.png create mode 100644 docs/images/TechnicalContextDiagram.png diff --git a/docs/images/BusinessContext.png b/docs/images/BusinessContext.png new file mode 100644 index 0000000000000000000000000000000000000000..62cf2d8c6e70fde89805edfe99b66a912224aed3 GIT binary patch literal 26099 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 z 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 -**** - image::BusinessContext.png[align="center",title="Business Context",link="BusinessContext.png] The WIQ application will communicate with the WikiData API through REST HTTP calls using SPARQL for the queries. It will ask the API for information that will later be used for generating the questions that will be shown to the player. This information will come in the form of text, images or audio. From 645467978ec1205e6ec79d4d59160d59d2f6e2d7 Mon Sep 17 00:00:00 2001 From: jjgancfer Date: Wed, 14 Feb 2024 10:50:37 +0100 Subject: [PATCH 27/55] docs: add an inital draft of the deployment view --- docs/src/07_deployment_view.adoc | 82 +++++--------------------------- 1 file changed, 13 insertions(+), 69 deletions(-) diff --git a/docs/src/07_deployment_view.adoc b/docs/src/07_deployment_view.adoc index a002c4a8..20ba1437 100644 --- a/docs/src/07_deployment_view.adoc +++ b/docs/src/07_deployment_view.adoc @@ -2,93 +2,37 @@ ifndef::imagesdir[:imagesdir: ../images] [[section-deployment-view]] - == Deployment 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"] -**** -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. -**** -image::DeploymentView.png[align="center",title="Deployment View",link="DeploymentView.png] -_****_ - Motivation:: -__ +The above diagram shows the initial version of the architecture and the division between its components. We will be using a simple client-server architecture, and the server will be querying Wikidata for the questions. By separating the architecture in this way we enforce a clear separation between the client/frontend and the server/backend, which benefits the system as a whole because so long the common API is implemented, the implementations themselves shall remain interchangeable. Quality and/or Performance Features:: -__ +As stated before, we consider the main advantage of this architecture the interchangeability of the components. There remain details to be scratched out though, but this is still an initial version. Mapping of Building Blocks to Infrastructure:: -__ + * The webapp/frontend/client is contained within the `webapp` subfolder. + * The API/backend is contained within the `api` subfolder. + ** The database will be generated on deployment. + ** Wikidata is an external component, so although it is an important part of the deployment architecture, it is something we do not have access to changing. === 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. -**** - -==== __ +==== Frontend/Client -__ +This component is self-contained and does not require much explanation. -==== __ +==== API/Backend -__ +===== Server -... +Our main idea is that the server will be a self-contained .jar file with all the dependencies required within. It will communicate with the database and periodically query Wikidata to generate questions until a certain number has been obtained once per minute to fill up the database and improve speed. -==== __ +===== Database -__ +The database will contain the data used by the system. Therefore, it will contain user data and questions and their answers. From c6fed13d69943d6b23c138a677f65deef9ca5e76 Mon Sep 17 00:00:00 2001 From: jjgancfer Date: Wed, 14 Feb 2024 18:45:49 +0100 Subject: [PATCH 28/55] docs: add the deployment diagram --- docs/src/07_deployment_view.adoc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/src/07_deployment_view.adoc b/docs/src/07_deployment_view.adoc index 20ba1437..2dd0acd3 100644 --- a/docs/src/07_deployment_view.adoc +++ b/docs/src/07_deployment_view.adoc @@ -4,6 +4,8 @@ ifndef::imagesdir[:imagesdir: ../images] == Deployment View +image::DeploymentDiagram.png[align="center",title="Deployment Diagram",link="DeploymentDiagram.png] + === Infrastructure Level 1 Motivation:: From 420c588f2cb05bb49481415c71d7181db529aac8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gonzalo=20Su=C3=A1rez=20Losada?= Date: Wed, 14 Feb 2024 21:22:13 +0100 Subject: [PATCH 29/55] chore: name added in README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index f1dab6f8..6c2e3952 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,7 @@ This is a base repo for the [Software Architecture course](http://arquisoft.gith | Jorge Joaquín Gancedo Fernández | UO282161 | | Sergio Quintana Fernández | UO288090 | | Diego Villanueva Berros | UO283615 | +| Gonzalo Suárez Losada | UO283928 | This repo is a basic application composed of several components. From 384dd5b775edcd09d66435448556b3a13d81bfa0 Mon Sep 17 00:00:00 2001 From: jjgancfer Date: Thu, 15 Feb 2024 00:03:21 +0100 Subject: [PATCH 30/55] fix-docs: updated documentation according to the feedback received in #35 --- .gitignore | 5 ++++- .vscode/settings.json | 1 - docs/src/07_deployment_view.adoc | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) delete mode 100644 .vscode/settings.json diff --git a/.gitignore b/.gitignore index 8bbe72a8..6876c6b3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ node_modules coverage -docs/build \ No newline at end of file +docs/build + +.idea +.vscode \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 9e26dfee..00000000 --- a/.vscode/settings.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/docs/src/07_deployment_view.adoc b/docs/src/07_deployment_view.adoc index 2dd0acd3..1b555d1d 100644 --- a/docs/src/07_deployment_view.adoc +++ b/docs/src/07_deployment_view.adoc @@ -37,4 +37,4 @@ Our main idea is that the server will be a self-contained .jar file with all the ===== Database -The database will contain the data used by the system. Therefore, it will contain user data and questions and their answers. +The database will contain the data used by the system. Therefore, it will contain user data, as well as the data related to the questions and their answers. The databases to store the questions (and therefore the answers) and the user data might be different, though. From 0f9af18cbb783f10704be3c01763da646fba8e7d Mon Sep 17 00:00:00 2001 From: Gonzalo Alonso Fernandez Date: Thu, 15 Feb 2024 10:40:37 +0100 Subject: [PATCH 31/55] chore: finishing documentation. --- docs/index.adoc | 4 +- docs/src/01_introduction_and_goals.adoc | 171 +----------------------- docs/src/10_quality_requirements.adoc | 65 +-------- docs/src/13_annex.adoc | 80 +++++++++++ 4 files changed, 91 insertions(+), 229 deletions(-) create mode 100644 docs/src/13_annex.adoc diff --git a/docs/index.adoc b/docs/index.adoc index 468be5fd..29cb7d6a 100644 --- a/docs/index.adoc +++ b/docs/index.adoc @@ -96,4 +96,6 @@ include::src/11_technical_risks.adoc[] // 12. Glossary include::src/12_glossary.adoc[] - +<<<< +// 13. Annex +include::src/13_annex.adoc[] diff --git a/docs/src/01_introduction_and_goals.adoc b/docs/src/01_introduction_and_goals.adoc index 40950d67..204818a8 100644 --- a/docs/src/01_introduction_and_goals.adoc +++ b/docs/src/01_introduction_and_goals.adoc @@ -2,45 +2,9 @@ ifndef::imagesdir[:imagesdir: ../images] [[section-introduction-and-goals]] == Introduction and Goals - -[role="arc42help"] -**** -Describes the relevant requirements and the driving forces that software architects and development team must consider. -These include - -* underlying business goals, -* essential features, -* essential functional requirements, -* quality goals for the architecture and -* relevant stakeholders and their expectations -**** RTVE has hired the company HappySw, composed of students from the Oviedo School of Software Engineering, to develop a new experimental version of the quiz show Saber y Ganar. This application will be called WIQ, where users will be able to register and log in to play. The application will consist of answering questions of different types generated with Wikidata. For each question answered correctly, points will be obtained. === Requirements Overview - -[role="arc42help"] -**** -.Contents -Short description of the functional requirements, driving forces, extract (or abstract) -of requirements. Link to (hopefully existing) requirements documents -(with version number and information where to find it). - -.Motivation -From the point of view of the end users a system is created or modified to -improve support of a business activity and/or improve the quality. - -.Form -Short textual description, probably in tabular use-case format. -If requirements documents exist this overview should refer to these documents. - -Keep these excerpts as short as possible. Balance readability of this document with potential redundancy w.r.t to requirements documents. - - -.Further Information - -See https://docs.arc42.org/section-1/[Introduction and Goals] in the arc42 documentation. -**** - * The system will provide non-registered users with the option to sign up. * The system will provide unidentified users with the option to log in. * The system can only be used by registered users. @@ -54,105 +18,10 @@ See https://docs.arc42.org/section-1/[Introduction and Goals] in the arc42 docum * The system will offer registered users access the ranking of the game. * The system will set a time limit for registered users to respond to each question. -==== Functional Requirements -===== Users Sign up. -[none or no-bullet] -* FR-USU 1. The system will offer to an unregistered user a registration form. -* FR-USU 2. The system will request the necessary data to register the new user. -[none or no-bullet] -** FR-USU 2.1. The system will request the following data to register the new user: -[none or no-bullet] -*** FR-USU 2.1.1. Username. -*** FR-USU 2.1.2. Email address. -*** FR-USU 2.1.3. Password. -*** FR-USU 2.1.4. All data fields are mandatory. -* FR-USU 3. When any value entered by the new user is invalid, the user will receive a message notifying the error and will not be able to register. -* FR-USU 4. When all the values entered by the new user are valid, the system will check if the user is already registered in the persistence system. -[none or no-bullet] -** FR-USU 4.1. When a user with the same data is already found in the persistence system, the user will not be able to create a new account since it already exists. -** FR-USU 4.2. When no user matching the data is found in the persistence system. -[none or no-bullet] -*** FR-USU 4.2.1. The new user will be registered in the system. - -===== Users Log in. -[none or no-bullet] -* FR-ULI 1. The system must allow an unidentified user to log in. -[none or no-bullet] -** FR-ULI 1.1. The system will request the email address as the user identifier. -[none or no-bullet] -*** FR-ULI 1.1.1. The system must check that its format is valid. -*** FR-ULI 1.1.2. It is a mandatory field. -** FR-ULI 1.2. The system will request the user's password. -[none or no-bullet] -*** FR-ULI 1.2.1. It is a mandatory field. -** FR-ULI 1.3. The system will automatically validate the entered data to verify when it corresponds to a registered user account. -[none or no-bullet] -*** FR-ULI 1.3.1. When the user is not stored in the persistence system, an error message will be displayed. -*** FR-ULI 1.3.2. When the user exists in the persistence system, but the passwords do not match, a message will be displayed to the user notifying them of the error. -*** FR-ULI 1.3.3. When the user is stored in the persistence system and the passwords match, the user will be logged in. -* FR-ULI 2. The system must allow users who are logged in to log out. - -===== Data management by the user. -[none or no-bullet] -* FR-DMU 1. The system will allow all registered users to access their historical data from their participation. -[none or no-bullet] -** FR-DMU 1.1. Registered users will be able to access the number of games they have played. -** FR-DMU 1.2. Registered users will be able to access the number of questions they have answered correctly. -** FR-DMU 1.3. Registered users will be able to access the number of questions they have answered incorrectly. -** FR-DMU 1.4. Registered users will be able to access the time they have spent within the system. -** FR-DMU 1.5. Registered users will be able to access the ranking of the game. +See the complete functional requirements in the xref:#section-annex[Annex] of the documentation. -===== Play to WIQ. -[none or no-bullet] -* FR-PWIQ 1. The system will only allow registered users to play the WIQ game. -* FR-PWIQ 2. The game consists of nine rounds. -[none or no-bullet] -** FR-PWIQ 2.1. In each round, the system will automatically generate a question to the registered user. -** FR-PWIQ 2.2. In each round, the system will provide the registered user with four automatically generated possible answers. -** FR-PWIQ 2.3. In each round, there will always be only one correct answer. -** FR-PWIQ 2.4. The system will automatically end the game after completing the ninth round. -* FR-PWIQ 3. The registered user must respond to the question before the specified time expires. -[none or no-bullet] -** FR-PWIQ 3.1. When the specified time has not ended, and the registered user has provided an answer: -[none or no-bullet] -*** FR-PWIQ 3.1.1. The system will check if the answer is correct. -[none or no-bullet] -**** FR-PWIQ 3.1.1.1. When the answer is correct: -[none or no-bullet] -***** FR-PWIQ 3.1.1.1.1. The registered user will earn 10 points. -***** FR-PWIQ 3.1.1.1.2. When the registered user is in the ninth round, the system will end the game. -***** FR-PWIQ 3.1.1.1.3. When the registered user is not in the ninth round, the system will move to the next round. -**** FR-PWIQ 3.1.1.2. When the answer is incorrect: -[none or no-bullet] -***** FR-PWIQ 3.1.1.2.1. When the registered user is in the ninth round, the system will end the game. -***** FR-PWIQ 3.1.1.2.2. When the registered user is not in the ninth round, the system will move to the next round. -** FR-PWIQ 3.2. When the specified time has ended: -[none or no-bullet] -*** FR-PWIQ 3.2.1. When the registered user is in the ninth round, the system will end the game. -*** FR-PWIQ 3.2.2. When the registered user is not in the ninth round, the system will move to the next round. === Quality Goals - -[role="arc42help"] -**** -.Contents -The top three (max five) quality goals for the architecture whose fulfillment is of highest importance to the major stakeholders. -We really mean quality goals for the architecture. Don't confuse them with project goals. -They are not necessarily identical. - -Consider this overview of potential topics (based upon the ISO 25010 standard): - -image::01_2_iso-25010-topics-EN.drawio.png["Categories of Quality Requirements"] - -.Motivation -You should know the quality goals of your most important stakeholders, since they will influence fundamental architectural decisions. -Make sure to be very concrete about these qualities, avoid buzzwords. -If you as an architect do not know how the quality of your work will be judged... - -.Form -A table with quality goals and concrete scenarios, ordered by priorities -**** - [options="header",cols="1,3"] |=== |Goal|Description @@ -168,39 +37,11 @@ A table with quality goals and concrete scenarios, ordered by priorities |=== === Stakeholders - -[role="arc42help"] -**** -.Contents -Explicit overview of stakeholders of the system, i.e. all person, roles or organizations that - -* should know the architecture -* have to be convinced of the architecture -* have to work with the architecture or with code -* need the documentation of the architecture for their work -* have to come up with decisions about the system or its development - -.Motivation -You should know all parties involved in development of the system or affected by the system. -Otherwise, you may get nasty surprises later in the development process. -These stakeholders determine the extent and the level of detail of your work and its results. - -.Form -Table with role names, person names, and their expectations with respect to the architecture and its documentation. -**** - -[options="header",cols="1,2,2"] +[options="header",cols="1,1,2"] |=== |Role/Name|Contact|Expectations -| RTVE | Client | __ -| HappySw | Software Development Team | __ -| Registered user | __ | __ -| Usability expert | __ | __ -| Accesibility expert | __ | __ -| Security expert | __ | __ -| Design expert | __ | __ -| DNS provider | __ | __ -| Translation team | __ | __ -| Project Manager | __ | __ -| Wikidata | __ | __ +| RTVE | rtve@email.com | To have a new experimental version of the Saber y Ganar quiz show. +| HappySw | happysw@email.com | Develop a good application that fullfills the requirements expected by the client. +| Registered user | Unknown | To play with an entertaining and easy-to-use application. An application with which the user learn about different topics. +| Wikidata | wikid@email.com | Being able to offer service allowing people to use the data through the API. |=== diff --git a/docs/src/10_quality_requirements.adoc b/docs/src/10_quality_requirements.adoc index 50c4cf14..e670d0a8 100644 --- a/docs/src/10_quality_requirements.adoc +++ b/docs/src/10_quality_requirements.adoc @@ -2,74 +2,13 @@ ifndef::imagesdir[:imagesdir: ../images] [[section-quality-scenarios]] == Quality Requirements - - -[role="arc42help"] -**** - -.Content -This section contains all quality requirements as quality tree with scenarios. The most important ones have already been described in section 1.2. (quality goals) - -Here you can also capture quality requirements with lesser priority, -which will not create high risks when they are not fully achieved. - -.Motivation -Since quality requirements will have a lot of influence on architectural -decisions you should know for every stakeholder what is really important to them, -concrete and measurable. - - -.Further Information - -See https://docs.arc42.org/section-10/[Quality Requirements] in the arc42 documentation. - -**** - === Quality Tree - -[role="arc42help"] -**** -.Content -The quality tree (as defined in ATAM – Architecture Tradeoff Analysis Method) with quality/evaluation scenarios as leafs. - -.Motivation -The tree structure with priorities provides an overview for a sometimes large number of quality requirements. - -.Form -The quality tree is a high-level overview of the quality goals and requirements: - -* tree-like refinement of the term "quality". Use "quality" or "usefulness" as a root -* a mind map with quality categories as main branches - -In any case the tree should include links to the scenarios of the following section. -**** +This quality tree is a high-level overview of the quality goals and requirements. The Quality tree uses "quality" as a root while the rest of the quality categories will be displayed as branches. image:10_Quality_Tree.png[] === Quality Scenarios - -[role="arc42help"] -**** -.Contents -Concretization of (sometimes vague or implicit) quality requirements using (quality) scenarios. - -These scenarios describe what should happen when a stimulus arrives at the system. - -For architects, two kinds of scenarios are important: - -* Usage scenarios (also called application scenarios or use case scenarios) describe the system’s runtime reaction to a certain stimulus. This also includes scenarios that describe the system’s efficiency or performance. Example: The system reacts to a user’s request within one second. -* Change scenarios describe a modification of the system or of its immediate environment. Example: Additional functionality is implemented or requirements for a quality attribute change. - -.Motivation -Scenarios make quality requirements concrete and allow to -more easily measure or decide whether they are fulfilled. - -Especially when you want to assess your architecture using methods like ATAM you need to describe your quality goals (from section 1.2) -more precisely down to a level of scenarios that can be discussed and evaluated. - -.Form -Tabular or free form text. -**** +To obtain a measurable system response to stimulus corresponding to the various quality branches outlined in the mindmap, we will use quality scenarios. Scenarios make quality requirements concrete and allow to more easily measure or decide whether they are fulfilled. ==== Usage Scenarios [options="header",cols="1,3,1"] diff --git a/docs/src/13_annex.adoc b/docs/src/13_annex.adoc new file mode 100644 index 00000000..eae96183 --- /dev/null +++ b/docs/src/13_annex.adoc @@ -0,0 +1,80 @@ +ifndef::imagesdir[:imagesdir: ../images] + +[[section-annex]] +== Annex +=== Functional Requirements +==== Users Sign up. +[none or no-bullet] +* FR-USU 1. The system will offer to an unregistered user a registration form. +* FR-USU 2. The system will request the necessary data to register the new user. +[none or no-bullet] +** FR-USU 2.1. The system will request the following data to register the new user: +[none or no-bullet] +*** FR-USU 2.1.1. Username. +*** FR-USU 2.1.2. Email address. +*** FR-USU 2.1.3. Password. +*** FR-USU 2.1.4. All data fields are mandatory. +* FR-USU 3. When any value entered by the new user is invalid, the user will receive a message notifying the error and will not be able to register. +* FR-USU 4. When all the values entered by the new user are valid, the system will check if the user is already registered in the persistence system. +[none or no-bullet] +** FR-USU 4.1. When a user with the same data is already found in the persistence system, the user will not be able to create a new account since it already exists. +** FR-USU 4.2. When no user matching the data is found in the persistence system. +[none or no-bullet] +*** FR-USU 4.2.1. The new user will be registered in the system. + +==== Users Log in. +[none or no-bullet] +* FR-ULI 1. The system must allow an unidentified user to log in. +[none or no-bullet] +** FR-ULI 1.1. The system will request the email address as the user identifier. +[none or no-bullet] +*** FR-ULI 1.1.1. The system must check that its format is valid. +*** FR-ULI 1.1.2. It is a mandatory field. +** FR-ULI 1.2. The system will request the user's password. +[none or no-bullet] +*** FR-ULI 1.2.1. It is a mandatory field. +** FR-ULI 1.3. The system will automatically validate the entered data to verify when it corresponds to a registered user account. +[none or no-bullet] +*** FR-ULI 1.3.1. When the user is not stored in the persistence system, an error message will be displayed. +*** FR-ULI 1.3.2. When the user exists in the persistence system, but the passwords do not match, a message will be displayed to the user notifying them of the error. +*** FR-ULI 1.3.3. When the user is stored in the persistence system and the passwords match, the user will be logged in. +* FR-ULI 2. The system must allow users who are logged in to log out. + +==== Data management by the user. +[none or no-bullet] +* FR-DMU 1. The system will allow all registered users to access their historical data from their participation. +[none or no-bullet] +** FR-DMU 1.1. Registered users will be able to access the number of games they have played. +** FR-DMU 1.2. Registered users will be able to access the number of questions they have answered correctly. +** FR-DMU 1.3. Registered users will be able to access the number of questions they have answered incorrectly. +** FR-DMU 1.4. Registered users will be able to access the time they have spent within the system. +** FR-DMU 1.5. Registered users will be able to access the ranking of the game. + +==== Play to WIQ. +[none or no-bullet] +* FR-PWIQ 1. The system will only allow registered users to play the WIQ game. +* FR-PWIQ 2. The game consists of nine rounds. +[none or no-bullet] +** FR-PWIQ 2.1. In each round, the system will automatically generate a question to the registered user. +** FR-PWIQ 2.2. In each round, the system will provide the registered user with four automatically generated possible answers. +** FR-PWIQ 2.3. In each round, there will always be only one correct answer. +** FR-PWIQ 2.4. The system will automatically end the game after completing the ninth round. +* FR-PWIQ 3. The registered user must respond to the question before the specified time expires. +[none or no-bullet] +** FR-PWIQ 3.1. When the specified time has not ended, and the registered user has provided an answer: +[none or no-bullet] +*** FR-PWIQ 3.1.1. The system will check if the answer is correct. +[none or no-bullet] +**** FR-PWIQ 3.1.1.1. When the answer is correct: +[none or no-bullet] +***** FR-PWIQ 3.1.1.1.1. The registered user will earn 10 points. +***** FR-PWIQ 3.1.1.1.2. When the registered user is in the ninth round, the system will end the game. +***** FR-PWIQ 3.1.1.1.3. When the registered user is not in the ninth round, the system will move to the next round. +**** FR-PWIQ 3.1.1.2. When the answer is incorrect: +[none or no-bullet] +***** FR-PWIQ 3.1.1.2.1. When the registered user is in the ninth round, the system will end the game. +***** FR-PWIQ 3.1.1.2.2. When the registered user is not in the ninth round, the system will move to the next round. +** FR-PWIQ 3.2. When the specified time has ended: +[none or no-bullet] +*** FR-PWIQ 3.2.1. When the registered user is in the ninth round, the system will end the game. +*** FR-PWIQ 3.2.2. When the registered user is not in the ninth round, the system will move to the next round. \ No newline at end of file From 8f35335785a93a9bc4191101c9c35a4c8be8f45d Mon Sep 17 00:00:00 2001 From: Gonzalo Alonso Fernandez Date: Fri, 16 Feb 2024 18:06:25 +0100 Subject: [PATCH 32/55] Chore: Correcting errors in requirements documentation. Mainly errors related to using "will" instead of "shall". --- docs/src/01_introduction_and_goals.adoc | 28 +++++------ docs/src/10_quality_requirements.adoc | 22 ++++----- docs/src/13_annex.adoc | 65 ++++++++++++------------- 3 files changed, 57 insertions(+), 58 deletions(-) diff --git a/docs/src/01_introduction_and_goals.adoc b/docs/src/01_introduction_and_goals.adoc index 204818a8..e9370df9 100644 --- a/docs/src/01_introduction_and_goals.adoc +++ b/docs/src/01_introduction_and_goals.adoc @@ -5,18 +5,18 @@ ifndef::imagesdir[:imagesdir: ../images] RTVE has hired the company HappySw, composed of students from the Oviedo School of Software Engineering, to develop a new experimental version of the quiz show Saber y Ganar. This application will be called WIQ, where users will be able to register and log in to play. The application will consist of answering questions of different types generated with Wikidata. For each question answered correctly, points will be obtained. === Requirements Overview -* The system will provide non-registered users with the option to sign up. -* The system will provide unidentified users with the option to log in. -* The system can only be used by registered users. -* The system will have a game mode with 9 rounds. -* In each round, the system will generate a question. -* In each round, the system will generate four answers, with only one being correct. -* The system will offer registered users access to the number of games they have played. -* The system will offer registered users access the number of questions they have answered correctly. -* The system will offer registered users access the number of questions they have answered incorrectly. -* The system will offer registered users access the time they have spent within the system. -* The system will offer registered users access the ranking of the game. -* The system will set a time limit for registered users to respond to each question. +* The system shall provide non-registered users with the option to sign up. +* The system shall provide unidentified users with the option to log in. +* The system shall only be used by registered users. +* The system shall have a game mode with 9 rounds. +* In each round, the system shall generate a question. +* In each round, the system shall generate four answers, with only one being correct. +* The system shall offer registered users access to the number of games they have played. +* The system shall offer registered users access the number of questions they have answered correctly. +* The system shall offer registered users access the number of questions they have answered incorrectly. +* The system shall offer registered users access the time they have spent within the system. +* The system shall offer registered users access the ranking of the game. +* The system shall set a time limit for registered users to respond to each question. See the complete functional requirements in the xref:#section-annex[Annex] of the documentation. @@ -25,12 +25,12 @@ See the complete functional requirements in the xref:#section-annex[Annex] of th [options="header",cols="1,3"] |=== |Goal|Description -| Functional suitability | The system must fulfill its intended purpose effectively and efficiently, allowing users to register, log in, play the quiz, and access their historical data. +| Functional suitability | The system shall fulfill its intended purpose effectively and efficiently, allowing users to register, log in, play the quiz, and access their user statistics. | Security | The system must prioritize user data security. It must implement robust authentication mechanisms for user registration and login. The API access points for user information and generated questions must be secured with proper authorization. | Reliability | The system should be reliable in generating questions from Wikidata, ensuring that questions are accurate and diverse. The system must handle user registrations, logins, and game data storage without errors. | Availability | The system must be available 99.99% of the time a user tries to access it. | Maintainability | The system must be designed and implemented in a way that facilitates easy maintenance and updates. -| Performance efficiency | The system must deliver optimal performance, ensuring responsive interactions for users. The automatic generation of questions from Wikidata and the real-time gameplay must be efficient. The system must handle 20 concurrent users. +| Performance efficiency | The system must deliver optimal performance, ensuring responsive interactions for users. The automatic generation of questions from Wikidata and the real-time gameplay must be efficient. The system must handle 3000 (temporal datum) concurrent users. | Usability | The system must provide a user-friendly interface, making it easy for users to register, log in, and play the game. The system learning time for a user should be less than 4 hours. | Compatibility | The system must be compatible with various web browsers and devices, ensuring a seamless experience for users regardless of their choice of platform. It has to be well-optimized for different screen sizes and functionalities. | Transferability | The system must allow for easy transfer of user data and game-related information through its APIs. diff --git a/docs/src/10_quality_requirements.adoc b/docs/src/10_quality_requirements.adoc index e670d0a8..455cabf9 100644 --- a/docs/src/10_quality_requirements.adoc +++ b/docs/src/10_quality_requirements.adoc @@ -14,20 +14,20 @@ To obtain a measurable system response to stimulus corresponding to the various [options="header",cols="1,3,1"] |=== |Quality attribute|Scenario|Priority -| Functional suitability | Users should be able to register, log in, play the quiz, and access historical data without encountering errors or glitches. | High, Medium -| Security | User data must be securely handled. Robust authentication mechanisms should be in place for user registration and login. API access points for user information and generated questions must be secured with proper authorization. | High, High -| Reliability | The system should reliably generate accurate and diverse questions from Wikidata. User registrations, logins, and game data storage should be handled without errors. | High, Medium -| Availability | The system must be available 99.99% of the time when a user attempts to access it. | High, High -| Performance efficiency | The system must deliver optimal performance, ensuring responsive interactions for users. It should efficiently generate questions from Wikidata and handle real-time gameplay with up to 20 concurrent users. | High, High -| Usability | The system must provide a user-friendly interface, allowing users to register, log in, and play the game with a learning time of less than 4 hours. | High, Medium -| Compatibility | The system must be compatible with various web browsers and devices, providing a seamless experience for users regardless of their choice of platform. It should be well-optimized for different screen sizes and functionalities. | High, Medium -| Transferability | The system must allow for easy transfer of user data and game-related information through its APIs. | Medium, High -| Testability | The unit tests must have at least 90% coverage. | High, Medium +| Functional suitability | Users shall be able to register, log in, play the quiz, and access historical data without encountering errors or glitches. | High, Medium +| Security | User data shall be securely handled. Robust authentication mechanisms shall be in place for user registration and login. API access points for user information and generated questions shall be secured with proper authorization. | High, High +| Reliability | The system shall reliably generate accurate and diverse questions from Wikidata. User registrations, logins, and game data storage shall be handled without errors. | High, Medium +| Availability | The system shall be available 99.99% of the time when a user attempts to access it. | High, High +| Performance efficiency | The system shall deliver optimal performance, ensuring responsive interactions for users. It shall efficiently generate questions from Wikidata and handle real-time gameplay with up to 20 concurrent users. | High, High +| Usability | The system shall provide a user-friendly interface, allowing users to register, log in, and play the game with a learning time of less than 4 hours. | High, Medium +| Compatibility | The system shall be compatible with various web browsers and devices, providing a seamless experience for users regardless of their choice of platform. It shall be well-optimized for different screen sizes and functionalities. | High, Medium +| Transferability | The system shall allow for easy transfer of user data and game-related information through its APIs. | Medium, High +| Testability | The unit tests shall have at least 75% coverage. | High, Medium |=== ==== Change Scenarios [options="header",cols="1,3,1"] |=== |Quality attribute|Scenario|Priority -| Maintainability | The system should be designed and implemented in a way that allows for easy maintenance and updates. | High, Medium -| Maintainability | The code of the system should be well-documented, and modular, allowing for efficient troubleshooting and modifications. | High, Medium +| Maintainability | The system shall be designed and implemented in a way that allows for easy maintenance and updates. | High, Medium +| Maintainability | The code of the system shall be well-documented, and modular, allowing for efficient troubleshooting and modifications. | High, Medium |=== \ No newline at end of file diff --git a/docs/src/13_annex.adoc b/docs/src/13_annex.adoc index eae96183..855febbd 100644 --- a/docs/src/13_annex.adoc +++ b/docs/src/13_annex.adoc @@ -5,76 +5,75 @@ ifndef::imagesdir[:imagesdir: ../images] === Functional Requirements ==== Users Sign up. [none or no-bullet] -* FR-USU 1. The system will offer to an unregistered user a registration form. -* FR-USU 2. The system will request the necessary data to register the new user. +* FR-USU 1. The system shall allow an unregistered user to register in the application. +* FR-USU 2. The system shall request the necessary data to register the new user. [none or no-bullet] -** FR-USU 2.1. The system will request the following data to register the new user: +** FR-USU 2.1. The system shall request the following mandatory data to register the new user: [none or no-bullet] *** FR-USU 2.1.1. Username. *** FR-USU 2.1.2. Email address. *** FR-USU 2.1.3. Password. -*** FR-USU 2.1.4. All data fields are mandatory. -* FR-USU 3. When any value entered by the new user is invalid, the user will receive a message notifying the error and will not be able to register. -* FR-USU 4. When all the values entered by the new user are valid, the system will check if the user is already registered in the persistence system. +* FR-USU 3. The system shall not allow the user to be registered when any value entered by the new user is invalid. +* FR-USU 4. When all the values entered by the new user are valid, the system shall check if the user is already registered in the persistence system. [none or no-bullet] -** FR-USU 4.1. When a user with the same data is already found in the persistence system, the user will not be able to create a new account since it already exists. +** FR-USU 4.1. When a user with the same data is already found in the persistence system, the user shall not be able to create a new account since it already exists. ** FR-USU 4.2. When no user matching the data is found in the persistence system. [none or no-bullet] -*** FR-USU 4.2.1. The new user will be registered in the system. +*** FR-USU 4.2.1. The new user shall be registered in the system. ==== Users Log in. [none or no-bullet] * FR-ULI 1. The system must allow an unidentified user to log in. [none or no-bullet] -** FR-ULI 1.1. The system will request the email address as the user identifier. +** FR-ULI 1.1. The system shall request the email address as the user identifier. [none or no-bullet] *** FR-ULI 1.1.1. The system must check that its format is valid. *** FR-ULI 1.1.2. It is a mandatory field. -** FR-ULI 1.2. The system will request the user's password. +** FR-ULI 1.2. The system shall request the user's password. [none or no-bullet] *** FR-ULI 1.2.1. It is a mandatory field. -** FR-ULI 1.3. The system will automatically validate the entered data to verify when it corresponds to a registered user account. +** FR-ULI 1.3. The system shall automatically validate the entered data to verify when it corresponds to a registered user account. [none or no-bullet] -*** FR-ULI 1.3.1. When the user is not stored in the persistence system, an error message will be displayed. -*** FR-ULI 1.3.2. When the user exists in the persistence system, but the passwords do not match, a message will be displayed to the user notifying them of the error. -*** FR-ULI 1.3.3. When the user is stored in the persistence system and the passwords match, the user will be logged in. +*** FR-ULI 1.3.1. When the user is not stored in the persistence system, an error message shall be displayed. +*** FR-ULI 1.3.2. When the user exists in the persistence system, but the passwords do not match, a message shall be displayed to the user notifying them of the error. +*** FR-ULI 1.3.3. When the user is stored in the persistence system and the passwords match, the user shall be logged in. * FR-ULI 2. The system must allow users who are logged in to log out. ==== Data management by the user. [none or no-bullet] -* FR-DMU 1. The system will allow all registered users to access their historical data from their participation. +* FR-DMU 1. The system shall allow all registered users to access their historical data from their participation. [none or no-bullet] -** FR-DMU 1.1. Registered users will be able to access the number of games they have played. -** FR-DMU 1.2. Registered users will be able to access the number of questions they have answered correctly. -** FR-DMU 1.3. Registered users will be able to access the number of questions they have answered incorrectly. -** FR-DMU 1.4. Registered users will be able to access the time they have spent within the system. -** FR-DMU 1.5. Registered users will be able to access the ranking of the game. +** FR-DMU 1.1. Registered users shall be able to access the number of games they have played. +** FR-DMU 1.2. Registered users shall be able to access the number of questions they have answered correctly. +** FR-DMU 1.3. Registered users shall be able to access the number of questions they have answered incorrectly. +** FR-DMU 1.4. Registered users shall be able to access the time they have spent within the system. +** FR-DMU 1.5. Registered users shall be able to access the ranking of the game. ==== Play to WIQ. [none or no-bullet] -* FR-PWIQ 1. The system will only allow registered users to play the WIQ game. +* FR-PWIQ 1. The system shall only allow registered users to play the WIQ game. * FR-PWIQ 2. The game consists of nine rounds. [none or no-bullet] -** FR-PWIQ 2.1. In each round, the system will automatically generate a question to the registered user. -** FR-PWIQ 2.2. In each round, the system will provide the registered user with four automatically generated possible answers. -** FR-PWIQ 2.3. In each round, there will always be only one correct answer. -** FR-PWIQ 2.4. The system will automatically end the game after completing the ninth round. +** FR-PWIQ 2.1. In each round, the system shall automatically generate a question to the registered user. +** FR-PWIQ 2.2. In each round, the system shall provide the registered user with four automatically generated possible answers. +** FR-PWIQ 2.3. In each round, there shall always be only one correct answer. +** FR-PWIQ 2.4. The system shall automatically end the game after completing the ninth round. * FR-PWIQ 3. The registered user must respond to the question before the specified time expires. [none or no-bullet] ** FR-PWIQ 3.1. When the specified time has not ended, and the registered user has provided an answer: [none or no-bullet] -*** FR-PWIQ 3.1.1. The system will check if the answer is correct. +*** FR-PWIQ 3.1.1. The system shall check if the answer is correct. [none or no-bullet] **** FR-PWIQ 3.1.1.1. When the answer is correct: [none or no-bullet] -***** FR-PWIQ 3.1.1.1.1. The registered user will earn 10 points. -***** FR-PWIQ 3.1.1.1.2. When the registered user is in the ninth round, the system will end the game. -***** FR-PWIQ 3.1.1.1.3. When the registered user is not in the ninth round, the system will move to the next round. +***** FR-PWIQ 3.1.1.1.1. The registered user shall earn 10 points. +***** FR-PWIQ 3.1.1.1.2. When the registered user is in the ninth round, the system shall end the game. +***** FR-PWIQ 3.1.1.1.3. When the registered user is not in the ninth round, the system shall move to the next round. **** FR-PWIQ 3.1.1.2. When the answer is incorrect: [none or no-bullet] -***** FR-PWIQ 3.1.1.2.1. When the registered user is in the ninth round, the system will end the game. -***** FR-PWIQ 3.1.1.2.2. When the registered user is not in the ninth round, the system will move to the next round. +***** FR-PWIQ 3.1.1.2.1. When the registered user is in the ninth round, the system shall end the game. +***** FR-PWIQ 3.1.1.2.2. When the registered user is not in the ninth round, the system shall move to the next round. ** FR-PWIQ 3.2. When the specified time has ended: [none or no-bullet] -*** FR-PWIQ 3.2.1. When the registered user is in the ninth round, the system will end the game. -*** FR-PWIQ 3.2.2. When the registered user is not in the ninth round, the system will move to the next round. \ No newline at end of file +*** FR-PWIQ 3.2.1. When the registered user is in the ninth round, the system shall end the game. +*** FR-PWIQ 3.2.2. When the registered user is not in the ninth round, the system shall move to the next round. \ No newline at end of file From 9b1d970d64b8b20b62be3e3f90e23aaa0068b4fc Mon Sep 17 00:00:00 2001 From: UO288090 Date: Fri, 16 Feb 2024 18:30:49 +0100 Subject: [PATCH 33/55] chore: Documentation completed (need to be reviewed and maybe cleaned) --- docs/src/05_building_block_view.adoc | 41 +++++++++++++++++++--------- 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/docs/src/05_building_block_view.adoc b/docs/src/05_building_block_view.adoc index 6307dda8..bfa2fe6a 100644 --- a/docs/src/05_building_block_view.adoc +++ b/docs/src/05_building_block_view.adoc @@ -5,6 +5,8 @@ ifndef::imagesdir[:imagesdir: ../images] == Building Block View + +//// [role="arc42help"] **** .Content @@ -39,15 +41,15 @@ Thus it contains the white box description of selected building blocks of level See https://docs.arc42.org/section-5/[Building Block View] in the arc42 documentation. **** +//// + === Whitebox Overall System [role="arc42help"] **** - -**** - This is the overall view of the application. The diagram is composed of 3 elements that will interact between each other. +**** _**Overview Diagram**_ @@ -66,9 +68,10 @@ Contained Building Blocks:: **** Important Interfaces:: -__ -//TODO +This part will be more detailed later, since the structure of the different interfaces/classes has not been discussed by the team yet. + +//// [role="arc42help"] **** Insert your explanations of black boxes from level 1: @@ -136,20 +139,18 @@ __ ==== +//// + === Level 2 [role="arc42help"] **** -Here you can specify the inner structure of (some) building blocks from level 1 as white boxes. - -You have to decide which building blocks of your system are important enough to justify such a detailed description. -Please prefer relevance over completeness. Specify important, surprising, risky, complex or volatile building blocks. -Leave out normal, simple, boring or standardized parts of your system +Here is an specification of the inner structure of the WIQ Application. **** -==== White Box __ +==== White Box __ image::ContainerDiagram.png["Container for the WIQ System"] @@ -158,11 +159,23 @@ image::ContainerDiagram.png["Container for the WIQ System"] This diagram describes the internal organization of the WIQ Application. **** -__ +//__ Motivation:: -An inner view on the WIQ Application and its components inside +An inner view on the WIQ Application and its components inside. How the WIQ application will be structured inside and its main components. + +Contained Building Blocks:: +**** +* **WIQ Client:** This is the connection between the user and the application. It will allow the users to play the WIQ game. This part will be developed in React with Typescript for its clear component structure, simplified code quality and separation of concerns. +* **WIQ REST API:** This is the part responsible for managing the users that log into the application, managing also the logic of the game and sending the request to the Wikidata API for the question generation. This part is going to be developed in Springboot due to its foundations on the Java programming language, which is the language that the developers find the easiest to develop in. +* **WIQ Database:** This is where the most important data is going to be stored. Such as, users questions and other game info that will be specified in the future. The database we chose to use is PostgreSQL, since it is compatible with Docker and it's an object-relational kind of database, which is easier for the developers to use. Another alternative would've been to use MySQL. +**** +Important Interfaces:: +This part will be more detailed later, since the structure of the different interfaces/classes has not been discussed by the team yet. + + +//// ==== White Box __ @@ -208,3 +221,5 @@ __ ==== White Box <_building block y.1_> __ +//// + From 2cf8ee2b8a8ca2ac61e4171099fc81b360adf16e Mon Sep 17 00:00:00 2001 From: Gonzalo Alonso Fernandez Date: Sat, 17 Feb 2024 10:15:17 +0100 Subject: [PATCH 34/55] chore: fixing the number of concurrent users in performance efficiency --- docs/src/01_introduction_and_goals.adoc | 2 +- docs/src/10_quality_requirements.adoc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/src/01_introduction_and_goals.adoc b/docs/src/01_introduction_and_goals.adoc index e9370df9..7b59875b 100644 --- a/docs/src/01_introduction_and_goals.adoc +++ b/docs/src/01_introduction_and_goals.adoc @@ -30,7 +30,7 @@ See the complete functional requirements in the xref:#section-annex[Annex] of th | Reliability | The system should be reliable in generating questions from Wikidata, ensuring that questions are accurate and diverse. The system must handle user registrations, logins, and game data storage without errors. | Availability | The system must be available 99.99% of the time a user tries to access it. | Maintainability | The system must be designed and implemented in a way that facilitates easy maintenance and updates. -| Performance efficiency | The system must deliver optimal performance, ensuring responsive interactions for users. The automatic generation of questions from Wikidata and the real-time gameplay must be efficient. The system must handle 3000 (temporal datum) concurrent users. +| Performance efficiency | The system must deliver optimal performance, ensuring responsive interactions for users. The automatic generation of questions from Wikidata and the real-time gameplay must be efficient. The system must handle N concurrent users. | Usability | The system must provide a user-friendly interface, making it easy for users to register, log in, and play the game. The system learning time for a user should be less than 4 hours. | Compatibility | The system must be compatible with various web browsers and devices, ensuring a seamless experience for users regardless of their choice of platform. It has to be well-optimized for different screen sizes and functionalities. | Transferability | The system must allow for easy transfer of user data and game-related information through its APIs. diff --git a/docs/src/10_quality_requirements.adoc b/docs/src/10_quality_requirements.adoc index 455cabf9..33d49327 100644 --- a/docs/src/10_quality_requirements.adoc +++ b/docs/src/10_quality_requirements.adoc @@ -18,7 +18,7 @@ To obtain a measurable system response to stimulus corresponding to the various | Security | User data shall be securely handled. Robust authentication mechanisms shall be in place for user registration and login. API access points for user information and generated questions shall be secured with proper authorization. | High, High | Reliability | The system shall reliably generate accurate and diverse questions from Wikidata. User registrations, logins, and game data storage shall be handled without errors. | High, Medium | Availability | The system shall be available 99.99% of the time when a user attempts to access it. | High, High -| Performance efficiency | The system shall deliver optimal performance, ensuring responsive interactions for users. It shall efficiently generate questions from Wikidata and handle real-time gameplay with up to 20 concurrent users. | High, High +| Performance efficiency | The system shall deliver optimal performance, ensuring responsive interactions for users. It shall efficiently generate questions from Wikidata and handle real-time gameplay with up to N concurrent users. | High, High | Usability | The system shall provide a user-friendly interface, allowing users to register, log in, and play the game with a learning time of less than 4 hours. | High, Medium | Compatibility | The system shall be compatible with various web browsers and devices, providing a seamless experience for users regardless of their choice of platform. It shall be well-optimized for different screen sizes and functionalities. | High, Medium | Transferability | The system shall allow for easy transfer of user data and game-related information through its APIs. | Medium, High From bc43b6bfb43fa2eb8d516cca3af17aa289a8d33a Mon Sep 17 00:00:00 2001 From: jjgancfer Date: Sat, 17 Feb 2024 13:35:51 +0100 Subject: [PATCH 35/55] fix: reword documentation according to new feedback in #35 --- docs/src/04_solution_strategy.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/04_solution_strategy.adoc b/docs/src/04_solution_strategy.adoc index 91579fe7..e726d914 100644 --- a/docs/src/04_solution_strategy.adoc +++ b/docs/src/04_solution_strategy.adoc @@ -29,7 +29,7 @@ We also have a Whatsapp community for the team, and a Notion wiki. |*Quality attribute pursued*|*Solution chosen* |Privacy|All stored password will be hashed, both client-side and server-side, to avoid password disclosure. The client-side password is also intended to prevent password discoverage in case it is a repeated one. |Robustness|Currently, all validations will take place server-side to avoid not being properly taken care of due to JavaScript desactivation, such as when using the NoScript plug-in -|Speed|Since Wikidata has a 1 minute limit related to the API, the backend will start querying it upon start and fill the database with questions to increase speed and thus improve user experience| +|Availability|Since Wikidata has a 1 minute limit related to the API, the backend will start querying it upon start and fill the database with questions to increase speed and thus improve user experience| |=== === Workflow From d016008025c629a819b4e4b83ddaee8bf0e9f55a Mon Sep 17 00:00:00 2001 From: Diego Villanueva <98838739+UO283615@users.noreply.github.com> Date: Sun, 18 Feb 2024 01:07:25 +0100 Subject: [PATCH 36/55] chore: Removed the quickstart guide and the deployment info from the readme --- README.md | 97 ------------------------------------------------------- 1 file changed, 97 deletions(-) diff --git a/README.md b/README.md index 6c2e3952..9196bbdd 100644 --- a/README.md +++ b/README.md @@ -26,100 +26,3 @@ This repo is a basic application composed of several components. Both the user and auth service share a Mongo database that is accessed with mongoose. -## Quick start guide - -### Using docker - -The fastest way for launching this sample project is using docker. Just clone the project: - -```sh -git clone https://github.com/Arquisoft/wiq_en2b.git -``` - -and launch it with docker compose: - -```sh -docker compose --profile dev up --build -``` - -### Starting Component by component - -First, start the database. Either install and run Mongo or run it using docker: - -```docker run -d -p 27017:27017 --name=my-mongo mongo:latest``` - -You can also use services like Mongo Altas for running a Mongo database in the cloud. - -Now, launch the auth, user and gateway services. Just go to each directory and run `npm install` followed by `npm start`. - -Lastly, go to the webapp directory and launch this component with `npm install` followed by `npm start`. - -After all the components are launched, the app should be available in localhost in port 3000. - -## Deployment - -For the deployment, we have several options. - -The first and more flexible is to deploy to a virtual machine using SSH. This will work with any cloud service (or with our own server). - -Other options include using the container services that most cloud services provide. This means, deploying our Docker containers directly. - -We are going to use the first approach, creating a virtual machine in a cloud service and after installing docker and docker-compose, deploy our containers there using GitHub Actions and SSH. - -### Machine requirements for deployment - -The machine for deployment can be created in services like Microsoft Azure or Amazon AWS. These are in general the settings that it must have: - -- Linux machine with Ubuntu > 20.04. -- Docker and docker-compose installed. -- Open ports for the applications installed (in this case, ports 3000 for the webapp and 8000 for the gateway service). - -Once you have the virtual machine created, you can install **docker** and **docker-compose** using the following instructions: - -```ssh -sudo apt update -sudo apt install apt-transport-https ca-certificates curl software-properties-common -curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - -sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable" -sudo apt update -sudo apt install docker-ce -sudo usermod -aG docker ${USER} -sudo curl -L "https://github.com/docker/compose/releases/download/1.28.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose -sudo chmod +x /usr/local/bin/docker-compose -``` - -### Continuous delivery (GitHub Actions) - -Once we have our machine ready, we could deploy by hand the application, taking our docker-compose file and executing it in the remote machine. - -In this repository, this process is done automatically using **GitHub Actions**. The idea is to trigger a series of actions when some condition is met in the repository. - -As you can see, unitary tests of each module and e2e tests are executed before pushing the docker images and deploying them. Using this approach we avoid deploying versions that do not pass the tests. - -The deploy action is the following: - -```yml -deploy: - name: Deploy over SSH - runs-on: ubuntu-latest - needs: [docker-push-userservice,docker-push-authservice,docker-push-gatewayservice,docker-push-webapp] - steps: - - name: Deploy over SSH - uses: fifsky/ssh-action@master - with: - host: ${{ secrets.DEPLOY_HOST }} - user: ${{ secrets.DEPLOY_USER }} - key: ${{ secrets.DEPLOY_KEY }} - command: | - wget https://raw.githubusercontent.com/arquisoft/wiq_en2b/master/docker-compose.yml -O docker-compose.yml - wget https://raw.githubusercontent.com/arquisoft/wiq_en2b/master/.env -O .env - docker compose down - docker compose --profile prod up -d -``` - -This action uses three secrets that must be configured in the repository: -- DEPLOY_HOST: IP of the remote machine. -- DEPLOY_USER: user with permission to execute the commands in the remote machine. -- DEPLOY_KEY: key to authenticate the user in the remote machine. - -Note that this action logs in the remote machine and downloads the docker-compose file from the repository and launches it. Obviously, previous actions have been executed which have uploaded the docker images to the GitHub Packages repository. From 429bf480c942e5bbf4dd6fc8352883e3d2e88dc0 Mon Sep 17 00:00:00 2001 From: Diego Villanueva <98838739+UO283615@users.noreply.github.com> Date: Sun, 18 Feb 2024 01:07:52 +0100 Subject: [PATCH 37/55] chore: Added the parts that were in the README.md to a new file --- Quickstart.md | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 Quickstart.md diff --git a/Quickstart.md b/Quickstart.md new file mode 100644 index 00000000..08764ec8 --- /dev/null +++ b/Quickstart.md @@ -0,0 +1,97 @@ +## Quick start guide + +### Using docker + +The fastest way for launching this sample project is using docker. Just clone the project: + +```sh +git clone https://github.com/Arquisoft/wiq_en2b.git +``` + +and launch it with docker compose: + +```sh +docker compose --profile dev up --build +``` + +### Starting Component by component + +First, start the database. Either install and run Mongo or run it using docker: + +```docker run -d -p 27017:27017 --name=my-mongo mongo:latest``` + +You can also use services like Mongo Altas for running a Mongo database in the cloud. + +Now, launch the auth, user and gateway services. Just go to each directory and run `npm install` followed by `npm start`. + +Lastly, go to the webapp directory and launch this component with `npm install` followed by `npm start`. + +After all the components are launched, the app should be available in localhost in port 3000. + +## Deployment + +For the deployment, we have several options. + +The first and more flexible is to deploy to a virtual machine using SSH. This will work with any cloud service (or with our own server). + +Other options include using the container services that most cloud services provide. This means, deploying our Docker containers directly. + +We are going to use the first approach, creating a virtual machine in a cloud service and after installing docker and docker-compose, deploy our containers there using GitHub Actions and SSH. + +### Machine requirements for deployment + +The machine for deployment can be created in services like Microsoft Azure or Amazon AWS. These are in general the settings that it must have: + +- Linux machine with Ubuntu > 20.04. +- Docker and docker-compose installed. +- Open ports for the applications installed (in this case, ports 3000 for the webapp and 8000 for the gateway service). + +Once you have the virtual machine created, you can install **docker** and **docker-compose** using the following instructions: + +```ssh +sudo apt update +sudo apt install apt-transport-https ca-certificates curl software-properties-common +curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - +sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable" +sudo apt update +sudo apt install docker-ce +sudo usermod -aG docker ${USER} +sudo curl -L "https://github.com/docker/compose/releases/download/1.28.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose +sudo chmod +x /usr/local/bin/docker-compose +``` + +### Continuous delivery (GitHub Actions) + +Once we have our machine ready, we could deploy by hand the application, taking our docker-compose file and executing it in the remote machine. + +In this repository, this process is done automatically using **GitHub Actions**. The idea is to trigger a series of actions when some condition is met in the repository. + +As you can see, unitary tests of each module and e2e tests are executed before pushing the docker images and deploying them. Using this approach we avoid deploying versions that do not pass the tests. + +The deploy action is the following: + +```yml +deploy: + name: Deploy over SSH + runs-on: ubuntu-latest + needs: [docker-push-userservice,docker-push-authservice,docker-push-gatewayservice,docker-push-webapp] + steps: + - name: Deploy over SSH + uses: fifsky/ssh-action@master + with: + host: ${{ secrets.DEPLOY_HOST }} + user: ${{ secrets.DEPLOY_USER }} + key: ${{ secrets.DEPLOY_KEY }} + command: | + wget https://raw.githubusercontent.com/arquisoft/wiq_en2b/master/docker-compose.yml -O docker-compose.yml + wget https://raw.githubusercontent.com/arquisoft/wiq_en2b/master/.env -O .env + docker compose down + docker compose --profile prod up -d +``` + +This action uses three secrets that must be configured in the repository: +- DEPLOY_HOST: IP of the remote machine. +- DEPLOY_USER: user with permission to execute the commands in the remote machine. +- DEPLOY_KEY: key to authenticate the user in the remote machine. + +Note that this action logs in the remote machine and downloads the docker-compose file from the repository and launches it. Obviously, previous actions have been executed which have uploaded the docker images to the GitHub Packages repository. From 517d7e39d2b8cb5b31c197277b398b5312bf45c4 Mon Sep 17 00:00:00 2001 From: Diego Villanueva <98838739+UO283615@users.noreply.github.com> Date: Sun, 18 Feb 2024 01:30:40 +0100 Subject: [PATCH 38/55] chore: Update README.md Added a bit of color and detail to the readme --- README.md | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 9196bbdd..7bfe0e60 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,17 @@ -# wiq_en2b +# 🧠🤔 wiq_en2b ❓📚 -[![Deploy on release](https://github.com/Arquisoft/wiq_en2b/actions/workflows/release.yml/badge.svg)](https://github.com/Arquisoft/wiq_en2b/actions/workflows/release.yml) -[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=Arquisoft_wiq_en2b&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=Arquisoft_wiq_en2b) -[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=Arquisoft_wiq_en2b&metric=coverage)](https://sonarcloud.io/summary/new_code?id=Arquisoft_wiq_en2b) +WIQ is a quiz game project inspired by the engaging and thought-provoking show "Saber y Ganar." +We aim to create a platform that not only challenges your knowledge but also sparks curiosity and the thrill of discovery. + + +## What Sets WIQ Apart +🤔 Thoughtful Questions: Dive into a world of intriguing and diverse questions, all generated procedurally using WikiData. +🌐 Encourage to improve: WIQ lets you keep track of your score to see in which areas you need to improve. + +## Features +🏆 Adaptable difficulty: You can adjust the difficulty to push your limits. +🌐 Multiplayer: Compete with friends and strangers to prove you are the best. -This is a base repo for the [Software Architecture course](http://arquisoft.github.io/) in [2023/2024 edition](https://arquisoft.github.io/course2324.html). ## Contributors | Nombre | UO | @@ -15,7 +22,16 @@ This is a base repo for the [Software Architecture course](http://arquisoft.gith | Jorge Joaquín Gancedo Fernández | UO282161 | | Sergio Quintana Fernández | UO288090 | | Diego Villanueva Berros | UO283615 | -| Gonzalo Suárez Losada | UO283928 | +| Gonzalo Suárez Losada | UO283928 | + +*** + + +[![Deploy on release](https://github.com/Arquisoft/wiq_en2b/actions/workflows/release.yml/badge.svg)](https://github.com/Arquisoft/wiq_en2b/actions/workflows/release.yml) +[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=Arquisoft_wiq_en2b&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=Arquisoft_wiq_en2b) +[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=Arquisoft_wiq_en2b&metric=coverage)](https://sonarcloud.io/summary/new_code?id=Arquisoft_wiq_en2b) + +This is a base repo for the [Software Architecture course](http://arquisoft.github.io/) in [2023/2024 edition](https://arquisoft.github.io/course2324.html). This repo is a basic application composed of several components. From 5faa89a935920120356b6d2b02bd49f7c3a83607 Mon Sep 17 00:00:00 2001 From: jjgancfer Date: Sun, 18 Feb 2024 10:40:14 +0100 Subject: [PATCH 39/55] fix: spelling mistakes in the documentation --- docs/src/04_solution_strategy.adoc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/src/04_solution_strategy.adoc b/docs/src/04_solution_strategy.adoc index e726d914..cfc818d4 100644 --- a/docs/src/04_solution_strategy.adoc +++ b/docs/src/04_solution_strategy.adoc @@ -9,7 +9,7 @@ What follows is a summary of our solution's main decisions, and the approach we Regarding the technologies, we decided to use the following ones: - * **React** for the frotend, using the **Chakra UI** component library. Although the preferred way to use React is currently through a framework, we preferred this approach due to this being many of us first time using it, as well as a lack of experience using any framework in any of us. + * **React** for the frontend, using the **Chakra UI** component library. Although the preferred way to use React is currently through a framework, we preferred this approach due to this being many of us first time using it, as well as a lack of experience using any framework in any of us. ** As a consecuence of this, pure JavaScript is being used due to React 18 not supporting Typescript 5. @@ -42,7 +42,7 @@ All in all, we strive to achieve a very flexible workflow in which everyone's in Regarding the code style, we must make two important distinctions: the frontend and backend. In the latter, we will mainly use Object Oriented Programming because our language of choice is Java, which strongly favours it. Regarding the former, it will be more of a case-by-case approach, as for instance, OOP-oriented React is deprecated in favor of a functional approach, but sometimes we may need OOP's strengths. - * In the backend, the structure will that of a typical Maven project. + * In the backend, the structure will be that of a typical Maven project. * In the frontend, the structure will be quite different: - ** The `src/components` will be contain single components which we may reuse. + ** The `src/components` will contain single components which we may reuse. ** The `src/pages` will contain the endpoints and will follow a simple structure. For instance, given a `/statistics/personal` and a `/statistics/general` endpoints, both will be independent React components that will return the page and be placed under the `src/pages/statistics` folder. \ No newline at end of file From 611af7cc0926205e5fefcf966fb5046b5e4e05bd Mon Sep 17 00:00:00 2001 From: UO288090 Date: Sun, 18 Feb 2024 10:49:17 +0100 Subject: [PATCH 40/55] chore: Remiving .idea --- .idea/.gitignore | 8 -------- .idea/arquisoft_wib_2b.iml | 9 --------- .idea/misc.xml | 6 ------ .idea/modules.xml | 8 -------- .idea/vcs.xml | 6 ------ 5 files changed, 37 deletions(-) delete mode 100644 .idea/.gitignore delete mode 100644 .idea/arquisoft_wib_2b.iml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 13566b81..00000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/.idea/arquisoft_wib_2b.iml b/.idea/arquisoft_wib_2b.iml deleted file mode 100644 index d6ebd480..00000000 --- a/.idea/arquisoft_wib_2b.iml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index b6087ad2..00000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 1f1e0d13..00000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 35eb1ddf..00000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file From 0ffe4db81968a9379c165327e7801697049988ad Mon Sep 17 00:00:00 2001 From: UO288090 Date: Sun, 18 Feb 2024 10:53:11 +0100 Subject: [PATCH 41/55] chore: Removing stuff from the json --- package-lock.json | 6 ++++++ package.json | 1 + 2 files changed, 7 insertions(+) create mode 100644 package-lock.json create mode 100644 package.json diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..cfbc632f --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6 @@ +{ + "name": "arquisoft_wib_2b", + "lockfileVersion": 3, + "requires": true, + "packages": {} +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/package.json @@ -0,0 +1 @@ +{} From 78698205d3fa0f822c9d55f657bd12941cb173f8 Mon Sep 17 00:00:00 2001 From: jjgancfer Date: Sun, 18 Feb 2024 11:10:31 +0100 Subject: [PATCH 42/55] hotfix: solve docs build error --- docs/src/08_concepts.adoc | 5 ----- 1 file changed, 5 deletions(-) diff --git a/docs/src/08_concepts.adoc b/docs/src/08_concepts.adoc index 6aa3a652..0f179bcc 100644 --- a/docs/src/08_concepts.adoc +++ b/docs/src/08_concepts.adoc @@ -3,11 +3,6 @@ ifndef::imagesdir[:imagesdir: ../images] [[section-concepts]] == Cross-cutting Concepts - -[role="arc42help"] -**** - - .Domain Model These diagram is just a sketch, it should be replaced by a more accurate version upon discussion. From dfc0de0c41066121ab2478a73c5d0f5ab2a70088 Mon Sep 17 00:00:00 2001 From: UO288090 Date: Sun, 18 Feb 2024 11:16:10 +0100 Subject: [PATCH 43/55] chore: Modifications in the jsons --- docs/package-lock.json | 876 ----------------------------------------- docs/package.json | 1 - package-lock.json | 6 - package.json | 1 - 4 files changed, 884 deletions(-) delete mode 100644 package-lock.json delete mode 100644 package.json diff --git a/docs/package-lock.json b/docs/package-lock.json index 8c157537..ab1646f2 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -8,170 +8,10 @@ "name": "docs", "version": "1.0.0", "dependencies": { - "asciidoctor": "^3.0.3", "gh-pages": "^3.2.3", "shx": "^0.3.3" } }, - "node_modules/@asciidoctor/cli": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@asciidoctor/cli/-/cli-4.0.0.tgz", - "integrity": "sha512-x2T9gW42921Zd90juEagtbViPZHNP2MWf0+6rJEkOzW7E9m3TGJtz+Guye9J0gwrpZsTMGCpfYMQy1We3X7osg==", - "dependencies": { - "yargs": "17.3.1" - }, - "bin": { - "asciidoctor": "bin/asciidoctor", - "asciidoctorjs": "bin/asciidoctor" - }, - "engines": { - "node": ">=16", - "npm": ">=8.0.0" - }, - "peerDependencies": { - "@asciidoctor/core": ">=2 <4" - } - }, - "node_modules/@asciidoctor/core": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@asciidoctor/core/-/core-3.0.3.tgz", - "integrity": "sha512-XCIRZnYblltGc5COGCtgSQfUqENds1xAHds9GSK31pALfHmxudX1ZAvM7mvwFpZDKUAdWpB3KrDY6oWK7VGM1g==", - "dependencies": { - "@asciidoctor/opal-runtime": "3.0.1", - "unxhr": "1.2.0" - }, - "engines": { - "node": ">=16", - "npm": ">=8" - } - }, - "node_modules/@asciidoctor/opal-runtime": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@asciidoctor/opal-runtime/-/opal-runtime-3.0.1.tgz", - "integrity": "sha512-iW7ACahOG0zZft4A/4CqDcc7JX+fWRNjV5tFAVkNCzwZD+EnFolPaUOPYt8jzadc0+Bgd80cQTtRMQnaaV1kkg==", - "dependencies": { - "glob": "8.1.0", - "unxhr": "1.2.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@asciidoctor/opal-runtime/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@asciidoctor/opal-runtime/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@asciidoctor/opal-runtime/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", - "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/types": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", - "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", - "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/a-sync-waterfall": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", - "integrity": "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==" - }, - "node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/array-union": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", @@ -191,37 +31,6 @@ "node": ">=0.10.0" } }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" - }, - "node_modules/asciidoctor": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/asciidoctor/-/asciidoctor-3.0.3.tgz", - "integrity": "sha512-sBHd8RH1AATrg+tkBdvsb/FFefDY3T3SE5tUBVEUtoT4qrazAfhgvfAI/8td1zGoRf7TwYp4Vfn2stuXBBgzXQ==", - "dependencies": { - "@asciidoctor/cli": "4.0.0", - "@asciidoctor/core": "3.0.3", - "ejs": "^3.1.2", - "handlebars": "^4.7.6", - "nunjucks": "^3.2.1", - "pug": "^3.0.0" - }, - "bin": { - "asciidoctor": "bin/asciidoctor", - "asciidoctorjs": "bin/asciidoctor" - }, - "engines": { - "node": ">=16", - "npm": ">=8" - } - }, - "node_modules/assert-never": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.2.1.tgz", - "integrity": "sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw==" - }, "node_modules/async": { "version": "2.6.4", "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", @@ -230,17 +39,6 @@ "lodash": "^4.17.14" } }, - "node_modules/babel-walk": { - "version": "3.0.0-canary-5", - "resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz", - "integrity": "sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==", - "dependencies": { - "@babel/types": "^7.9.6" - }, - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -255,72 +53,6 @@ "concat-map": "0.0.1" } }, - "node_modules/call-bind": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.6.tgz", - "integrity": "sha512-Mj50FLHtlsoVfRfnHaZvyrooHcrlceNZdL/QBvJJVd9Ta55qCQK0gs4ss2oZDeV9zFCs6ewzYgVE5yfVmfFpVg==", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.3", - "set-function-length": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/character-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", - "integrity": "sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==", - "dependencies": { - "is-regex": "^1.0.3" - } - }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -336,74 +68,11 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, - "node_modules/constantinople": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz", - "integrity": "sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==", - "dependencies": { - "@babel/parser": "^7.6.0", - "@babel/types": "^7.6.1" - } - }, - "node_modules/define-data-property": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.2.tgz", - "integrity": "sha512-SRtsSqsDbgpJBbW3pABMCOt6rQyeM8s8RiyeSN8jYG8sYmt/kGJejbydttUsnDs1tadr19tvhT4ShwMyoqAm4g==", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.2", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/doctypes": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", - "integrity": "sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==" - }, - "node_modules/ejs": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", - "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/email-addresses": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/email-addresses/-/email-addresses-3.1.0.tgz", "integrity": "sha512-k0/r7GrWVL32kZlGwfPNgB2Y/mMXVTq/decgLczm/j34whdaspNrZO8CnXPf1laaHxI6ptUlsnAxN+UAPw+fzg==" }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", - "engines": { - "node": ">=6" - } - }, "node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -412,33 +81,6 @@ "node": ">=0.8.0" } }, - "node_modules/filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/filename-reserved-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", @@ -517,32 +159,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/gh-pages": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-3.2.3.tgz", @@ -598,97 +214,11 @@ "node": ">=0.10.0" } }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, - "node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", - "dependencies": { - "get-intrinsic": "^1.2.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/hasown": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", @@ -733,70 +263,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-expression": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-4.0.0.tgz", - "integrity": "sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==", - "dependencies": { - "acorn": "^7.1.1", - "object-assign": "^4.1.1" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/jake": { - "version": "10.8.7", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", - "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", - "dependencies": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.4", - "minimatch": "^3.1.2" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jake/node_modules/async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" - }, - "node_modules/js-stringify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", - "integrity": "sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==" - }, "node_modules/jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", @@ -805,15 +271,6 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/jstransformer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", - "integrity": "sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==", - "dependencies": { - "is-promise": "^2.0.0", - "promise": "^7.0.1" - } - }, "node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -863,43 +320,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" - }, - "node_modules/nunjucks": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.4.tgz", - "integrity": "sha512-26XRV6BhkgK0VOxfbU5cQI+ICFUtMLixv1noZn1tGU38kQH5A5nmmbk/O45xdyBhD1esk47nKrY0mvQpZIhRjQ==", - "dependencies": { - "a-sync-waterfall": "^1.0.0", - "asap": "^2.0.3", - "commander": "^5.1.0" - }, - "bin": { - "nunjucks-precompile": "bin/precompile" - }, - "engines": { - "node": ">= 6.9.0" - }, - "peerDependencies": { - "chokidar": "^3.3.0" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, - "node_modules/nunjucks/node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "engines": { - "node": ">= 6" - } - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -1008,126 +428,6 @@ "node": ">=8" } }, - "node_modules/promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "dependencies": { - "asap": "~2.0.3" - } - }, - "node_modules/pug": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.2.tgz", - "integrity": "sha512-bp0I/hiK1D1vChHh6EfDxtndHji55XP/ZJKwsRqrz6lRia6ZC2OZbdAymlxdVFwd1L70ebrVJw4/eZ79skrIaw==", - "dependencies": { - "pug-code-gen": "^3.0.2", - "pug-filters": "^4.0.0", - "pug-lexer": "^5.0.1", - "pug-linker": "^4.0.0", - "pug-load": "^3.0.0", - "pug-parser": "^6.0.0", - "pug-runtime": "^3.0.1", - "pug-strip-comments": "^2.0.0" - } - }, - "node_modules/pug-attrs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-3.0.0.tgz", - "integrity": "sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==", - "dependencies": { - "constantinople": "^4.0.1", - "js-stringify": "^1.0.2", - "pug-runtime": "^3.0.0" - } - }, - "node_modules/pug-code-gen": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.2.tgz", - "integrity": "sha512-nJMhW16MbiGRiyR4miDTQMRWDgKplnHyeLvioEJYbk1RsPI3FuA3saEP8uwnTb2nTJEKBU90NFVWJBk4OU5qyg==", - "dependencies": { - "constantinople": "^4.0.1", - "doctypes": "^1.1.0", - "js-stringify": "^1.0.2", - "pug-attrs": "^3.0.0", - "pug-error": "^2.0.0", - "pug-runtime": "^3.0.0", - "void-elements": "^3.1.0", - "with": "^7.0.0" - } - }, - "node_modules/pug-error": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-2.0.0.tgz", - "integrity": "sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ==" - }, - "node_modules/pug-filters": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-4.0.0.tgz", - "integrity": "sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==", - "dependencies": { - "constantinople": "^4.0.1", - "jstransformer": "1.0.0", - "pug-error": "^2.0.0", - "pug-walk": "^2.0.0", - "resolve": "^1.15.1" - } - }, - "node_modules/pug-lexer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-5.0.1.tgz", - "integrity": "sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==", - "dependencies": { - "character-parser": "^2.2.0", - "is-expression": "^4.0.0", - "pug-error": "^2.0.0" - } - }, - "node_modules/pug-linker": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-4.0.0.tgz", - "integrity": "sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==", - "dependencies": { - "pug-error": "^2.0.0", - "pug-walk": "^2.0.0" - } - }, - "node_modules/pug-load": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-3.0.0.tgz", - "integrity": "sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==", - "dependencies": { - "object-assign": "^4.1.1", - "pug-walk": "^2.0.0" - } - }, - "node_modules/pug-parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-6.0.0.tgz", - "integrity": "sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==", - "dependencies": { - "pug-error": "^2.0.0", - "token-stream": "1.0.0" - } - }, - "node_modules/pug-runtime": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-3.0.1.tgz", - "integrity": "sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg==" - }, - "node_modules/pug-strip-comments": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz", - "integrity": "sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==", - "dependencies": { - "pug-error": "^2.0.0" - } - }, - "node_modules/pug-walk": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-2.0.0.tgz", - "integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==" - }, "node_modules/rechoir": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", @@ -1139,14 +439,6 @@ "node": ">= 0.10" } }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -1171,22 +463,6 @@ "semver": "bin/semver.js" } }, - "node_modules/set-function-length": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", - "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", - "dependencies": { - "define-data-property": "^1.1.2", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/shelljs": { "version": "0.8.5", "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", @@ -1218,38 +494,6 @@ "node": ">=6" } }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/strip-outer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", @@ -1261,17 +505,6 @@ "node": ">=0.10.0" } }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -1283,19 +516,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "engines": { - "node": ">=4" - } - }, - "node_modules/token-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-1.0.0.tgz", - "integrity": "sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==" - }, "node_modules/trim-repeated": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", @@ -1307,18 +527,6 @@ "node": ">=0.10.0" } }, - "node_modules/uglify-js": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -1327,94 +535,10 @@ "node": ">= 4.0.0" } }, - "node_modules/unxhr": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/unxhr/-/unxhr-1.2.0.tgz", - "integrity": "sha512-6cGpm8NFXPD9QbSNx0cD2giy7teZ6xOkCUH3U89WKVkL9N9rBrWjlCwhR94Re18ZlAop4MOc3WU1M3Hv/bgpIw==", - "engines": { - "node": ">=8.11" - } - }, - "node_modules/void-elements": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", - "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/with": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/with/-/with-7.0.2.tgz", - "integrity": "sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==", - "dependencies": { - "@babel/parser": "^7.9.6", - "@babel/types": "^7.9.6", - "assert-never": "^1.2.1", - "babel-walk": "3.0.0-canary-5" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs": { - "version": "17.3.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz", - "integrity": "sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "engines": { - "node": ">=12" - } } } } diff --git a/docs/package.json b/docs/package.json index 0e3c88cf..4a13c872 100644 --- a/docs/package.json +++ b/docs/package.json @@ -8,7 +8,6 @@ "deploy": "gh-pages -d build" }, "dependencies": { - "asciidoctor": "^3.0.3", "gh-pages": "^3.2.3", "shx": "^0.3.3" } diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index cfbc632f..00000000 --- a/package-lock.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "arquisoft_wib_2b", - "lockfileVersion": 3, - "requires": true, - "packages": {} -} diff --git a/package.json b/package.json deleted file mode 100644 index 0967ef42..00000000 --- a/package.json +++ /dev/null @@ -1 +0,0 @@ -{} From 7039be4b3afdcada59534ac80692b954280f05cd Mon Sep 17 00:00:00 2001 From: Dario Date: Sun, 18 Feb 2024 11:21:03 +0100 Subject: [PATCH 44/55] chore: removed comments --- docs/src/03_system_scope_and_context.adoc | 55 ----------------------- 1 file changed, 55 deletions(-) diff --git a/docs/src/03_system_scope_and_context.adoc b/docs/src/03_system_scope_and_context.adoc index 88042e96..4ba4c3ec 100644 --- a/docs/src/03_system_scope_and_context.adoc +++ b/docs/src/03_system_scope_and_context.adoc @@ -1,48 +1,7 @@ ifndef::imagesdir[:imagesdir: ../images] [[section-system-scope-and-context]] == System Scope and Context -[role="arc42help"] -**** -.Contents -System scope and context - as the name suggests - delimits your system (i.e. your scope) from all its communication partners -(neighboring systems and users, i.e. the context of your system). It thereby specifies the external interfaces. - -If necessary, differentiate the business context (domain specific inputs and outputs) from the technical context (channels, protocols, hardware). - -.Motivation -The domain interfaces and technical interfaces to communication partners are among your system's most critical aspects. Make sure that you completely understand them. - -.Form -Various options: - -* Context diagrams -* Lists of communication partners and their interfaces. - - -.Further Information - -See https://docs.arc42.org/section-3/[Context and Scope] in the arc42 documentation. - -**** === Business Context - -[role="arc42help"] -**** -.Contents -Specification of *all* communication partners (users, IT-systems, ...) with explanations of domain specific inputs and outputs or interfaces. -Optionally you can add domain specific formats or communication protocols. - -.Motivation -All stakeholders should understand which data are exchanged with the environment of the system. - -.Form -All kinds of diagrams that show the system as a black box and specify the domain interfaces to communication partners. - -Alternatively (or additionally) you can use a table. -The title of the table is the name of your system, the three columns contain the name of the communication partner, the inputs, and the outputs. - -**** - **** image::BusinessContext.png[align="center",title="Business Context",link="BusinessContext.png] @@ -50,20 +9,6 @@ image::BusinessContext.png[align="center",title="Business Context",link="Busines The WIQ application will communicate with the WikiData API through REST HTTP calls using SPARQL for the queries. It will ask the API for information that will later be used for generating the questions that will be shown to the player. This information will come in the form of text, images or audio. === Technical Context -[role="arc42help"] -**** -.Contents -Technical interfaces (channels and transmission media) linking your system to its environment. In addition a mapping of domain specific input/output to the channels, i.e. an explanation which I/O uses which channel. - -.Motivation -Many stakeholders make architectural decision based on the technical interfaces between the system and its context. Especially infrastructure or hardware designers decide these technical interfaces. - -.Form -E.g. UML deployment diagram describing channels to neighboring systems, -together with a mapping table showing the relationships between channels and input/output. - -**** - image::TechnicalContextDiagram.png[align="center",title="Technical Context",link="TechnicalContextDiagram.png] The WIQ application will be deployed together in the same server. The WIQ client will be deployed on a nginx web server. This client will communicate with the API through HTTPS REST calls and exchange information through JSON objects. The WIQ REST API will be run as a .jar file on the server and connect to a Database run on a postgresql docker container. The connection layer between the SpringBoot API and the database will be JPA. From 44b19baeb5137f8d2027bbbb9e5bb42a36e65134 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gonzalo=20Su=C3=A1rez=20Losada?= <113936619+uo283928@users.noreply.github.com> Date: Sun, 18 Feb 2024 12:37:43 +0100 Subject: [PATCH 45/55] chore: Update 06_runtime_view.adoc --- docs/src/06_runtime_view.adoc | 111 ++++++++++++++++++++++------------ 1 file changed, 71 insertions(+), 40 deletions(-) diff --git a/docs/src/06_runtime_view.adoc b/docs/src/06_runtime_view.adoc index e10f375b..44dc3513 100644 --- a/docs/src/06_runtime_view.adoc +++ b/docs/src/06_runtime_view.adoc @@ -2,64 +2,95 @@ ifndef::imagesdir[:imagesdir: ../images] [[section-runtime-view]] == Runtime View +Here we can see what the main workflow of main parts of the project. +=== General Game's life cycle +* This diagram shows how should the application behave for an expected normal case scenario. -[role="arc42help"] -**** -.Contents -The runtime view describes concrete behavior and interactions of the system’s building blocks in form of scenarios from the following areas: +[plantuml,"Game's life cycle diagram",png] +---- +@startuml Game's life cycle + +actor Client + +skinparam Style strictuml +skinparam SequenceMessageAlignment center -* important use cases or features: how do building blocks execute them? -* interactions at critical external interfaces: how do building blocks cooperate with users and neighboring systems? -* operation and administration: launch, start-up, stop -* error and exception scenarios +Client --> API : start game +loop One question + API --> QuestionRetriever : ask for question + QuestionRetriever --> QuestionDB : querying question -Remark: The main criterion for the choice of possible scenarios (sequences, workflows) is their *architectural relevance*. It is *not* important to describe a large number of scenarios. You should rather document a representative selection. + QuestionDB --> QuestionRetriever : return first question and all answers + QuestionRetriever --> API : return first question and all answers -.Motivation -You should understand how (instances of) building blocks of your system perform their job and communicate at runtime. -You will mainly capture scenarios in your documentation to communicate your architecture to stakeholders that are less willing or able to read and understand the static models (building block view, deployment view). + API --> Client : return first question and all answers + Client -> API : send chosen answer + API --> API : check answer is correct + API --> Client : inform user guessed right +end loop One question -.Form -There are many notations for describing scenarios, e.g. -* numbered list of steps (in natural language) -* activity diagrams or flow charts -* sequence diagrams -* BPMN or EPCs (event process chains) -* state machines -* ... +API --> Client : inform user guessed right last question +API --> API : update ranking +API --> Client : show ranking +@enduml +---- + +=== Sign Up +[plantuml,"Sign up diagram",png] +---- +@startuml sign up -.Further Information +actor Client -See https://docs.arc42.org/section-6/[Runtime View] in the arc42 documentation. +skinparam Style strictuml +skinparam SequenceMessageAlignment center -**** +Client --> API : enters credentials +API --> BD : check credentials unused +API --> BD : register user +BD --> Client : return user token -=== +@enduml +---- +=== Login +[plantuml,"Login diagram",png] +---- +@startuml login -* __ -* __ +actor Client +skinparam Style strictuml +skinparam SequenceMessageAlignment center -It is possible to use a sequence diagram: +Client --> API : enters credentials +API --> BD : check credentials correct +BD --> API : return user token +API --> BD : save SWT +API --> Client : return user token -[plantuml,"Sequence diagram",png] +@enduml ---- -actor Alice -actor Bob -database Pod as "Bob's Pod" -Alice -> Bob: Authentication Request -Bob --> Alice: Authentication Response -Alice --> Pod: Store route -Alice -> Bob: Another authentication Request -Alice <-- Bob: another authentication Response + +=== Question Generation +[plantuml,"Question generation diagram",png] ---- +@startuml question generator +skinparam Style strictuml +skinparam SequenceMessageAlignment center -=== +QuestionGenerator --> WikiDataQS : querying correct answer +QuestionGenerator <-- WikiDataQS : return correct answer -=== ... +QuestionGenerator --> WikiDataQS : querying wrong answers +QuestionGenerator <-- WikiDataQS : return wrong answers + +QuestionGenerator --> QuestionDB : store question +QuestionGenerator --> QuestionDB : store correct answer +QuestionGenerator --> QuestionDB : store wrong answers + +@enduml +---- -=== From 19f8f611c3495db7443efc6551626a3aeabba24b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gonzalo=20Su=C3=A1rez=20Losada?= <113936619+uo283928@users.noreply.github.com> Date: Sun, 18 Feb 2024 12:38:10 +0100 Subject: [PATCH 46/55] chore: Update 08_concepts.adoc --- docs/src/08_concepts.adoc | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/docs/src/08_concepts.adoc b/docs/src/08_concepts.adoc index 0f179bcc..c3425cea 100644 --- a/docs/src/08_concepts.adoc +++ b/docs/src/08_concepts.adoc @@ -56,3 +56,16 @@ We decided to use a React based frontend with BootSpring for the backend, which .User Experience As this is a game, the focus must be in user experience so players can have an enjoyable experience, for achieving this, the response time should be as low as possible and the interfaces should be intuitive and beautiful. + +.Safety and Security concepts: +Authentication is done in SpringBoot3. Passwords must be hashed both in client and in API to ensure as much security as possible. + +.Robustness: +It is desired to make the application as independant as possible from Wikidata. This way, if it is down our application can still manage to be available for our users. +In order to archieve this, we will implement two modules regarding questions, one for retrieving it from Wikidata and storing it in our own DB and another for getting questions from it. + +.Development concepts: +Our code will be deployed within an Azure's Virtual Machine using continuous integration. + +.Under-the-hood: +Regarding Data persistence, our project has two DB, one for storing questions as stated before while the other one will be in charge of storing any other meaningful data for the game such us users or game's histories. From 741c60b7d71cc8d7d9b6dd1653900dcdced4237d Mon Sep 17 00:00:00 2001 From: Diego Villanueva <98838739+UO283615@users.noreply.github.com> Date: Sun, 18 Feb 2024 12:40:55 +0100 Subject: [PATCH 47/55] chore: Updated the UML diagram --- docs/src/08_concepts.adoc | 54 +++++++++++++++++++++++++++------------ 1 file changed, 38 insertions(+), 16 deletions(-) diff --git a/docs/src/08_concepts.adoc b/docs/src/08_concepts.adoc index c3425cea..fe664376 100644 --- a/docs/src/08_concepts.adoc +++ b/docs/src/08_concepts.adoc @@ -13,42 +13,64 @@ These diagram is just a sketch, it should be replaced by a more accurate version enum Category { HISTORY GEOGRAPHY - MATHS + SCIENCE +} + +enum Type { + TEXT + IMAGE + AUDIO } class Question{ - id: int + id: long content: String + answers: List + correct: Answer category: Category language: String + Type: Type } class User{ - id: int - name: String - email: String - password: String - answered: List + answeredQuestions: int +} + +class UserStat{ +} + +class Answer { + text: String + category: Category + Type: Type } -class Score{ +class Game { user: User - rightRate: float - timeAvg: float - answeredQuestions: int + questions: List +} + + +class Ranking << Singleton >> { + } -User o--> Question -User --> Score +User o--> Question +User "1" --> "1" UserStat +Game o--> Question +Game "n" --> "n" User +Question "n" --> "n" Answer +Ranking "1" --> "n" User @enduml ---- |=== | Class | Explanation -| Question | The model of the questions -| User | The people using the application -| Score | A class that keeps tracks of each user scores +| Question | The model of the questions, has a type to specify if it is text, image or audio. Stores both right and wrong answers +| User | The people using the application, they have statistics and take part in a ranking to compete +| Answer | Models each possible answer, created to reuse answers that are common to different questions, as well as distractors +| Game | It is created when the user starts a game and destroyed just when it ends. |=== .Architecture and design patterns From b1d457b6190574f22b96a5c1ae334ad7a23452ae Mon Sep 17 00:00:00 2001 From: UO288090 Date: Mon, 19 Feb 2024 12:31:01 +0100 Subject: [PATCH 48/55] chore: Documentation cleaned --- docs/src/05_building_block_view.adoc | 159 --------------------------- 1 file changed, 159 deletions(-) diff --git a/docs/src/05_building_block_view.adoc b/docs/src/05_building_block_view.adoc index bfa2fe6a..9060e76c 100644 --- a/docs/src/05_building_block_view.adoc +++ b/docs/src/05_building_block_view.adoc @@ -6,44 +6,6 @@ ifndef::imagesdir[:imagesdir: ../images] == Building Block View -//// -[role="arc42help"] -**** -.Content -The building block view shows the static decomposition of the system into building blocks (modules, components, subsystems, classes, interfaces, packages, libraries, frameworks, layers, partitions, tiers, functions, macros, operations, data structures, ...) as well as their dependencies (relationships, associations, ...) - -This view is mandatory for every architecture documentation. -In analogy to a house this is the _floor plan_. - -.Motivation -Maintain an overview of your source code by making its structure understandable through -abstraction. - -This allows you to communicate with your stakeholder on an abstract level without disclosing implementation details. - -.Form -The building block view is a hierarchical collection of black boxes and white boxes -(see figure below) and their descriptions. - -image::05_building_blocks-EN.png["Hierarchy of building blocks"] - -*Level 1* is the white box description of the overall system together with black -box descriptions of all contained building blocks. - -*Level 2* zooms into some building blocks of level 1. -Thus it contains the white box description of selected building blocks of level 1, together with black box descriptions of their internal building blocks. - -*Level 3* zooms into selected building blocks of level 2, and so on. - - -.Further Information - -See https://docs.arc42.org/section-5/[Building Block View] in the arc42 documentation. - -**** -//// - - === Whitebox Overall System [role="arc42help"] @@ -71,78 +33,6 @@ Important Interfaces:: This part will be more detailed later, since the structure of the different interfaces/classes has not been discussed by the team yet. -//// -[role="arc42help"] -**** -Insert your explanations of black boxes from level 1: - -If you use tabular form you will only describe your black boxes with name and -responsibility according to the following schema: - -[cols="1,2" options="header"] -|=== -| **Name** | **Responsibility** -| __ | __ -| __ | __ -|=== - - - -If you use a list of black box descriptions then you fill in a separate black box template for every important building block . -Its headline is the name of the black box. -**** - - -==== - -[role="arc42help"] -**** -Here you describe -according the the following black box template: - -* Purpose/Responsibility -* Interface(s), when they are not extracted as separate paragraphs. This interfaces may include qualities and performance characteristics. -* (Optional) Quality-/Performance characteristics of the black box, e.g.availability, run time behavior, .... -* (Optional) directory/file location -* (Optional) Fulfilled requirements (if you need traceability to requirements). -* (Optional) Open issues/problems/risks - -**** - -__ - -__ - -_<(Optional) Quality/Performance Characteristics>_ - -_<(Optional) Directory/File Location>_ - -_<(Optional) Fulfilled Requirements>_ - -_<(optional) Open Issues/Problems/Risks>_ - - - - -==== - -__ - -==== - -__ - - -==== - -... - -==== - -//// - - - === Level 2 [role="arc42help"] @@ -174,52 +64,3 @@ Contained Building Blocks:: Important Interfaces:: This part will be more detailed later, since the structure of the different interfaces/classes has not been discussed by the team yet. - -//// -==== White Box __ - - -__ - -... - -==== White Box __ - - -__ - - - -=== Level 3 - -[role="arc42help"] -**** -Here you can specify the inner structure of (some) building blocks from level 2 as white boxes. - -When you need more detailed levels of your architecture please copy this -part of arc42 for additional levels. -**** - - -==== White Box <_building block x.1_> - -[role="arc42help"] -**** -Specifies the internal structure of _building block x.1_. -**** - - -__ - - -==== White Box <_building block x.2_> - -__ - - - -==== White Box <_building block y.1_> - -__ -//// - From e64b769aa23a35244c786f82b1e87f78eceb8920 Mon Sep 17 00:00:00 2001 From: UO288090 Date: Mon, 19 Feb 2024 12:36:15 +0100 Subject: [PATCH 49/55] chore: Resolving for the PR --- docs/src/05_building_block_view.adoc | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/docs/src/05_building_block_view.adoc b/docs/src/05_building_block_view.adoc index 9060e76c..a58bcc73 100644 --- a/docs/src/05_building_block_view.adoc +++ b/docs/src/05_building_block_view.adoc @@ -23,7 +23,7 @@ This will be the general sketch of the elements interacting inside the applicati Contained Building Blocks:: **** -* **Player:** This is the user that will be playing with our application. They will need tl be authenticated to be able to play. +* **Player:** This is the user that will be playing with our application. They will need to be authenticated to be able to play. * **WIQ Application:** This is the main application that will reproduce how the game will work. This part will be more detailed in the following parts. * **WikiData API:** This is an external API, which will provide us with the information to produce the questions. @@ -40,7 +40,7 @@ This part will be more detailed later, since the structure of the different inte Here is an specification of the inner structure of the WIQ Application. **** -==== White Box __ +==== White Box _WIQ Application_ image::ContainerDiagram.png["Container for the WIQ System"] @@ -49,8 +49,6 @@ image::ContainerDiagram.png["Container for the WIQ System"] This diagram describes the internal organization of the WIQ Application. **** -//__ - Motivation:: An inner view on the WIQ Application and its components inside. How the WIQ application will be structured inside and its main components. From ad212de6b5dda459b245309677b76d250ba61c71 Mon Sep 17 00:00:00 2001 From: Diego Villanueva <98838739+UO283615@users.noreply.github.com> Date: Mon, 19 Feb 2024 22:08:31 +0100 Subject: [PATCH 50/55] Chore: Deleted a file to solve the PR issue --- docs/images/BusinessContext.png | Bin 26099 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 docs/images/BusinessContext.png diff --git a/docs/images/BusinessContext.png b/docs/images/BusinessContext.png deleted file mode 100644 index 62cf2d8c6e70fde89805edfe99b66a912224aed3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26099 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 d!{-e1HSYso8gLnc|GsibNlyJ Date: Mon, 19 Feb 2024 22:27:31 +0100 Subject: [PATCH 51/55] Chore: Fixed the second section being seen as help --- docs/src/02_architecture_constraints.adoc | 3 --- 1 file changed, 3 deletions(-) diff --git a/docs/src/02_architecture_constraints.adoc b/docs/src/02_architecture_constraints.adoc index 1269b079..5f3b510a 100644 --- a/docs/src/02_architecture_constraints.adoc +++ b/docs/src/02_architecture_constraints.adoc @@ -3,9 +3,6 @@ ifndef::imagesdir[:imagesdir: ../images] [[section-architecture-constraints]] == Architecture Constraints - -[role="arc42help"] -**** The application must be developed according to some constraints that were defined by the professors. These constraints are meant to be the cornerstones of our project as they are mandatory and provide a baseline to work on. The following tables will define the constraints. From c17acef1e7123ba651a98a24412b14be62d1f0f3 Mon Sep 17 00:00:00 2001 From: Diego Villanueva <98838739+UO283615@users.noreply.github.com> Date: Mon, 19 Feb 2024 22:31:45 +0100 Subject: [PATCH 52/55] Chore: Tried to fix the problem in the diagram rendering --- docs/src/08_concepts.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/08_concepts.adoc b/docs/src/08_concepts.adoc index fe664376..b14a2f16 100644 --- a/docs/src/08_concepts.adoc +++ b/docs/src/08_concepts.adoc @@ -4,7 +4,7 @@ ifndef::imagesdir[:imagesdir: ../images] == Cross-cutting Concepts .Domain Model -These diagram is just a sketch, it should be replaced by a more accurate version upon discussion. +This is the first version of the diagram, it will be updated if needed. [plantuml,"ConceptsDomainModel1",png] ---- From 1c112b4577a30b8383228e2f81400ecf78af1761 Mon Sep 17 00:00:00 2001 From: Diego Villanueva <98838739+UO283615@users.noreply.github.com> Date: Mon, 19 Feb 2024 22:32:25 +0100 Subject: [PATCH 53/55] Chore: Simplified the diagram according to the error message --- docs/src/08_concepts.adoc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/src/08_concepts.adoc b/docs/src/08_concepts.adoc index b14a2f16..93c16a5d 100644 --- a/docs/src/08_concepts.adoc +++ b/docs/src/08_concepts.adoc @@ -51,16 +51,16 @@ class Game { } -class Ranking << Singleton >> { +class Ranking { } User o--> Question -User "1" --> "1" UserStat +User --> UserStat Game o--> Question -Game "n" --> "n" User -Question "n" --> "n" Answer -Ranking "1" --> "n" User +Game --> User +Question --> Answer +Ranking --> User @enduml ---- From 00c0c09cb9cae548053e775254281c19fca61a28 Mon Sep 17 00:00:00 2001 From: Diego Villanueva <98838739+UO283615@users.noreply.github.com> Date: Mon, 19 Feb 2024 22:37:27 +0100 Subject: [PATCH 54/55] Chore: Added the full diagram again --- docs/src/08_concepts.adoc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/src/08_concepts.adoc b/docs/src/08_concepts.adoc index 93c16a5d..b14a2f16 100644 --- a/docs/src/08_concepts.adoc +++ b/docs/src/08_concepts.adoc @@ -51,16 +51,16 @@ class Game { } -class Ranking { +class Ranking << Singleton >> { } User o--> Question -User --> UserStat +User "1" --> "1" UserStat Game o--> Question -Game --> User -Question --> Answer -Ranking --> User +Game "n" --> "n" User +Question "n" --> "n" Answer +Ranking "1" --> "n" User @enduml ---- From a0a77748ea9193d3e054e130f6e49c16c082d8b7 Mon Sep 17 00:00:00 2001 From: jjgancfer Date: Mon, 19 Feb 2024 23:10:26 +0100 Subject: [PATCH 55/55] hotfix: sidebar warning when building docs fixed --- docs/src/02_architecture_constraints.adoc | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/src/02_architecture_constraints.adoc b/docs/src/02_architecture_constraints.adoc index 5f3b510a..6d48d584 100644 --- a/docs/src/02_architecture_constraints.adoc +++ b/docs/src/02_architecture_constraints.adoc @@ -28,5 +28,3 @@ The application must be developed according to some constraints that were define | Documentation in Arc42 | The documentation must follow the Arc42 template |=== - -****