From bc2ca5424950e8ac83a75e6a91d0c51876cdefe8 Mon Sep 17 00:00:00 2001 From: UO288443 Date: Tue, 27 Feb 2024 09:58:46 +0100 Subject: [PATCH 001/127] UML 07 --- docs/images/DeplymentView.svg | 4 ++++ docs/src/07_deployment_view.adoc | 21 +++------------------ 2 files changed, 7 insertions(+), 18 deletions(-) create mode 100644 docs/images/DeplymentView.svg diff --git a/docs/images/DeplymentView.svg b/docs/images/DeplymentView.svg new file mode 100644 index 00000000..3b3d9207 --- /dev/null +++ b/docs/images/DeplymentView.svg @@ -0,0 +1,4 @@ + + + +
User (player)
User...
MongoDB
MongoDB
Singin/Loging Form
Singin/Loging Form
Wikidata
Wikidata
User Service
User Service
Question generator
Question generator
Web app
Web app
User Interface
User Interface
Use
Use
Use
Use
1
1
1
1
1
1
KEY
KEY
componentName
componentName
Component:
Component:
apiName
apiName
Api:
Api:
appName
appName
Aplication:
Aplication:
Use
Use
A
A
B
B
A use b
A use b
1
1
Composition
Composition
Association
Association
Text is not SVG - cannot display
\ No newline at end of file diff --git a/docs/src/07_deployment_view.adoc b/docs/src/07_deployment_view.adoc index b5c01034..0f305d1e 100644 --- a/docs/src/07_deployment_view.adoc +++ b/docs/src/07_deployment_view.adoc @@ -45,29 +45,14 @@ See https://docs.arc42.org/section-7/[Deployment View] in the arc42 documentatio === Infrastructure Level 1 [role="arc42help"] -**** -Describe (usually in a combination of diagrams, tables, and text): - -* distribution of a system to multiple locations, environments, computers, processors, .., as well as physical connections between them -* important justifications or motivations for this deployment structure -* quality and/or performance features of this infrastructure -* mapping of software artifacts to elements of this infrastructure -For multiple environments or alternative deployments please copy and adapt this section of arc42 for all relevant environments. -**** -_****_ +_**Deployment diagram**_ +image::DeploymentView.svg["Deployment View"] Motivation:: -__ - -Quality and/or Performance Features:: - -__ - -Mapping of Building Blocks to Infrastructure:: -__ +This diagram shows us the process the application goes through when it is deployed. === Infrastructure Level 2 From b5c0335d711736433edc8d12b576f8ad2c907213 Mon Sep 17 00:00:00 2001 From: UO288443 Date: Tue, 27 Feb 2024 10:03:02 +0100 Subject: [PATCH 002/127] 2 --- docs/src/07_deployment_view.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/07_deployment_view.adoc b/docs/src/07_deployment_view.adoc index 0f305d1e..92507d3c 100644 --- a/docs/src/07_deployment_view.adoc +++ b/docs/src/07_deployment_view.adoc @@ -48,7 +48,7 @@ See https://docs.arc42.org/section-7/[Deployment View] in the arc42 documentatio _**Deployment diagram**_ -image::DeploymentView.svg["Deployment View"] +image::DeploymentView.svg[Deployment View] Motivation:: From ab3cb34d81347a6b65a069aab4ce16db021a70d2 Mon Sep 17 00:00:00 2001 From: UO288443 Date: Tue, 27 Feb 2024 10:05:40 +0100 Subject: [PATCH 003/127] UML 7 (creo que bien) --- .../{DeplymentView.svg => DeploymentView.svg} | 0 docs/src/07_deployment_view.adoc | 49 +------------------ 2 files changed, 1 insertion(+), 48 deletions(-) rename docs/images/{DeplymentView.svg => DeploymentView.svg} (100%) diff --git a/docs/images/DeplymentView.svg b/docs/images/DeploymentView.svg similarity index 100% rename from docs/images/DeplymentView.svg rename to docs/images/DeploymentView.svg diff --git a/docs/src/07_deployment_view.adoc b/docs/src/07_deployment_view.adoc index 92507d3c..b28e28f4 100644 --- a/docs/src/07_deployment_view.adoc +++ b/docs/src/07_deployment_view.adoc @@ -3,51 +3,11 @@ ifndef::imagesdir[:imagesdir: ../images] [[section-deployment-view]] -== Deployment View +== Deplyment View -[role="arc42help"] -**** -.Content -The deployment view describes: - - 1. technical infrastructure used to execute your system, with infrastructure elements like geographical locations, environments, computers, processors, channels and net topologies as well as other infrastructure elements and - -2. mapping of (software) building blocks to that infrastructure elements. - -Often systems are executed in different environments, e.g. development environment, test environment, production environment. In such cases you should document all relevant environments. - -Especially document a deployment view if your software is executed as distributed system with more than one computer, processor, server or container or when you design and construct your own hardware processors and chips. - -From a software perspective it is sufficient to capture only those elements of an infrastructure that are needed to show a deployment of your building blocks. Hardware architects can go beyond that and describe an infrastructure to any level of detail they need to capture. - -.Motivation -Software does not run without hardware. -This underlying infrastructure can and will influence a system and/or some -cross-cutting concepts. Therefore, there is a need to know the infrastructure. - -.Form - -Maybe a highest level deployment diagram is already contained in section 3.2. as -technical context with your own infrastructure as ONE black box. In this section one can -zoom into this black box using additional deployment diagrams: - -* UML offers deployment diagrams to express that view. Use it, probably with nested diagrams, -when your infrastructure is more complex. -* When your (hardware) stakeholders prefer other kinds of diagrams rather than a deployment diagram, let them use any kind that is able to show nodes and channels of the infrastructure. - - -.Further Information - -See https://docs.arc42.org/section-7/[Deployment View] in the arc42 documentation. - -**** === Infrastructure Level 1 -[role="arc42help"] - - -_**Deployment diagram**_ image::DeploymentView.svg[Deployment View] Motivation:: @@ -57,13 +17,6 @@ This diagram shows us the process the application goes through when it is deploy === Infrastructure Level 2 -[role="arc42help"] -**** -Here you can include the internal structure of (some) infrastructure elements from level 1. - -Please copy the structure from level 1 for each selected element. -**** - ==== APP "App": It is the part with which the user interacts. This part would be responsible for providing the visual interface and using the rest of the created classes. From 08dc5b324c67fa7ab20b7fc183b999bd4d9a4b5a Mon Sep 17 00:00:00 2001 From: UO288443 Date: Tue, 27 Feb 2024 10:08:48 +0100 Subject: [PATCH 004/127] . --- debug.log | 1 + 1 file changed, 1 insertion(+) diff --git a/debug.log b/debug.log index 77d60f2b..c22dcbec 100644 --- a/debug.log +++ b/debug.log @@ -1 +1,2 @@ [0220/104149.273:ERROR:registration_protocol_win.cc(107)] CreateFile: El sistema no puede encontrar el archivo especificado. (0x2) +[0227/100625.318:ERROR:registration_protocol_win.cc(107)] CreateFile: El sistema no puede encontrar el archivo especificado. (0x2) From 2e0c16b6379b96f3f0cb4333adba0765238f38c5 Mon Sep 17 00:00:00 2001 From: rodrox11 Date: Tue, 5 Mar 2024 13:34:15 +0100 Subject: [PATCH 005/127] =?UTF-8?q?Modidicar=20punto=204=20de=20documentac?= =?UTF-8?q?i=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/src/04_solution_strategy.adoc | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/src/04_solution_strategy.adoc b/docs/src/04_solution_strategy.adoc index 32fe86f8..7b0744a8 100644 --- a/docs/src/04_solution_strategy.adoc +++ b/docs/src/04_solution_strategy.adoc @@ -10,7 +10,6 @@ A ranking with the maximum score of the user and can be compared with other user * MongoDB: MongoDB is an open-source NoSQL database that uses a document-based data model for information storage and retrieval. * React JS: It's a framework created by Facebook that's widely used to create user interface components. Chosen for the large volume of documentation and the fact that it is the framework used during the previous courses. -* WikiData: It's a free knowledge base modified by humans as well as machines, and it's where we'll get our questions from. * Microsoft Azure: A cloud computing platform that provides infrastructure, platform, and software-as-a-service services to host, manage, and scale online applications and services. === Design From 32b62366c8b9647c98060d6c7670635fbebfc0ea Mon Sep 17 00:00:00 2001 From: rodrox11 Date: Mon, 11 Mar 2024 20:03:02 +0100 Subject: [PATCH 006/127] Corregir doc 6 --- docs/images/6.1.png | Bin 0 -> 25569 bytes docs/images/6.2.png | Bin 0 -> 16844 bytes docs/src/06_runtime_view.adoc | 8 ++++---- 3 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 docs/images/6.1.png create mode 100644 docs/images/6.2.png diff --git a/docs/images/6.1.png b/docs/images/6.1.png new file mode 100644 index 0000000000000000000000000000000000000000..3ce968fe3201040e4041a3a658fb4a84c30778f5 GIT binary patch literal 25569 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 LtDnm{r-UW|EDr*F literal 0 HcmV?d00001 diff --git a/docs/images/6.2.png b/docs/images/6.2.png new file mode 100644 index 0000000000000000000000000000000000000000..fe2743930dfacb2456dea86609468b86d1fbd456 GIT binary patch literal 16844 zcmcJ%1yoh*+bzBUX+c2&6$z!JB}C~^K)N@uX#|8#x0HYiNOvRMutDigX^?IZX+c0j zy8iD5J;(3&efQpR$GHD9hU08uueILw#(d_S&-3UjFDs6Ra|Z_kf#69zf2Ih5pag?I zfmo>ECq@t9)!=^&cA{!_FD$K`%nXg}AmWA=hBkV3h6a@SPL#%Wc2>4LtgKdMdKPx} z=4LD}EX^IhbW(s@NSP?B+5P!B1O?pZRf3khjAhfqtF_CjYP^jp#!sZH8dF;j*MBkn)HP{ip-^RyVq+G+>jU(0v>0#EZ+G9uuWEHaWS%8(eN5XG zp}`i-#9{KOIln@ARe;TvmorPl-skB}NuOj!G_M(32bTfyR{0QfhQl@iVU>5`@9k-b zEW?RPjG0W(uf3f;wc@;G*lsg5nai3HjANtqSoz+=;W3ih{au`V2imre33!G|$A$^pan|rEqt$ zewTN-d@s6mk2`U=6$5OFOAL|RhhM|gFx6Q7vrg&_yW3Hcq$EoxQI@ZlYuL+e zx!UKv4p+crZQ^=)c{MgR`ue(u;06YHohY#mMVGj!fGPCQi4ow>v7C`#4<68BTu5?G zsY{>ELq*;+v#w5nnwpy4q)b!Cj&%rkSCn7!tvm)C9a7N~N+o`BauUVlq{G5eMY8I3 zbhKZ8&WtB=8w~dw7o%zcHM-LeM2n4ef2}<0kSY`!#ffEzeB9*1!a~TKn(fXXzkf%v z`{2)II<8yj^zGqtwCydT`y#dSIzwrHu3DR}j=q`h`13k`61F1i&|eoxBT&)aK5?D# zb4D(w=DVC>+uojqO)ZBJT=3@KaHJ7j=0_)s(KV>?wcq%kM;fX?QVx3KQ zOht0CZaoIMvvK=7Z0zEf^=A9!PnWw7rCd)qQfKhjw}zB%jOLH4X}W5!5rZkSBCCee zM1<4jm09%2NvMZ~Y_2t5yQXxg8j@UjyB`@>l#ixIEeheD&?{|^AX$b=;`0p9^oag$Xi5T z$jW3wIom>y7onY9c_b{F53qAeKj{kloqU+pe1Ku1)*ulOB5vIurWBq-)I+-X+9^uZ zpIAZ!ZhlKI!u0mI5E<11c<#bY_@bsK?DqfhXC=wW4L_I3B+9#3N0Hm?_pXSXec1G1 zl)cE4N31=q!nngkLIRtNG59Stn*>pvh2t@xwB6oj#4DZ*LX0X>0vjL-CaR_=DG=VcpIpGddHtRR$e| zf`WpuoJWJ&JqxkmNDl;&%_hJW7u|My9*b619;c;=qoePJ#CQ1bIffHuM>Z=Y#ym0n z)_}QD^`qeA1l1{zMfA8GLlOiv3%DpX9bI@b-`?2ypj)BQwnSn_eTfv_lPqXcd{|_u zr>tCJzCl(?3yD$BQE|Py&}7-Vh{#dh&KH+3T*0I7gP0Vq*>1=9o}R*%HCsVb_43Kk z)wGk(zLKnkU)0sdo4rK^_ot+-!;dr&Um56S1I=_vMztmI)*Rf2e=S+jS@5X|mD^@omnJR9CaUe< z+PXn?{|Fn=D{xHl^{c@7LEF*kalPB|dWIbb6RbqqRj*L{o`c3BIy^(5Gnz@A{QC7* zOWoIEW7U5p`a4D_yXOsS(6o$);w@A}i4&DNpP!y*&TCcU4;*>>jd?_cC%ulVwq5qb zB!7RG$1bL(nmyVErllnlp4`_bABTr`_sM3Y>e*bAcFzUEKhJ6>J&bTjyS+TLx`8n@ zHC0nv?S8VwHKMGhCZ@#TypKM=GI&0eC6|35qHY>fg9}!AHO;j>WTs}bDbG-__hqjV z@n@Yth09@ih2l|P42zHg*Gr{9r{3#>kwHFuvWyvF|CuYlB4H3jq1V6q#kaP$8XL>^ z;pFTF#v)Ch1Gy;O{IwkcZAbfPL}oLuriLd zaFBboNdmigA;Nfcc6!;w=k)FDMNuSN)=EXG}X zxUsR(6fa?OgN$F&Smko4i=lW|G`rGF;r0ic5?eXbNeU*;vf$O*&@l0tbn09?Bj~Bb zgQ#!oJ5zi99fPf95udN^d@mHvlGUc6At}usR@EVzFpnh3j_iDpB;dwXYrhdVHSDqZ zHMf3v6%jV@D-=(&>xIMK%Q;f>)1w~PP-j7vgrx1luO=_tmX;P5QV^~~@2vRzfQ#lC z!w3h|1Yg%oeU+3if;j06@o1Q!C}NZp6>6vZ?#l*3!NgM zmXQ%lx5g28quUj3#}<-QY@Hm^zd16Ss`wBTOvXsyVya#`7hnr-scYQa9X&tZ zYMX3orVxFd-(Bxw?H ze)^N5)O>R9d%wQ*;#8$O9?oi`K;iF&N2RK6v1Sg=l1utA(&Mr=Mz_DtTV~YLn#k{h zyZW??gh#vP$^7Q55}^|uS~^i_OLtgfw-Q#;NG^Mu*B^{4nLaW&_~)RUAY(h_lnORq_*4#ZMj{LPxgu_E~RcM-Duoc(l4T+e{Iv{Q7W_U~eyq z+xg;TT&(LCs#B@^qTJ30vjimu1bMv)+~aIq^I6BDz#x*GG!mGq41Gs6XM`cBr5o%#9sfSi?C&YY>%9}RQ# z@=>*iYrUwp(1O4XpJR$( zaQ66*`q!tlvI*G+`3ocH$x!d+MTLR_aj<#jtPIe6 zDiYd^81QW+6-B5PzW1kvIs5om1K@UYcK%vr-(}RR)`7qkLR|GB5UXqs#k;Hjj?d4( zIpOTrpj>EZs8*F-im#%B!(JfiW3^gMkN2$gC+u8YWiI<0A9(Cn$39Wr9vT^$cm%ci zfhy0~toKe~1NqEb_k!nAX|i^AcQwk)V%c7ZjTUIN1(9_zETTSZ)7I7oyJn)?a>n-t z9kfuJ`BrSyhK-SI|sIGr3VEiDEHMv=HeMn(oTTOJg_ z4RY*Fw%|=X2DLfAhU1R zkpcVe(yxQ9`Cz_nEat6=Qd1HlBATy(wA|d|Gc!qUz5c`bnw4R29*4DCq@?kYku=(; z5&K_R++i8<1?V*gWsV}dDpfl?EnQdbe!VQK0PoEWEmd@>b#LIrmq=v0z z5H1(OlSc%BaNhWro}pZ57&|DVz_m#ap7uA94@J2SujCZNwhk$8{Ck}|Bkr3&_xN9Z z2KP?#F&82;Xq1e(AMg5RNF5QO%S#FLPw)VSI0#$qgM&L@VFoZDLX6Gd0Z)Wnz2J={ z9xxRZ6|j@Pbai!2PP#00$2OG_EG{mxv9USMxH*Dj6vd(?xhHt~E8OZH?^uQPi&w8I ze0EEo(Ti6@=)ZU&fhf?dR8&{z)@|@m)pqh454g*1)ASD8 z-rk=2!)e@?z-=4T^PYez@%7OPh`fn{?ytZ1rN}czD|Dhh zr24a2GJMSS5h*LfF>EhtYHF(Ne?&z@P`mCFmy~ew@Wi>%9&A+q9KhKcL1@S`lF0vk zWvyDd1)0V@RL{=N&QjA+?J7Ho35d{-1|hip$-!1rlL*fPdis@_`g4GR8N`T0x8pr8 zA0IkeTH>2GpHD(Q@?a=3RuKU#l3{Et(5jYA3#vza?4{nKz>mLxH`AHu=UgI7vwCU#f!VT)7PFE~N z(fh+-x|S1NWVfeq{v4|mDDB&HKUyU)uDOngD}U|Y13oj;(vLqiI_Q)L|C}^%qELG< z>$>n^-2cBGq70_X1EX|s?_}xeHr0{yJzw|6H|Wz<_Gxhdqc~6PAF(YhO+FB!kN19a zaj=a)j7`rsFY@XLwa6J7X2i$GADs&+iqFJE4*5m=`s(s?cXPAiXWjAM+BlU7x-3d5 zDo^sy53I>^%RtsEzz5#fu`%Wh0|l?4tZcWl)N_8)dk#)ORyxrW^r2j$dv*5)2L@2l z&{iy83ki8l`{2jM#?H>pBIC_KMpuRP{Fg+2)9~qmH6#UE@WJOJRVy>Qoi|fqP34rF ziAnzI+t{ZUYhe=;6M**(;si~}#&PBp6v%E;eJU&{DEkrRJX2y4-e=d#zyCh1%Jp!& z#AMLb%`J!i{{6Yl*=7eF|1jHiwi`r5L}_Ay`YxT!T2(^@Fl^Ve!(}oayO0sommaXv z`|ql&($nAJJFJZfM?QM=2yD2>xCt{5?zrt&Z;~misI;`U29fhmWF|xBWZ*5ke*?i> z$i1g(N}8HeV4yilVGtW$(-9^jmuidgoB=l9elQ3CP%8%u9pQ$ChFmYT{rNEBMY_wp z-CT33f!EMi#L3RCD2ixb8m&Kj)RA3+^5pFoc+0XLsk}HnZqw-@INpGQWMyRy-h2u- z2nJg?&SLE5h80aI12eN>R<+|#3&5$#5(M49_Vffo#qwWImYE9(2r%q9Om`AVJ`r%- zxJw40?A`dJ=xJ&D3wgg-T4MuuBtj*9_<%@-zGw}&&1Dv2nuPYia8P~|8|>Di>P$$2 zLg$-~$7Qf8WH-?GJ0LD9jVSf2g zWMGOYqO81!ePk+V`IXPo(lT_o_hZK>fS@ruN>?_iz>OtV6jeKTp4Mgm-h>%oPe9fz-F4HA;DuqoMCncM?hEv!Sr5{ z_#J83*_Y*|CGGmxAC|Cka&qeG>Il0Av*f}T_tqy@Vu-~7**7S^uO+qP4@kw}RC<1X zz>;BpB0ts(4fDx}pRPQw=X~i12?<%WYm7}RX6dgIxe%30w#~N%XK_>AAlaLeTq(_d zLL#f8Pn(@qQBhGzj8l_3If-SdR@96bPoZ0Fxpo zCkJm;R!t}^A+hqcmKPC!pNfiugTqV18XPS%Df8{kMobEXurVCgBc~Y1Mn^_)&ZzF+ALC%k7)@Q!l$t~EP1{z?65E!8z z>ttVFpLVUYUTy~J5RM12*mb7+4<0-KCV>)j_4nU*9IL=I%CelPJ3KthtjId}iyg$^ z#%b)X42oZ;k9&!Chw}jy)!QD#MN|XpgH@z^|4I(vZ5#b*;`;ij3zd-`C+AP{5P|FoU{4D&CD zp4$0Teq0$s;*SHLyqL*3cY z4?v#QUUfw=XUTp@eVdz`J2o~3)?xDIkRQuE?rNJwNq}Jn2I&r^ia4w+EEa%ADL*X| z)#{CVBvrv6Adt9Ps9ihpoiv8U5u1}OI;>I%z3MOR=a=E}oZCQApygqqS-2LUtNCDKLnb-ZSCO%#R zoD$yYGV}Q0;9#p^5Dn0!24`Vh+|3sez77sKv1Z2Aw{O1$Ec9srSnC_Sz)f)odwX=` z95>(BDHT)J=LKd?tJ-0Gs**!X7T>?_9cdxs)x*s0Tl#bF0s74ynU4`UD(spGyTpDI$307QKyOD&DSUo zaudG?fNRBH6H(HQ0JAO@$!VgW1>QPx?0s|EB6TTLSs4p)_0XT4tiUjw;}Q`@izuhY z05n!sR*n|xWK~MQ;kku{g+nEtmA1=4ce%F#10#N&z5i=vaKSTE%T5yplSD|uMKL(J zK^`Fw{Fj@Xx)P&_Xb&)w*jetSGh||9Of$Jztbp^=moD-7^XC<>w(gUK-w6xEgSX&b zzELxiW|f@@SO`uE0#%&H4q&c3e4?YH0bl;s_;$VE3Q%{lA*Ub~u@?LRr~XTDQW?sv zso|rg6JBpofO-}2jQ0=it1v%?qo6giSLIIsB&VmR zZ*Fb^J}5EiaZjNm)B4+u^e=Gq0BqpM=BsUOHeUk*{0chy`gpN89K~bS6Q+KbD;5VE zJ4N({gi0_uKcz}Tx)37Y_hD?+`Pp%EQ`1<~VhDpSJQ+$%EhtzIP>5O%Fg59{_YDmV zzkdA!#%({F3$5Rac?vYPKMJH1wFg1Wsx5sZFFBdA9^<50&X%XcgJ@)r!6a7-cGBX~#?;%-PbdxVLxF1eiy6kkL8e3cd@8xo^eJ1UG zL`Ec`Xu?j*R}6_G{jL5~1}l-EC5d8RI%gI>+){a`J zw6qjx^9>*kfJma1iBncpZDV3&U=RzuLo+@iQG^mfEEvtIlgMQrS6Il(d=CUCz$)iw zXN54#n#O&ov2e=e@PVZjN58top+q%dthtSro{^t>=j6kH%I2eVCq_ z^7Hc>TPZW2baizFxVu^Qshq6x8RG5{H(+M5NT?a+xSOkDVnWY5UF+fq*qeFLtC2#T zpUca1I&)iW!yr)Zi zb^qSI*|`?~GK|p9o*u*9{{DVzYippH!MXvYU4>`Ny#(@a!H*u@#X?06di zCp%jXaFOf1$--}ea!^nL*uv;CXXJTSvW)2(%z!WZ& z?M|EBB4=)nkf$IZXiU@t!Sa)+x|o>vw?_L7P*f}kvy~WxrS+6+8$^u=tn0|ba_9BZ(Wa)Rlhf1FJ6PD*jY|y> z58BjXm@h?HKi`i}ZRBabMA*>YME-kfQ{Q&lZ){$$AOMy$IsxyqU?qI-bghLF(RH;i zR*0(_hTW(9qrCo<*+}iKdnKa+I7Wy(L42}y@23{d~M?r*cH$ZL2NMC8Q8#I@yaJTE0rZo_Vrm&K5P03^L@ zCx$ZOx0gqK^cUmsR%$(A(wAAuBz9B;Ta|}Qkmh!bDghSx>v7Ph5oERPfQP7vgSM` zU|59H&>~41A6IOwRc=d`Rp(y*OP3s+v0Vtniug6W6mTuVWF*%z4B61Ebsnaz>RrLl zLMu~Y7tX5z{O4p(z79e1DGqMR! zwhot*UPd;#X{)PCU;^FmsQrrr9NzsY+g@vk!cqANyt&znsX4*jffa=*1y){CrRwF^2hJY5fsT(A7~Gy z0_S<-%^OrG6|vX9m}n<$n>{t9Y4r3lH}i-w`DbNa5bx{~Vq#uR=DeSq)2~`R+Wo;v zFC`-by!FyY0^NkP`XFnPsTB9U-x`F2mgXTzecCITEm;RD0ThCXnF`Vl3n~hb#v30TuW|o0{p_C@Ft(Qq| zV$u29wJ>9%2Mi3UG>OsCBsr6S;(0w%Ra7L@&^0nJ=rfU&lmr%KPIP;Fdv~{VCX|rl z-a}@AmcrDsGUzKJ0s?{(F6HfSOq{2hfJkRZMW^Gj4;4eYy)Kkm0USN9z0M6d^*;q* zH*v$2sww~V(+p02=$r#}hmVDIi%tKt9}(l4Z0TP(1B_=xWU>8^5kS;lpC0k=jlBR8 zW;=)YFKqI-CjD`Yb}U^Tq%;_mm?8O|U*LQyW@feg??N)Z=p{}Cn-~&Q>clUF>X79y?h3A2gk9RM5AmVlyL!4OX^Bn2S z|1vCLqdc#420p%%esKzwB%dHUPH91{N5 zx%BJBjQ!UfM;ZpEFJ~`t)U4~i&l5wl%V3OjHq?tKXE1tL?)2P}y&aGGXFyFHxIjik zLruieii|m5fGcob84Vg<3UXkV4k>hqh>EskE2M3JJq+d?IAjs)vb2@WRHTuKV}>eXMHn^;&_$&Fed;oP>+ zR_tlm6%{IDWMuT})hqDr>}u=z)(`wHPz&0ikrcU4TOiq%B@@5&7Muvt$%z!}$*qzkF_rbwgN5HQg zsJA<(cw*(D1?;b>HgcEzPtB7bPxT$w#`H|bo`jhjFeYJ|j~97;4#EdAH@h0B+^(K? zN??~~{b~YF2W-&7bSh?~08>{j8H&J)%kArN0-l*e9PrEvpv%2Uz@i7_R(}`pwVkak zf~()XU+#X6pjS$CKXc*%#wLc0BA3O~15UQO^D~z?tA3_{OhJ(hO~mJg<>kSMHd>Aw zvZV(%WqUvHierig-6dc$$5B9OMlFSl_D%R~sKu#$8azGT&&wm4p0sNyOQ%KVxGu$L zr;0Z%bV%~YXHa4=sF+t*r)^C5TlT7a1)F2sd)P+M0C=9mAf31^7BwWf{qixN!)hNu zY;FI|3G@YW4?Ry{dqyllFFiGhPe({k%^Ai#APhDGE6bgbysK=lHot*XC!kR^C)-_f z&e;Db-p6DVe6Qr!e0uBv*>9_}3W<(xYYK_!a8cc&kJX?@?0yCh=vPMoFC1+Z2%seb zzzI3A!9=I3UkyjAiZxl~bU$;AYmbPG>}PsA9DaI3jxRJM#A<6!RO9W~;?mN@+KLxq z7RBlO>=fig9p^q{Tk``aEv5iu&3I&b6qS@r&J0amV^q}C+RbE>1Z1*+%aJt?;0_db z6+NUj68Q;p^?OPt_?oZQm9}oJGE(cB*i)MLR!^iW6Uip1Vq%_cka8(pw__=X2XP7< ze|}Y#Biy@i*e+3YcWW!9RPj=`$_OLirluX<3qqRo^2*B35^KT5e0;{lwE2}`VPRwJ z9KgqtRZ>)}a{MX#8c1V_vv&_a{~kvMme(jD0fDgTQ<`huBA3GeV3Ep(+q6S(@>Xi9 z%HIFiM)Nhn2riGz6t?&t&;Bx04{+K8)%#QtMa9LZCnwUU?wSFQ{+!UWBj{Z8??Yl!ad>TuW0Oubx^0BhaB9H=x*C$2%J z*e(_Z3CmdH1|0bzA=k_J52%9q?#IF}v@R+{jgVGNPfzc4V77E=95&Fa1g$q9J>tg3 z4~`!T3hMA&iN{1{;n>c11kZ2Wy!mYV*}0gwxZuIJx1f?h?UTM&l-$)_Bw@6IgfqY} zfadzOKIsUIW^{CP#k3{ye|4-caj%hug@u)s703^C8u(qfW`8uT@wnN>WH~ap+CGV$ zyLeMD>QwY%-=9Tqjs78?DbRntx<8)W9~BI;lK)pqnmN(ysSiF#sKZal6tV)yQs?Ea z-g!sdn@N0d1*xccj2bt*32Zpy*b>+sh<)J0`L&NRd5nq=FBjr_40_;x*#(RJ0?snQ z5%}W@gUpuWFj7uMp^gBM@!vHP^_|BVYis7D1O=7+4I@& zTVK}L!S-U;V5ZE@?ruir`}gmgeXe!!PuRxa zE?;K->EtVIJTUPA7jxK{ie<{#Z4D%qL`?@AQ<6s%lT);6T8YZ$n!a)AgE~0Cgf}n~ zY?TgaWAs)OIC?r@A?AQue*OB@&UN#f@K$Y)5zmhi#0#A#?Ok0j1}NFW8Q=KHbxd_` zz-g` zK{76lX^;(SZho=(t+6SNk)A$B3hnmo+jenbVFN(>!`MW{#6XP1*)JQDzD^0E5nM$> zgV%ml84&etpmQ$}M86ZfmcIT%5;h!LrKOv)B1-1VMcU@V!EVzd22ODaC`aq;lr%wm zNRD4@a^-RxGN_M%y#-RcP0h{w>yvcmXx`8M0i*l9s4|&h;o%bLKz_RHtzqY|6KtE^ zxqj(xJ;CLSJp!75^wzEK%gZEp@4A9=43S*G`H=qCA3N^>Zj%86C1pb)N}Qr_Zuk2? zzihw)LC?qAJ4^(ef3}?a&&!axd3Usxm{Xe1Y(cv`OK3x#aeY(p7C$18)FyqX+tA>N zc6ui{@*CI^>6wt2E7_4P^ba0@v5SGis?^j}<6QJc)FpKIFvImsSP40G&l_D74j`40 zDPX{9P~+jV$57heSPQsauegN}wvT#)`;+tCdk`A8H$0$x6;Chbi4^; zfzpBR>S?!|>0bnX4@1|zej&g`5D7wQF9VIPW(7P-l_K^KzR(*cH%oJ~vu{0uM;L_D zY<)V?ncm^!nI5^`H;k0a0TPl~S)}aZ&&@ahW6axo4JI2*p zly+{wOmTGF=Xm)A>(Nz-;Njt6JLyDzWbQS#C(*q!wlh!uaovB*rrKO{^mZl9aQy91hc~3tSBRe#^oRr&8S|H8_=QWP_yaz=zr1w$Ye}COh!A zTXW+!c>Hk(G+o9rOSmhneiW_O4-O8Ru;15gfqCWq_Rog8Mv>kNCyid4Ql_*M@a9*( z0chcr7zYfEEHjWaXmVX)Blg~bDj_&+UP@&>M}RCqKfE}c`VbDWxjjF#5)Qct`| zj*5;>Z^Cu+7S*YcSK!F1HP+CSNV>|@0)fxooGd7mi zBjdhg675&Q*;#o=a)pT`SDlyS%5Ru~gQM8}{0t-uc&+E&JqVc`TMy;uVqju2;F3I} zF4*tJn&g&JqM}}iEhP7Xln@4_LNBXxB$Kd-iHJhq0a5Ps>Q!ID^BQmcBy4AA zXCU4~Kg)tm;(94SO{Q<&zAdp$4b7XF08`0*K!Zi#;6e@9RuyMRXsDjj9xK+%16LI`40s&iYVDl6D6-GeK@#=x5+< zDIQW5CntZ)$x0lsK7T`-tK#5LmXxG(<2=}(4FJh+(=1*KVa&b@yfkpoKrZ2o-}zUc zRIZtf5~GfePFOCW;!>nco_x3sH5WV6Osq7uLm4=}NMeHqG%SxKk-TSbAByXxcYyQ> z>Ek3m;q}~8NtorZgHZgj-d0vtsHLUTuYjV7Xl4zuLZ6`Vye8`%vdLHc+gE;HT?`w) z^O%i--JsoVf0~4laBfrxn1b~u+fq67AloVCUP=fOvM~Z~&Og7_9`F9ZY(#}{h8ig| zdOsZA-rv85g9FeKqM0^6Ea@RrYIjlxY)X}sVi>pUSmr!%1_|+tA=3X;&m5@Xl>Cob zg}*Zle}6_+f+1n}FChy$r2vookAnX{sh7XYXIw+D|Gh2;2J%NWr+cXj3lWcJG{1|) zKKdc*l+jwG+t|eKviE$>2cuWuVM9~cccc3HuvUQOgOKmv!N`T=##6PNOGyq zh73k2+MZS~VnG=IWPyAe&y&&>PKd7EnqcTS$(Xob`cU1g2C?Onc33ivokW9erxaq>D}|; z!q>aV48*p<=vaXUi3jX9KB(Yl1{M4-E(<_G5m!ZJFFV1E49@%ezZ+isFcmbtxSQ+r5l^h=*2NtUCt_{ll zI-n>)Zh2$68d$42AcbKduc2W&iY#BfY)6Pp6|`9>sp+t|=%wJjJKk{5bvyg?Y#?k9 z@H1vWn`7A0Oh*gArG}9j5!((rfSRtBxaN4ZChB0nF`&UxE_hL@S8?xE>O(&;JMM434W;lTa}$FJd<2mRtn0tero z0u_dJ^{VrHpyR@s7iy^@#Uh=ova^%@m(EUdE~cZ(Wh1}%p&9rtRKgm$=%6ZoLF@*j zay%~qX};F6MEz?tpvMJu8@_$ut&eh4&AgWdkluYERNUAXM6K%V><5asQ|K@2XWx~| z%tsSK3p6Djk%3fRU|>&YC!7lQyM&ezE^2A#dh+@G``02rihIv|%FBBN&py3AKeL>9 z?Lt3&)t{L8hR#@?>icP^lP4@Ec$-El3M7IPxp$r#84=emx3nyK(e9SRYE=~PBFlM4 zx3g2Bz^|UMt1%rFhRw(mkoMVZ56am(Zt!h3poIci7w)KP7Lra_^McmLi}`u#eX`_5qRo8lB;b-*^wISYo+5Ek zX@3(pV2!w~lrJ|s@<8oDz74R>);OtNr~pIA1VL4%*MiDzFN-KM>zJuMzMjL2xbpOA z^U6<-N2fbUyxG2Inz*f;^%-$WS-J0UBVouM5BAQL9#AJi@>M!4{`+?Yk-W=>6XILr z%t5A3b~4BcQF?*WV-AL%&_P@hmYXCbKh56-<%q%4DZb=H9_W#uKKee?k(a)ZN?dxh znkQ0?*aoj~dvP$UH?#apZD{qK>t8i4XDsf8K{?m|(2Fo=djtwq$)8y1f`Vf}nQn92 z7=R4>$(r!)kR%tf88C7vG_RrnTH=>Ub1!grzO8E=afJpqWM33f97#-RD9^a4AnRWK zziCj&3^w})BQLi+KO}|lI+E+Q?ks0vtrlC)JMaiNM9R)oe<{*pnhEG%! z&uKNs*LLZI=8?ULk)P7t4Z-68b~4~C=ik$UHP7bWc>F(aZBT$Y z=XCd9H2<&!n^A(n14CsL5x+n7Np54((X1yf5CkLQA)hE#yP8+lt+UNp)Z0VSa1|}B z51`DSoLn}Q0|=UE?YQGvpZGPNa*c~7&Z;Or;G%{--lks{FP{(9ke* z{(6-z>BRq3)DF>Cy5M;d@_2h?+udv=7dmy(>%q$u=J`W8FZ~H`k>}m$oiXW_oP+`D z_eM{H1&$6#bnZq}+f;&Uem7kqgIZUbrdIF}=uAR_+?)-0e2#JNN*ImQbNNiUb0vum z(aI!RV&nyayZ6_}2tcdB?DhlIQ7QmB{Q^avge=RSV*OeZK%y7}6O)eiOn5`MO$78l zu1ZbRGF&z$6j&Re5nc4-#SDV-5zx<6Emvp9^luC3MIgE(&L!V?8A1_-h1amLB_!jR z>oxyw&-8A_O4ICW$5{Q{6mN)41au2Z z$*KZa!`U9u@c-SI2f8<;?!06FJv>7LH2ceT!9lPC6hlBkxz_8-4KL84nk^3Q_k1|F zWgqSh>q(kva(~##^r_I&{~}gLCA{8hAxWo{6Nsh!d!*^`$graJ4fk(LN=W_!JRu~1 z0WOD5Esw_8k`?2On`&azUcsO4f&Q35P>2)u=GO*U(=3NDXmU*@&k%kY!ON zA|YXWDIS+Q8XcE-1Juhm_@MSHsi?g6%2o73~bzUDns$V*Be*+fdqO0|pJfmWi zO5TW%*L2>o<--uUZRtp48T60$!@2o-UFdOFKs8`A!|^`Fx9y)A{a_E;`PE=k%n4ug zv??${K{t%FoDR2wMkDJn@$r{Fs&as*NK~t$ z12?wfEr_89kIuDwhWtxjh$Ba=2rQq|I9t#*$-1tHhI~gdkPZdz&TQ4sVQGPm;t~#X zdpJs44$o1}~1q;MIyeIHvEV4Gv<=6Ku&=&p`6zeJJ zKtCdTnUj5iW4#4Tovvus^Ja?7fLm;D4BoGVUdhdZ7TuF7%F0U*(nJo?D)c`h+y9ek fzw9+WaWCS!#UuO_?H2fF6(AC#vd;=cbl?1c3i5xf literal 0 HcmV?d00001 diff --git a/docs/src/06_runtime_view.adoc b/docs/src/06_runtime_view.adoc index 7886952d..dde2226f 100644 --- a/docs/src/06_runtime_view.adoc +++ b/docs/src/06_runtime_view.adoc @@ -4,14 +4,14 @@ ifndef::imagesdir[:imagesdir: ../images] == Runtime View -=== +=== The user plays The user starts a game, and the game uses the questions service to run it. -image::juega.png["Hierarchy of building blocks"] +image::6.1.png["Hierarchy of building blocks"] -=== +=== The user looks at their history The user checks their scores and statistics. -image::historial.png["Hierarchy of building blocks"] \ No newline at end of file +image::6.2.png["Hierarchy of building blocks"] \ No newline at end of file From 19292e7ced77978b172aa0e6bb213dfa12fe19e0 Mon Sep 17 00:00:00 2001 From: rodrox11 Date: Mon, 11 Mar 2024 21:10:27 +0100 Subject: [PATCH 007/127] actualizacion doc 5 --- docs/images/diagrama5.2.png | Bin 0 -> 16988 bytes docs/images/diagrama5.png | Bin 0 -> 35996 bytes docs/src/05_building_block_view.adoc | 4 ++-- 3 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 docs/images/diagrama5.2.png create mode 100644 docs/images/diagrama5.png diff --git a/docs/images/diagrama5.2.png b/docs/images/diagrama5.2.png new file mode 100644 index 0000000000000000000000000000000000000000..eb6f5bc43ff6ca59a7741bf668451a7a4e1b111f GIT binary patch literal 16988 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 CkLR)g literal 0 HcmV?d00001 diff --git a/docs/images/diagrama5.png b/docs/images/diagrama5.png new file mode 100644 index 0000000000000000000000000000000000000000..dadaf15fe16b39a65fbaba673b739896ba80f36a GIT binary patch literal 35996 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 literal 0 HcmV?d00001 diff --git a/docs/src/05_building_block_view.adoc b/docs/src/05_building_block_view.adoc index 010f4318..0c3bfbd9 100644 --- a/docs/src/05_building_block_view.adoc +++ b/docs/src/05_building_block_view.adoc @@ -9,7 +9,7 @@ ifndef::imagesdir[:imagesdir: ../images] The code is broken down in a structured way by levels, in which the internal dependencies of each element are taught. The system is divided into Whitebox and Blackbox. -image::whiteBox5.1.png["Hierarchy of building blocks"] +image::diagrama5.png["Hierarchy of building blocks"] |=== | *_Actors_* | *_Description_* @@ -30,7 +30,7 @@ image::whiteBox5.1.png["Hierarchy of building blocks"] === Level 2 -image::Level2.png["Hierarchy of building blocks"] +image::diagrama5.2.png["Hierarchy of building blocks"] .Motivation From bbe481031fc06bab364e20616b6409aa6aa21f1a Mon Sep 17 00:00:00 2001 From: iyanfdezz Date: Sun, 7 Apr 2024 14:27:52 +0200 Subject: [PATCH 008/127] =?UTF-8?q?Eliminando=20relaci=C3=B3n=20innecesari?= =?UTF-8?q?a?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- users/userservice/user-model.js | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/users/userservice/user-model.js b/users/userservice/user-model.js index 2e26fad8..cbd6319c 100644 --- a/users/userservice/user-model.js +++ b/users/userservice/user-model.js @@ -39,24 +39,14 @@ const groupSchema = new mongoose.Schema({ type: Date, default: Date.now }, + members: [{ + type: String, + required: true + }] }); const Group = mongoose.model('Group', groupSchema); -// Modelo para la relación entre usuarios y grupos -const userGroupSchema = new mongoose.Schema({ - user: { - type: mongoose.Schema.Types.ObjectId, - ref: 'User', - required: true - }, - group: { - type: mongoose.Schema.Types.ObjectId, - ref: 'Group', - required: true - }, -}); -const UserGroup = mongoose.model('UserGroup', userGroupSchema); -module.exports = { User, Group, UserGroup }; \ No newline at end of file +module.exports = { User, Group }; \ No newline at end of file From df8147cbc4fd0399283deaf72e0fc44ff28ed1b9 Mon Sep 17 00:00:00 2001 From: iyanfdezz Date: Sun, 7 Apr 2024 14:28:16 +0200 Subject: [PATCH 009/127] Modificando vista de Grupos --- webapp/src/pages/Social/Groups.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/webapp/src/pages/Social/Groups.js b/webapp/src/pages/Social/Groups.js index 6fdede4b..9ac045a1 100644 --- a/webapp/src/pages/Social/Groups.js +++ b/webapp/src/pages/Social/Groups.js @@ -17,7 +17,7 @@ const Groups = () => { useEffect(() => { const fetchData = async () => { try { - const response = await axios.get(`${apiEndpoint}/group/list`); + const response = await axios.get(`${apiEndpoint}/groups`); setGroups(response.data.groups); } catch (error) { console.error('Error fetching data:', error); @@ -28,7 +28,7 @@ const Groups = () => { const addGroup = async () => { try { - await axios.post(`${apiEndpoint}/group/add`, { + await axios.post(`${apiEndpoint}/groups`, { name: name, username: username }); @@ -41,7 +41,7 @@ const Groups = () => { const handleJoinGroup = async (groupId) => { try { - await axios.post(`${apiEndpoint}/group/join`, { groupId }); + await axios.post(`${apiEndpoint}/groups/${groupId}/join`, { username }); setGroups(prevGroups => prevGroups.filter(group => group._id !== groupId)); } catch (error) { console.error('Error joining group:', error); @@ -80,7 +80,7 @@ const Groups = () => { GROUPS {groups.map((group) => ( - + {group.name} @@ -95,3 +95,4 @@ const Groups = () => { }; export default Groups; + From ec9cb6f32de15afde61aed33b252b74c1c6bfbab Mon Sep 17 00:00:00 2001 From: iyanfdezz Date: Sun, 7 Apr 2024 14:29:12 +0200 Subject: [PATCH 010/127] Modificando endpoints --- users/userservice/user-service.js | 38 +++++++++++-------------------- 1 file changed, 13 insertions(+), 25 deletions(-) diff --git a/users/userservice/user-service.js b/users/userservice/user-service.js index 1da6492f..db020174 100644 --- a/users/userservice/user-service.js +++ b/users/userservice/user-service.js @@ -179,7 +179,7 @@ app.post("/saveGameList", async (req, res) => { } }); -app.get('/group/list', async (req, res) => { +app.get('/groups', async (req, res) => { try { const allGroups = await Group.find(); res.json({ groups: allGroups }); @@ -198,33 +198,25 @@ app.get('/group/:name', async (req, res) => { return res.status(404).json({ error: 'Group not found' }); } - const groupUsers = await UserGroup.find({ group: group._id }).populate('user'); - - res.json({ group, users: groupUsers }); + res.json({ group }); } catch (error) { res.status(400).json({ error: error.message }); } }); // Crear un nuevo grupo -app.post('/group/add', async (req, res) => { +app.post('/groups', async (req, res) => { try { - const { name, userId } = req.body; + const { name, username } = req.body; - // Verifica si el usuario existe - const user = await User.findById(userId); + const user = await User.findOne({ username }); if (!user) { return res.status(404).json({ error: 'User not found' }); } - // Crea un nuevo grupo - const newGroup = new Group({ name }); + const newGroup = new Group({ name, members: [username] }); await newGroup.save(); - // Agrega al usuario como miembro del grupo - const userGroup = new UserGroup({ user: userId, group: newGroup._id }); - await userGroup.save(); - res.json({ message: 'Group created successfully' }); } catch (error) { res.status(400).json({ error: error.message }); @@ -232,31 +224,26 @@ app.post('/group/add', async (req, res) => { }); // Unirse a un grupo existente -app.post('/group/join', async (req, res) => { +app.post('/groups/:groupId/join', async (req, res) => { try { - const { groupId, userId } = req.body; + const { groupId, username } = req.body; - // Verifica si el usuario existe - const user = await User.findById(userId); + const user = await User.findOne({ username }); if (!user) { return res.status(404).json({ error: 'User not found' }); } - // Verifica si el grupo existe const group = await Group.findById(groupId); if (!group) { return res.status(404).json({ error: 'Group not found' }); } - // Verifica si el usuario ya es miembro del grupo - const existingMembership = await UserGroup.findOne({ user: userId, group: groupId }); - if (existingMembership) { + if (group.members.includes(username)) { return res.status(400).json({ error: 'User already a member of this group' }); } - // Agrega al usuario como miembro del grupo - const userGroup = new UserGroup({ user: userId, group: groupId }); - await userGroup.save(); + group.members.push(username); + await group.save(); res.json({ message: 'User joined the group successfully' }); } catch (error) { @@ -264,6 +251,7 @@ app.post('/group/join', async (req, res) => { } }); + const server = app.listen(port, () => { console.log(`User Service listening at http://localhost:${port}`); }); From 5e3ee88beba738c67933f4c629917b2f6046a850 Mon Sep 17 00:00:00 2001 From: iyanfdezz Date: Sun, 7 Apr 2024 15:01:24 +0200 Subject: [PATCH 011/127] Cambios en los endpoints --- users/userservice/user-service.js | 10 ++++++---- webapp/src/pages/Social/Groups.js | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/users/userservice/user-service.js b/users/userservice/user-service.js index db020174..d5bb0458 100644 --- a/users/userservice/user-service.js +++ b/users/userservice/user-service.js @@ -205,16 +205,18 @@ app.get('/group/:name', async (req, res) => { }); // Crear un nuevo grupo -app.post('/groups', async (req, res) => { +app.post('/group/create', async (req, res) => { try { - const { name, username } = req.body; + const name= req.body.name; + const username= req.body.username; - const user = await User.findOne({ username }); + const user = await User.findOne({ username:username }); if (!user) { return res.status(404).json({ error: 'User not found' }); } - const newGroup = new Group({ name, members: [username] }); + const newGroup = new Group({ name: name, + members: [username] }); await newGroup.save(); res.json({ message: 'Group created successfully' }); diff --git a/webapp/src/pages/Social/Groups.js b/webapp/src/pages/Social/Groups.js index 9ac045a1..9b97f398 100644 --- a/webapp/src/pages/Social/Groups.js +++ b/webapp/src/pages/Social/Groups.js @@ -28,7 +28,7 @@ const Groups = () => { const addGroup = async () => { try { - await axios.post(`${apiEndpoint}/groups`, { + await axios.post(`${apiEndpoint}/group/create`, { name: name, username: username }); From aa4b3c88cfd129846ed6785309bda0a477101d66 Mon Sep 17 00:00:00 2001 From: iyanfdezz Date: Sun, 7 Apr 2024 15:13:01 +0200 Subject: [PATCH 012/127] Ya funciona el unirse a grupos y crearlos --- users/userservice/user-service.js | 4 ++-- webapp/src/pages/Social/Groups.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/users/userservice/user-service.js b/users/userservice/user-service.js index d5bb0458..43b1fd93 100644 --- a/users/userservice/user-service.js +++ b/users/userservice/user-service.js @@ -179,7 +179,7 @@ app.post("/saveGameList", async (req, res) => { } }); -app.get('/groups', async (req, res) => { +app.get('/group/list', async (req, res) => { try { const allGroups = await Group.find(); res.json({ groups: allGroups }); @@ -205,7 +205,7 @@ app.get('/group/:name', async (req, res) => { }); // Crear un nuevo grupo -app.post('/group/create', async (req, res) => { +app.post('/group/add', async (req, res) => { try { const name= req.body.name; const username= req.body.username; diff --git a/webapp/src/pages/Social/Groups.js b/webapp/src/pages/Social/Groups.js index 9b97f398..b2de0ce5 100644 --- a/webapp/src/pages/Social/Groups.js +++ b/webapp/src/pages/Social/Groups.js @@ -17,7 +17,7 @@ const Groups = () => { useEffect(() => { const fetchData = async () => { try { - const response = await axios.get(`${apiEndpoint}/groups`); + const response = await axios.get(`${apiEndpoint}/group/list`); setGroups(response.data.groups); } catch (error) { console.error('Error fetching data:', error); @@ -28,7 +28,7 @@ const Groups = () => { const addGroup = async () => { try { - await axios.post(`${apiEndpoint}/group/create`, { + await axios.post(`${apiEndpoint}/group/add`, { name: name, username: username }); From 085f4a0e3d1709ea4400c5f7d66f84720b64e26a Mon Sep 17 00:00:00 2001 From: iyanfdezz Date: Sun, 7 Apr 2024 15:28:35 +0200 Subject: [PATCH 013/127] Dividiendo los grupos en dos vistas --- users/userservice/user-service.js | 5 +- webapp/src/pages/Social/Groups.js | 113 +++++++++++++++----------- webapp/src/pages/Social/UserGroups.js | 88 ++++++++++++++++++++ 3 files changed, 156 insertions(+), 50 deletions(-) create mode 100644 webapp/src/pages/Social/UserGroups.js diff --git a/users/userservice/user-service.js b/users/userservice/user-service.js index 43b1fd93..ac05569e 100644 --- a/users/userservice/user-service.js +++ b/users/userservice/user-service.js @@ -226,9 +226,10 @@ app.post('/group/add', async (req, res) => { }); // Unirse a un grupo existente -app.post('/groups/:groupId/join', async (req, res) => { +app.post('/group/join', async (req, res) => { try { - const { groupId, username } = req.body; + const groupId=req.body.groupId; + const username=req.body.username; const user = await User.findOne({ username }); if (!user) { diff --git a/webapp/src/pages/Social/Groups.js b/webapp/src/pages/Social/Groups.js index b2de0ce5..9470776d 100644 --- a/webapp/src/pages/Social/Groups.js +++ b/webapp/src/pages/Social/Groups.js @@ -1,6 +1,6 @@ import React, { useState, useEffect } from 'react'; import axios from 'axios'; -import { Container, Box, Text, List, ListItem, Button, Divider, Input, Alert } from '@chakra-ui/react'; +import { Container, Box, Text, List, ListItem, Button, Input, Alert } from '@chakra-ui/react'; import Nav from "../../components/Nav/Nav.js"; import Footer from "../../components/Footer/Footer.js"; @@ -15,17 +15,19 @@ const Groups = () => { const apiEndpoint = process.env.REACT_APP_API_ENDPOINT || 'http://localhost:8000'; useEffect(() => { - const fetchData = async () => { - try { - const response = await axios.get(`${apiEndpoint}/group/list`); - setGroups(response.data.groups); - } catch (error) { - console.error('Error fetching data:', error); - } - }; fetchData(); }, []); + const fetchData = async () => { + try { + const response = await axios.get(`${apiEndpoint}/group/list`); + const userGroups = response.data.groups.filter(group => !group.members.includes(username)); + setGroups(userGroups); + } catch (error) { + console.error('Error fetching data:', error); + } + }; + const addGroup = async () => { try { await axios.post(`${apiEndpoint}/group/add`, { @@ -39,14 +41,29 @@ const Groups = () => { } }; - const handleJoinGroup = async (groupId) => { - try { - await axios.post(`${apiEndpoint}/groups/${groupId}/join`, { username }); + const handleJoinGroup = (groupId) => { + fetch(`${apiEndpoint}/group/join`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + groupId: groupId, + username: localStorage.getItem('username') + }) + }) + .then(response => { + if (!response.ok) { + throw new Error('Failed to join group'); + } + setGroups(prevGroups => prevGroups.filter(group => group._id !== groupId)); - } catch (error) { + }) + .catch(error => { console.error('Error joining group:', error); - } + }); }; + const handleCloseAlert = () => { setOpenAlert(false); @@ -54,45 +71,45 @@ const Groups = () => { return ( <> -