42 Commits

Author SHA1 Message Date
Vu Tuan Minh
9c2241c0b1 Update README.md 2025-10-25 02:07:11 +02:00
Vu Tuan Minh
571d7f0402 Test keycloak worked with README.md 2025-10-25 01:56:58 +02:00
trochas
2404733cbe readme 2025-10-24 21:20:16 +02:00
trochas
7c71555add readem + correction 2025-10-23 22:21:36 +02:00
Vu Tuan Minh
3f0e3c801c Maybe add thymeleaf?
need to test and add config keycloak
2025-10-22 01:39:18 +02:00
trochas
f6250a2724 test et correction 2025-10-17 13:58:59 +02:00
trochas
ddd4188524 controller fini, non testé 2025-10-15 22:31:28 +02:00
trochas
8874f38696 controller fini, non testé 2025-10-15 22:31:16 +02:00
trochas
c5f6fa71b9 Nettoyage selon .gitignore 2025-10-12 18:35:20 +02:00
trochas
614c8e4dd9 Ajout du .gitignore 2025-10-12 18:31:21 +02:00
trochas
cfc6847096 Controller question fini et testé avec postman 2025-10-12 18:29:25 +02:00
trochas
dcd069c884 Controller question fini et testé avec postman 2025-10-12 18:26:51 +02:00
trochas
754551ef6c QuestionController, creat et update fonctionent 2025-10-11 16:59:02 +02:00
trochas
57d58f5b27 fix bug spring (h2 version + value var dans ReponseCourte) 2025-10-11 13:51:53 +02:00
trochas
09444a94ed Merge remote-tracking branch 'refs/remotes/origin/tp_spring' into tp_spring 2025-10-08 11:31:47 +02:00
trochas
20248b56e1 Controller reponse et session 2025-10-08 11:30:55 +02:00
tuanvu
44c3144eb0 update pom.xml 2025-10-08 11:06:47 +02:00
trochas
5a9481f92c controller Question fini 2025-10-08 10:52:43 +02:00
trochas
e913f8154d merge 2025-10-08 10:13:06 +02:00
trochas
e2b86cb8e0 TODO controller 2025-10-08 10:10:51 +02:00
tuanvu
a0f7399e83 push init4 2025-10-06 12:20:36 +02:00
tuanvu
fd66500f46 push init3 2025-10-06 11:18:26 +02:00
tuanvu
d677d9ddb5 push init2 2025-10-06 10:59:10 +02:00
tuanvu
e3743e6d16 push init 2025-10-06 10:52:07 +02:00
tuanvu
b446b16027 push swagger 2025-10-06 09:56:36 +02:00
trochas
16126c6364 correction de resouce Question + Readme 2025-10-02 16:15:49 +02:00
trochas
9945ca0baa Question Resource + merge 2025-10-02 15:48:41 +02:00
trochas
23363c5070 Question Resource 2025-10-02 15:47:51 +02:00
tuanvu
de18627c30 push quizz 2025-10-02 15:45:01 +02:00
tuanvu
d79f4f4b8f push quizz 2025-10-02 14:39:53 +02:00
tuanvu
27aff73824 update session resource 2025-10-02 14:03:25 +02:00
trochas
b8df2eccd8 git ignore 2025-10-02 13:29:28 +02:00
tuanvu
a99c7676b1 updated resource 2025-10-01 16:15:56 +02:00
Vu Tuan Minh
bd301f169d FIX XML
ADD MAPPING
2025-10-01 13:32:45 +02:00
Vu Tuan Minh
f4c990c0fb Tested methods Utilisateur
/register
/login
/
/{id}
/register

add Session
2025-10-01 01:34:47 +02:00
Vu Tuan Minh
72ecb82a46 Tested methods Utilisateur
/register
/login
/
/{id}
2025-09-30 23:19:48 +02:00
Vu Tuan Minh
d18bb21b74 REST API works 2025-09-30 01:49:48 +02:00
Vu Tuan Minh
6f75f83f58 Remove gitignore 2025-09-30 01:20:27 +02:00
Vu Tuan Minh
3f264c2a01 Merge remote-tracking branch 'origin/main'
# Conflicts:
#	README.md
2025-09-30 01:18:53 +02:00
Vu Tuan Minh
93224bb17d Update README.md 2025-09-30 01:18:40 +02:00
Rochas
bc5a0e488d correction README < et > dans les list 2025-09-26 18:38:06 +02:00
trochas
1139a6ec7e JpaTest todo fini Quizz 2025-09-22 16:45:18 +02:00
69 changed files with 2376 additions and 1433 deletions

738
Insomnia_test.yaml Normal file
View File

@@ -0,0 +1,738 @@
type: collection.insomnia.rest/5.0
name: TP4
meta:
id: wrk_edb44e38083f4e9f83998faf549c0d7a
created: 1754408137750
modified: 1761341975705
description: ""
collection:
- name: SESSION
meta:
id: fld_6a3d533b4c7a494986be94875f20da98
created: 1761344709621
modified: 1761344822984
sortKey: -1761344728121.25
description: ""
children:
- url: http://localhost:8082/session/getAll
name: Get all session from USER
meta:
id: req_1655a615b20d49f8bdf3fc81c5d6b761
created: 1761165598138
modified: 1761344718542
isPrivate: false
description: ""
sortKey: -1761344718509
method: GET
body:
mimeType: application/x-www-form-urlencoded
params:
- id: pair_54b0a24cfe5c4d81ae864d64640e35f2
name: client_id
value: myspringbootapp
description: ""
disabled: false
- id: pair_f6c73c60f3024e42bbacc223615d3be1
name: client_secret
value: Y7xpKQbFalUFTGUGD9XDBcvawvs3zsWZ
description: ""
disabled: false
- id: pair_3698939343424230a63d135857f0acb1
name: username
value: myuser2
description: ""
disabled: false
- id: pair_f8b4c07baea14742a4ebd8f005ff5e92
name: password
value: "1"
description: ""
disabled: false
- id: pair_e49d8dbb324d484bad8747b563ae1615
name: grant_type
value: password
description: ""
disabled: false
headers:
- name: Content-Type
value: application/x-www-form-urlencoded
id: pair_987cf70c521843c8a47e1c51976cce3b
type: text
multiline: false
- name: User-Agent
value: insomnia/11.6.1
id: pair_4c3461e4c95d45bd973dcb4bfd5e519a
- id: pair_b3814f137d494ce389fbe6075385cb71
name: Authorization
value: Bearer
eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJVaDlNMG8wMERKaEdTQzdTRjdmdDlFZWFDNmE4UVdKV0NPXzdENVBKeXFRIn0.eyJleHAiOjE3NjEzNDQ5NzgsImlhdCI6MTc2MTM0NDY3OCwianRpIjoib25ydHJvOjAyY2MxNDU5LWUwY2MtNzUzZi0yNWY3LTk1MWQ0Zjg0N2Q5ZSIsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9yZWFsbXMvbXlzcHJpbmdib290YXBwcmVhbG0iLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiOTkyZTI3OTktN2ExOS00ZWY1LTk0ODItYWMzMjljNTNhNDc5IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoibXlzcHJpbmdib290YXBwIiwic2lkIjoiNDQ4Y2NiMjUtYzZjNC05OTU1LTk2ZmItZDgxMmNjZDRlMjMyIiwiYWNyIjoiMSIsImFsbG93ZWQtb3JpZ2lucyI6WyJodHRwOi8vbG9jYWxob3N0OjgwODIiXSwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbIm9mZmxpbmVfYWNjZXNzIiwidW1hX2F1dGhvcml6YXRpb24iLCJVU0VSIiwiZGVmYXVsdC1yb2xlcy1teXNwcmluZ2Jvb3RhcHByZWFsbSJdfSwicmVzb3VyY2VfYWNjZXNzIjp7ImFjY291bnQiOnsicm9sZXMiOlsibWFuYWdlLWFjY291bnQiLCJtYW5hZ2UtYWNjb3VudC1saW5rcyIsInZpZXctcHJvZmlsZSJdfX0sInNjb3BlIjoicHJvZmlsZSBlbWFpbCIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJuYW1lIjoidWlvYXpkcSB6c29rZHFzamtkIiwicHJlZmVycmVkX3VzZXJuYW1lIjoibXl1c2VyMiIsImdpdmVuX25hbWUiOiJ1aW9hemRxIiwiZmFtaWx5X25hbWUiOiJ6c29rZHFzamtkIiwiZW1haWwiOiJva0BjYWNhLmNvbSJ9.mhQIeD0e_kuS_zCZDGd6x2mq4VqeRBemFiCM-4NcSRwSvLqSl0AKla4pfpOg88dXyKjYbSJyszQ7-qMtO3NFgFT5Tlcf5pb-FR8p5XRk1XgKcKX-9-kirbhsuHzFRMbRSRr7RooPLvhqqarxZtAAPWtEzXveysVTIYLffhhJ7MdYLfQRVFhUGTyashuYH-H6_L8DpjGhie_bcf7VXfo4-UupJEmcUBzjmDXt4aunAl1-qEdLoJ0FgqQwB63DGxoVnRePBYCmiuUJM_KXQ8bi_epkwyeL6HDRL6GuudCIPWTNLYckU0wXWb5nLcQBAjE3s3DidyYKpndZbNjYXKOkaw
description: ""
disabled: false
settings:
renderRequestBody: true
encodeUrl: true
followRedirects: global
cookies:
send: true
store: true
rebuildPath: true
- url: http://localhost:8082/session/create
name: "CREATE session with ADMIN "
meta:
id: req_3a89035567d94274a0965addaf869500
created: 1761166627479
modified: 1761344721839
isPrivate: false
description: ""
sortKey: -1761344718609
method: POST
body:
mimeType: application/json
text: '{"theme": "Science Informatic"}'
headers:
- name: Content-Type
value: application/json
id: pair_2694b5ff2f964512842dc3fa44ccd3e1
- name: User-Agent
value: insomnia/11.6.1
id: pair_4c3461e4c95d45bd973dcb4bfd5e519a
- id: pair_b3814f137d494ce389fbe6075385cb71
name: Authorization
value: Bearer
eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJVaDlNMG8wMERKaEdTQzdTRjdmdDlFZWFDNmE4UVdKV0NPXzdENVBKeXFRIn0.eyJleHAiOjE3NjEzNDQ4MTYsImlhdCI6MTc2MTM0NDUxNiwianRpIjoib25ydHJvOmNjNTE3YmI2LTMzMzMtN2RiMy03NGI1LTlkYjNhOTQzZGNhMiIsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9yZWFsbXMvbXlzcHJpbmdib290YXBwcmVhbG0iLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiMmY5YWRhYzQtODU4Ni00NTI4LWE4Y2QtM2I3M2I5NTc0ODBiIiwidHlwIjoiQmVhcmVyIiwiYXpwIjoibXlzcHJpbmdib290YXBwIiwic2lkIjoiZTFjZDE4YzAtOWQyNS04ZjFmLWM4MzMtYTdmMDcwZGMwOGQ2IiwiYWNyIjoiMSIsImFsbG93ZWQtb3JpZ2lucyI6WyJodHRwOi8vbG9jYWxob3N0OjgwODIiXSwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbIm9mZmxpbmVfYWNjZXNzIiwidW1hX2F1dGhvcml6YXRpb24iLCJBRE1JTiIsImRlZmF1bHQtcm9sZXMtbXlzcHJpbmdib290YXBwcmVhbG0iXX0sInJlc291cmNlX2FjY2VzcyI6eyJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6InByb2ZpbGUgZW1haWwiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwibmFtZSI6IlRpYm8gUm9jaGFzIiwicHJlZmVycmVkX3VzZXJuYW1lIjoibXl1c2VyIiwiZ2l2ZW5fbmFtZSI6IlRpYm8iLCJmYW1pbHlfbmFtZSI6IlJvY2hhcyIsImVtYWlsIjoidGlib0BjYWNhLmNvbSJ9.PM3Bj5-c3QFWeVy6fhcrVZDE2CqzGZPYW3ZLg46whc1vCYbb7c_ASuu0pJKDXHIiRrH2_Yws1qtY5u5fSquZ1zHENppsB4ltRwpf2dTQjZ5-0a_ULbbXsONCJ_TUxAkUaTuy6XNYXAjRf8nH_SirfDRgTB47ynOXTKqGVNZYhgkQKbpxZ1UwVOciQpeuXQqbIXBhfo5Ejpyp8DiWkkXujDnJGJua2FQaNfSvDmas4BSB2V4_2rXAbT72t76INu3vJYetGO5wPgWppwl0PVK3dvOIK_iSMR0LHp8-MMlykPZpESxq1DGLfHAP7XYDS2u0yiddhGZY0fD4ziegDDVJpw
description: ""
disabled: false
settings:
renderRequestBody: true
encodeUrl: true
followRedirects: global
cookies:
send: true
store: true
rebuildPath: true
- url: http://localhost:8082/session/delete/5
name: "DELETE session with ADMIN "
meta:
id: req_28a034a37be54183b1423364b01ecb71
created: 1761344610268
modified: 1761348128370
isPrivate: false
description: ""
sortKey: -1761344718559
method: DELETE
body:
mimeType: application/json
text: ""
headers:
- name: Content-Type
value: application/json
id: pair_2694b5ff2f964512842dc3fa44ccd3e1
- name: User-Agent
value: insomnia/11.6.1
id: pair_4c3461e4c95d45bd973dcb4bfd5e519a
- id: pair_b3814f137d494ce389fbe6075385cb71
name: Authorization
value: Bearer
eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJVaDlNMG8wMERKaEdTQzdTRjdmdDlFZWFDNmE4UVdKV0NPXzdENVBKeXFRIn0.eyJleHAiOjE3NjEzNDQ4MTYsImlhdCI6MTc2MTM0NDUxNiwianRpIjoib25ydHJvOmNjNTE3YmI2LTMzMzMtN2RiMy03NGI1LTlkYjNhOTQzZGNhMiIsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9yZWFsbXMvbXlzcHJpbmdib290YXBwcmVhbG0iLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiMmY5YWRhYzQtODU4Ni00NTI4LWE4Y2QtM2I3M2I5NTc0ODBiIiwidHlwIjoiQmVhcmVyIiwiYXpwIjoibXlzcHJpbmdib290YXBwIiwic2lkIjoiZTFjZDE4YzAtOWQyNS04ZjFmLWM4MzMtYTdmMDcwZGMwOGQ2IiwiYWNyIjoiMSIsImFsbG93ZWQtb3JpZ2lucyI6WyJodHRwOi8vbG9jYWxob3N0OjgwODIiXSwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbIm9mZmxpbmVfYWNjZXNzIiwidW1hX2F1dGhvcml6YXRpb24iLCJBRE1JTiIsImRlZmF1bHQtcm9sZXMtbXlzcHJpbmdib290YXBwcmVhbG0iXX0sInJlc291cmNlX2FjY2VzcyI6eyJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6InByb2ZpbGUgZW1haWwiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwibmFtZSI6IlRpYm8gUm9jaGFzIiwicHJlZmVycmVkX3VzZXJuYW1lIjoibXl1c2VyIiwiZ2l2ZW5fbmFtZSI6IlRpYm8iLCJmYW1pbHlfbmFtZSI6IlJvY2hhcyIsImVtYWlsIjoidGlib0BjYWNhLmNvbSJ9.PM3Bj5-c3QFWeVy6fhcrVZDE2CqzGZPYW3ZLg46whc1vCYbb7c_ASuu0pJKDXHIiRrH2_Yws1qtY5u5fSquZ1zHENppsB4ltRwpf2dTQjZ5-0a_ULbbXsONCJ_TUxAkUaTuy6XNYXAjRf8nH_SirfDRgTB47ynOXTKqGVNZYhgkQKbpxZ1UwVOciQpeuXQqbIXBhfo5Ejpyp8DiWkkXujDnJGJua2FQaNfSvDmas4BSB2V4_2rXAbT72t76INu3vJYetGO5wPgWppwl0PVK3dvOIK_iSMR0LHp8-MMlykPZpESxq1DGLfHAP7XYDS2u0yiddhGZY0fD4ziegDDVJpw
description: ""
disabled: false
settings:
renderRequestBody: true
encodeUrl: true
followRedirects: global
cookies:
send: true
store: true
rebuildPath: true
- name: TOKEN
meta:
id: fld_edbd6e42d9804716ab375d1a9c4e34f8
created: 1761344734288
modified: 1761344734288
sortKey: -1761344734288
description: ""
children:
- url: http://localhost:8080/realms/myspringbootapprealm/protocol/openid-connect/token
name: POST token of myuser2 (USER)
meta:
id: req_6042b7d04430475090e584300c99eab9
created: 1759266818074
modified: 1761344742391
isPrivate: false
description: ""
sortKey: -1761344738832
method: POST
body:
mimeType: application/x-www-form-urlencoded
params:
- id: pair_54b0a24cfe5c4d81ae864d64640e35f2
name: client_id
value: myspringbootapp
description: ""
disabled: false
- id: pair_f6c73c60f3024e42bbacc223615d3be1
name: client_secret
value: Y7xpKQbFalUFTGUGD9XDBcvawvs3zsWZ
description: ""
disabled: false
- id: pair_3698939343424230a63d135857f0acb1
name: username
value: myuser2
description: ""
disabled: false
- id: pair_f8b4c07baea14742a4ebd8f005ff5e92
name: password
value: "1"
description: ""
disabled: false
- id: pair_e49d8dbb324d484bad8747b563ae1615
name: grant_type
value: password
description: ""
disabled: false
headers:
- name: Content-Type
value: application/x-www-form-urlencoded
id: pair_987cf70c521843c8a47e1c51976cce3b
type: text
multiline: false
- name: User-Agent
value: insomnia/11.6.1
id: pair_4c3461e4c95d45bd973dcb4bfd5e519a
settings:
renderRequestBody: true
encodeUrl: true
followRedirects: global
cookies:
send: true
store: true
rebuildPath: true
- url: http://localhost:8080/realms/myspringbootapprealm/protocol/openid-connect/token
name: POST token of myuser (ADMIN)
meta:
id: req_01c3633b3ca74f01addf57999b2e0c4c
created: 1761341868733
modified: 1761345268241
isPrivate: false
description: ""
sortKey: -1761344738732
method: POST
body:
mimeType: application/x-www-form-urlencoded
params:
- id: pair_54b0a24cfe5c4d81ae864d64640e35f2
name: client_id
value: myspringbootapp
description: ""
disabled: false
- id: pair_f6c73c60f3024e42bbacc223615d3be1
name: client_secret
value: Y7xpKQbFalUFTGUGD9XDBcvawvs3zsWZ
description: ""
disabled: false
- id: pair_3698939343424230a63d135857f0acb1
name: username
value: myuser
description: ""
disabled: false
- id: pair_f8b4c07baea14742a4ebd8f005ff5e92
name: password
value: "1"
description: ""
disabled: false
- id: pair_e49d8dbb324d484bad8747b563ae1615
name: grant_type
value: password
description: ""
disabled: false
headers:
- name: Content-Type
value: application/x-www-form-urlencoded
id: pair_987cf70c521843c8a47e1c51976cce3b
type: text
multiline: false
- name: User-Agent
value: insomnia/11.6.1
id: pair_4c3461e4c95d45bd973dcb4bfd5e519a
settings:
renderRequestBody: true
encodeUrl: true
followRedirects: global
cookies:
send: true
store: true
rebuildPath: true
- name: RESPONSE
meta:
id: fld_bc553a9a2b6f4c869522a93d27180c10
created: 1761344775233
modified: 1761348525580
sortKey: -1761344726579.5625
description: ""
children:
- url: http://localhost:8082/reponse/create/choix
name: "CREATE resp choix with ADMIN "
meta:
id: req_c8c745e6a7f54f53a3767e741ac7fee2
created: 1761344835170
modified: 1761345288184
isPrivate: false
description: ""
sortKey: -1761344838422
method: POST
body:
mimeType: application/json
text: '{"theme": "Science Informatic"}'
headers:
- name: Content-Type
value: application/json
id: pair_2694b5ff2f964512842dc3fa44ccd3e1
- name: User-Agent
value: insomnia/11.6.1
id: pair_4c3461e4c95d45bd973dcb4bfd5e519a
- id: pair_b3814f137d494ce389fbe6075385cb71
name: Authorization
value: Bearer
eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJVaDlNMG8wMERKaEdTQzdTRjdmdDlFZWFDNmE4UVdKV0NPXzdENVBKeXFRIn0.eyJleHAiOjE3NjEzNDU1ODEsImlhdCI6MTc2MTM0NTI4MSwianRpIjoib25ydHJvOjJmOWViYjE0LTExNGUtN2JmZS02NzllLTUzZDE5NmQzMTAxNiIsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9yZWFsbXMvbXlzcHJpbmdib290YXBwcmVhbG0iLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiMmY5YWRhYzQtODU4Ni00NTI4LWE4Y2QtM2I3M2I5NTc0ODBiIiwidHlwIjoiQmVhcmVyIiwiYXpwIjoibXlzcHJpbmdib290YXBwIiwic2lkIjoiOTEzYzRlZTAtNWY3MS03NjMyLTkyOGItNDU0YzNmODJhYzcxIiwiYWNyIjoiMSIsImFsbG93ZWQtb3JpZ2lucyI6WyJodHRwOi8vbG9jYWxob3N0OjgwODIiXSwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbIm9mZmxpbmVfYWNjZXNzIiwidW1hX2F1dGhvcml6YXRpb24iLCJBRE1JTiIsImRlZmF1bHQtcm9sZXMtbXlzcHJpbmdib290YXBwcmVhbG0iXX0sInJlc291cmNlX2FjY2VzcyI6eyJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6InByb2ZpbGUgZW1haWwiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwibmFtZSI6IlRpYm8gUm9jaGFzIiwicHJlZmVycmVkX3VzZXJuYW1lIjoibXl1c2VyIiwiZ2l2ZW5fbmFtZSI6IlRpYm8iLCJmYW1pbHlfbmFtZSI6IlJvY2hhcyIsImVtYWlsIjoidGlib0BjYWNhLmNvbSJ9.rRmFvq0OJmCf6p6pZqm2cPGOYhMc8_xhuApZw5yMHjhKIu-faEwd_-cd1yIE8SJ4VqKi979l5ZT4wLTiGRT6tDKyKkd6gszMXJ71YmphM0czEV-gpOLodA9UxQN_W1nDjE7l3f6Xe_LZgyHUzTIt3sJP8GTbFtzaOyeRsMa9VYcA0gxkeUoymbfFerpvpF3z2c2U_OjZkoT79GpRpzqzqGzZoyDVO8KglWh4tE0pSwy9zCKqs_DcTxxD_6OIUyWujwrriy9SRGd2lfYoQROEqfi1lU5Jwi7cdNwHfyjzm6m0xBsJkJGjkEOf747vxUKrMqwxmYWUSWZ7s1dhdEYBuA
description: ""
disabled: false
settings:
renderRequestBody: true
encodeUrl: true
followRedirects: global
cookies:
send: true
store: true
rebuildPath: true
- url: http://localhost:8082/reponse/create/courte
name: "CREATE resp courte with ADMIN "
meta:
id: req_8cfde146a3b74765acc4e5607adf9fb7
created: 1761344881275
modified: 1761344909081
isPrivate: false
description: ""
sortKey: -1761344788627
method: POST
body:
mimeType: application/json
text: '{"theme": "Science Informatic"}'
headers:
- name: Content-Type
value: application/json
id: pair_2694b5ff2f964512842dc3fa44ccd3e1
- name: User-Agent
value: insomnia/11.6.1
id: pair_4c3461e4c95d45bd973dcb4bfd5e519a
- id: pair_b3814f137d494ce389fbe6075385cb71
name: Authorization
value: Bearer
eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJVaDlNMG8wMERKaEdTQzdTRjdmdDlFZWFDNmE4UVdKV0NPXzdENVBKeXFRIn0.eyJleHAiOjE3NjEzNDUxOTksImlhdCI6MTc2MTM0NDg5OSwianRpIjoib25ydHJvOjhmODU1YmEyLWMxN2MtMDBhNy1lMTVhLTRhOTg3ZWE5OWRmMiIsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9yZWFsbXMvbXlzcHJpbmdib290YXBwcmVhbG0iLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiMmY5YWRhYzQtODU4Ni00NTI4LWE4Y2QtM2I3M2I5NTc0ODBiIiwidHlwIjoiQmVhcmVyIiwiYXpwIjoibXlzcHJpbmdib290YXBwIiwic2lkIjoiMzE0MjQ2MDgtMzFmMi01ZmJhLTQ3M2EtNmFhZGNiMWRkNzJmIiwiYWNyIjoiMSIsImFsbG93ZWQtb3JpZ2lucyI6WyJodHRwOi8vbG9jYWxob3N0OjgwODIiXSwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbIm9mZmxpbmVfYWNjZXNzIiwidW1hX2F1dGhvcml6YXRpb24iLCJBRE1JTiIsImRlZmF1bHQtcm9sZXMtbXlzcHJpbmdib290YXBwcmVhbG0iXX0sInJlc291cmNlX2FjY2VzcyI6eyJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6InByb2ZpbGUgZW1haWwiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwibmFtZSI6IlRpYm8gUm9jaGFzIiwicHJlZmVycmVkX3VzZXJuYW1lIjoibXl1c2VyIiwiZ2l2ZW5fbmFtZSI6IlRpYm8iLCJmYW1pbHlfbmFtZSI6IlJvY2hhcyIsImVtYWlsIjoidGlib0BjYWNhLmNvbSJ9.c0P5T6tk__nXWvdv0_YOW78GAZy0e6Q9o5dvjB8resS8_PcJne-d2RgH2gzES36I1X4E71Quj5WpXVGZSR_j7P25MIo4Xm-5kRlnMfsWFNWpTkjmos0CI5d2VP4vW0iDqvucLNhW3Z1aYgmC1KxLrrIPhUXob5_2xem4yWA6dJdfeUZzTv_a5yOIiDpDxpZhNUHAgfK_tWzivYdNLqLSd-dvgZD9PZeFcYoXcT3fWNhZW6Ix8FKvHuUjpczCGoc7k4flqdDcbU2_UK4liByeKntQ1JuD1a5gNM6Sp9ijrvQVouB8N8ejcRTQjlRy-mXlQUUbtYimOerBTvuJyGE-RQ
description: ""
disabled: false
settings:
renderRequestBody: true
encodeUrl: true
followRedirects: global
cookies:
send: true
store: true
rebuildPath: true
- url: http://localhost:8082/reponse/getAll
name: Get all resp courte from USER
meta:
id: req_4b38e162a28d4909bf45b7b9abc204a4
created: 1761344930516
modified: 1761345550386
isPrivate: false
description: ""
sortKey: -1761344788527
method: GET
body:
mimeType: application/x-www-form-urlencoded
params:
- id: pair_54b0a24cfe5c4d81ae864d64640e35f2
name: client_id
value: myspringbootapp
description: ""
disabled: false
- id: pair_f6c73c60f3024e42bbacc223615d3be1
name: client_secret
value: Y7xpKQbFalUFTGUGD9XDBcvawvs3zsWZ
description: ""
disabled: false
- id: pair_3698939343424230a63d135857f0acb1
name: username
value: myuser2
description: ""
disabled: false
- id: pair_f8b4c07baea14742a4ebd8f005ff5e92
name: password
value: "1"
description: ""
disabled: false
- id: pair_e49d8dbb324d484bad8747b563ae1615
name: grant_type
value: password
description: ""
disabled: false
headers:
- name: Content-Type
value: application/x-www-form-urlencoded
id: pair_987cf70c521843c8a47e1c51976cce3b
type: text
multiline: false
- name: User-Agent
value: insomnia/11.6.1
id: pair_4c3461e4c95d45bd973dcb4bfd5e519a
- id: pair_b3814f137d494ce389fbe6075385cb71
name: Authorization
value: Bearer
eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJVaDlNMG8wMERKaEdTQzdTRjdmdDlFZWFDNmE4UVdKV0NPXzdENVBKeXFRIn0.eyJleHAiOjE3NjEzNDU2MjAsImlhdCI6MTc2MTM0NTMyMCwianRpIjoib25ydHJvOjJhMGIxOGZiLWE4MjEtMWI3MS1iODQ1LWE5NGY0NWY1ZDA4MSIsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9yZWFsbXMvbXlzcHJpbmdib290YXBwcmVhbG0iLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiOTkyZTI3OTktN2ExOS00ZWY1LTk0ODItYWMzMjljNTNhNDc5IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoibXlzcHJpbmdib290YXBwIiwic2lkIjoiMzFhYmVlNzYtOWJkNy02NWMyLWY0MzMtOTJiZjliODZlMDA1IiwiYWNyIjoiMSIsImFsbG93ZWQtb3JpZ2lucyI6WyJodHRwOi8vbG9jYWxob3N0OjgwODIiXSwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbIm9mZmxpbmVfYWNjZXNzIiwidW1hX2F1dGhvcml6YXRpb24iLCJVU0VSIiwiZGVmYXVsdC1yb2xlcy1teXNwcmluZ2Jvb3RhcHByZWFsbSJdfSwicmVzb3VyY2VfYWNjZXNzIjp7ImFjY291bnQiOnsicm9sZXMiOlsibWFuYWdlLWFjY291bnQiLCJtYW5hZ2UtYWNjb3VudC1saW5rcyIsInZpZXctcHJvZmlsZSJdfX0sInNjb3BlIjoicHJvZmlsZSBlbWFpbCIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJuYW1lIjoidWlvYXpkcSB6c29rZHFzamtkIiwicHJlZmVycmVkX3VzZXJuYW1lIjoibXl1c2VyMiIsImdpdmVuX25hbWUiOiJ1aW9hemRxIiwiZmFtaWx5X25hbWUiOiJ6c29rZHFzamtkIiwiZW1haWwiOiJva0BjYWNhLmNvbSJ9.GBNldYmb4q02AaOwnu1xoLxkF_9qvadLdw1ftjetOsaDNYSe_y_9XhqmStc1ocD11AJUVr0Ix9fqB6TACoNMBS6gegSI6xmmdjT2ABqGilcpMs3OY6edNB8qZ9LP_YFK_z6UWdBBgWmETSfr9zRGVOOfLDMFwadgxCtbeV1AxGLTmfdVLCDPOlZseN3SNKHeFbC_ApYgPR-_vO1Fjl8KE8CucWULoDzgyHBdU1zqlLttlpaOQHl6aHWS0mtb4ymvQWDp7UZd-aukVb41UT5oeVtPS9HC6w2jfd4UBxG1T2TdTfazoXXk1eGgAD7ir6QyoB2Pkv9aANiRMMrTlk0C_w
description: ""
disabled: false
settings:
renderRequestBody: true
encodeUrl: true
followRedirects: global
cookies:
send: true
store: true
rebuildPath: true
- url: http://localhost:8082/reponse/addReponse/2
name: PUT resp courte from ADMIN
meta:
id: req_2704faf70033478ab6ae1def154fa917
created: 1761345052972
modified: 1761345244528
isPrivate: false
description: ""
sortKey: -1761344763679.5
method: PUT
body:
mimeType: application/json
text: |-
{
"reponse": "La bonne réponse 2"
}
headers:
- name: Content-Type
value: application/json
- name: User-Agent
value: insomnia/11.6.1
id: pair_4c3461e4c95d45bd973dcb4bfd5e519a
- id: pair_b3814f137d494ce389fbe6075385cb71
name: Authorization
value: Bearer
eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJVaDlNMG8wMERKaEdTQzdTRjdmdDlFZWFDNmE4UVdKV0NPXzdENVBKeXFRIn0.eyJleHAiOjE3NjEzNDUyNDgsImlhdCI6MTc2MTM0NDk0OCwianRpIjoib25ydHJvOjFiMzcwMjU1LTg5MzgtM2U0Zi1lMTBiLTVlOGZmOTYwNzVlMCIsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9yZWFsbXMvbXlzcHJpbmdib290YXBwcmVhbG0iLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiOTkyZTI3OTktN2ExOS00ZWY1LTk0ODItYWMzMjljNTNhNDc5IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoibXlzcHJpbmdib290YXBwIiwic2lkIjoiYTVjYWNlMDUtYTIxZS1kMzk2LTdhYjEtMDRmOWEwNTg5YzQwIiwiYWNyIjoiMSIsImFsbG93ZWQtb3JpZ2lucyI6WyJodHRwOi8vbG9jYWxob3N0OjgwODIiXSwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbIm9mZmxpbmVfYWNjZXNzIiwidW1hX2F1dGhvcml6YXRpb24iLCJVU0VSIiwiZGVmYXVsdC1yb2xlcy1teXNwcmluZ2Jvb3RhcHByZWFsbSJdfSwicmVzb3VyY2VfYWNjZXNzIjp7ImFjY291bnQiOnsicm9sZXMiOlsibWFuYWdlLWFjY291bnQiLCJtYW5hZ2UtYWNjb3VudC1saW5rcyIsInZpZXctcHJvZmlsZSJdfX0sInNjb3BlIjoicHJvZmlsZSBlbWFpbCIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJuYW1lIjoidWlvYXpkcSB6c29rZHFzamtkIiwicHJlZmVycmVkX3VzZXJuYW1lIjoibXl1c2VyMiIsImdpdmVuX25hbWUiOiJ1aW9hemRxIiwiZmFtaWx5X25hbWUiOiJ6c29rZHFzamtkIiwiZW1haWwiOiJva0BjYWNhLmNvbSJ9.Hqsi5Pk5Hrh61cKDEmMbGpA2kv3YTW-WOh0Z4NhrZn2GeCphKI3ApgRV3Zbkrt_UbyUv3z9UW69eZLUFIS-LZRMNBiwSl7U86xlNA9s5A9aiCL7GU5NsyCy4zNlqNo2RHZP_2RLB-aPtmWr8eDjFEhN0M8WwZJIje-vvDUQAugAKe6x0g8L1IbajYxGSHqScIYE8UAV9sA-HcVOVY92uGUG3T8xZK4_v9EvUI3hfleHaQVBilhlh_cHhcOTngvBgO4C__npW9KJYKeQiPqXyrN5cmNeJWJ38UcfcoinSXsXAjdwPQDTikg9W8x9qf9-MyVIDRBHZBwqj65MkyRCEcQ
description: ""
disabled: false
settings:
renderRequestBody: true
encodeUrl: true
followRedirects: global
cookies:
send: true
store: true
rebuildPath: true
- url: http://localhost:8082/reponse/addChoix/13
name: PUT resp choix from ADMIN
meta:
id: req_4188b0f6c89f4cce9159f88c380a46cb
created: 1761345107220
modified: 1761345327676
isPrivate: false
description: ""
sortKey: -1761344751255.75
method: PUT
body:
mimeType: application/json
text: |-
{
"choix": "Option A"
}
headers:
- name: Content-Type
value: application/json
id: pair_911df3ed408a4f8399789d8f9cdac928
- name: User-Agent
value: insomnia/11.6.1
id: pair_4c3461e4c95d45bd973dcb4bfd5e519a
- id: pair_b3814f137d494ce389fbe6075385cb71
name: Authorization
value: Bearer
eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJVaDlNMG8wMERKaEdTQzdTRjdmdDlFZWFDNmE4UVdKV0NPXzdENVBKeXFRIn0.eyJleHAiOjE3NjEzNDU2MjAsImlhdCI6MTc2MTM0NTMyMCwianRpIjoib25ydHJvOjJhMGIxOGZiLWE4MjEtMWI3MS1iODQ1LWE5NGY0NWY1ZDA4MSIsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9yZWFsbXMvbXlzcHJpbmdib290YXBwcmVhbG0iLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiOTkyZTI3OTktN2ExOS00ZWY1LTk0ODItYWMzMjljNTNhNDc5IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoibXlzcHJpbmdib290YXBwIiwic2lkIjoiMzFhYmVlNzYtOWJkNy02NWMyLWY0MzMtOTJiZjliODZlMDA1IiwiYWNyIjoiMSIsImFsbG93ZWQtb3JpZ2lucyI6WyJodHRwOi8vbG9jYWxob3N0OjgwODIiXSwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbIm9mZmxpbmVfYWNjZXNzIiwidW1hX2F1dGhvcml6YXRpb24iLCJVU0VSIiwiZGVmYXVsdC1yb2xlcy1teXNwcmluZ2Jvb3RhcHByZWFsbSJdfSwicmVzb3VyY2VfYWNjZXNzIjp7ImFjY291bnQiOnsicm9sZXMiOlsibWFuYWdlLWFjY291bnQiLCJtYW5hZ2UtYWNjb3VudC1saW5rcyIsInZpZXctcHJvZmlsZSJdfX0sInNjb3BlIjoicHJvZmlsZSBlbWFpbCIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJuYW1lIjoidWlvYXpkcSB6c29rZHFzamtkIiwicHJlZmVycmVkX3VzZXJuYW1lIjoibXl1c2VyMiIsImdpdmVuX25hbWUiOiJ1aW9hemRxIiwiZmFtaWx5X25hbWUiOiJ6c29rZHFzamtkIiwiZW1haWwiOiJva0BjYWNhLmNvbSJ9.GBNldYmb4q02AaOwnu1xoLxkF_9qvadLdw1ftjetOsaDNYSe_y_9XhqmStc1ocD11AJUVr0Ix9fqB6TACoNMBS6gegSI6xmmdjT2ABqGilcpMs3OY6edNB8qZ9LP_YFK_z6UWdBBgWmETSfr9zRGVOOfLDMFwadgxCtbeV1AxGLTmfdVLCDPOlZseN3SNKHeFbC_ApYgPR-_vO1Fjl8KE8CucWULoDzgyHBdU1zqlLttlpaOQHl6aHWS0mtb4ymvQWDp7UZd-aukVb41UT5oeVtPS9HC6w2jfd4UBxG1T2TdTfazoXXk1eGgAD7ir6QyoB2Pkv9aANiRMMrTlk0C_w
description: ""
disabled: false
settings:
renderRequestBody: true
encodeUrl: true
followRedirects: global
cookies:
send: true
store: true
rebuildPath: true
- url: http://localhost:8082/reponse/get/13
name: Get all resp choix from USER
meta:
id: req_dcface58294d4fd793f7ba39bbfb1bd8
created: 1761345559727
modified: 1761345567849
isPrivate: false
description: ""
sortKey: -1761344776103.25
method: GET
body:
mimeType: application/x-www-form-urlencoded
params:
- id: pair_54b0a24cfe5c4d81ae864d64640e35f2
name: client_id
value: myspringbootapp
description: ""
disabled: false
- id: pair_f6c73c60f3024e42bbacc223615d3be1
name: client_secret
value: Y7xpKQbFalUFTGUGD9XDBcvawvs3zsWZ
description: ""
disabled: false
- id: pair_3698939343424230a63d135857f0acb1
name: username
value: myuser2
description: ""
disabled: false
- id: pair_f8b4c07baea14742a4ebd8f005ff5e92
name: password
value: "1"
description: ""
disabled: false
- id: pair_e49d8dbb324d484bad8747b563ae1615
name: grant_type
value: password
description: ""
disabled: false
headers:
- name: Content-Type
value: application/x-www-form-urlencoded
id: pair_987cf70c521843c8a47e1c51976cce3b
type: text
multiline: false
- name: User-Agent
value: insomnia/11.6.1
id: pair_4c3461e4c95d45bd973dcb4bfd5e519a
- id: pair_b3814f137d494ce389fbe6075385cb71
name: Authorization
value: Bearer
eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJVaDlNMG8wMERKaEdTQzdTRjdmdDlFZWFDNmE4UVdKV0NPXzdENVBKeXFRIn0.eyJleHAiOjE3NjEzNDU2MjAsImlhdCI6MTc2MTM0NTMyMCwianRpIjoib25ydHJvOjJhMGIxOGZiLWE4MjEtMWI3MS1iODQ1LWE5NGY0NWY1ZDA4MSIsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9yZWFsbXMvbXlzcHJpbmdib290YXBwcmVhbG0iLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiOTkyZTI3OTktN2ExOS00ZWY1LTk0ODItYWMzMjljNTNhNDc5IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoibXlzcHJpbmdib290YXBwIiwic2lkIjoiMzFhYmVlNzYtOWJkNy02NWMyLWY0MzMtOTJiZjliODZlMDA1IiwiYWNyIjoiMSIsImFsbG93ZWQtb3JpZ2lucyI6WyJodHRwOi8vbG9jYWxob3N0OjgwODIiXSwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbIm9mZmxpbmVfYWNjZXNzIiwidW1hX2F1dGhvcml6YXRpb24iLCJVU0VSIiwiZGVmYXVsdC1yb2xlcy1teXNwcmluZ2Jvb3RhcHByZWFsbSJdfSwicmVzb3VyY2VfYWNjZXNzIjp7ImFjY291bnQiOnsicm9sZXMiOlsibWFuYWdlLWFjY291bnQiLCJtYW5hZ2UtYWNjb3VudC1saW5rcyIsInZpZXctcHJvZmlsZSJdfX0sInNjb3BlIjoicHJvZmlsZSBlbWFpbCIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJuYW1lIjoidWlvYXpkcSB6c29rZHFzamtkIiwicHJlZmVycmVkX3VzZXJuYW1lIjoibXl1c2VyMiIsImdpdmVuX25hbWUiOiJ1aW9hemRxIiwiZmFtaWx5X25hbWUiOiJ6c29rZHFzamtkIiwiZW1haWwiOiJva0BjYWNhLmNvbSJ9.GBNldYmb4q02AaOwnu1xoLxkF_9qvadLdw1ftjetOsaDNYSe_y_9XhqmStc1ocD11AJUVr0Ix9fqB6TACoNMBS6gegSI6xmmdjT2ABqGilcpMs3OY6edNB8qZ9LP_YFK_z6UWdBBgWmETSfr9zRGVOOfLDMFwadgxCtbeV1AxGLTmfdVLCDPOlZseN3SNKHeFbC_ApYgPR-_vO1Fjl8KE8CucWULoDzgyHBdU1zqlLttlpaOQHl6aHWS0mtb4ymvQWDp7UZd-aukVb41UT5oeVtPS9HC6w2jfd4UBxG1T2TdTfazoXXk1eGgAD7ir6QyoB2Pkv9aANiRMMrTlk0C_w
description: ""
disabled: false
settings:
renderRequestBody: true
encodeUrl: true
followRedirects: global
cookies:
send: true
store: true
rebuildPath: true
- url: http://localhost:8082/reponse/delete/5
name: "DELETE resp with ADMIN "
meta:
id: req_e04466dab86345809e01cec179a7e210
created: 1761348162308
modified: 1761348196375
isPrivate: false
description: ""
sortKey: -1761344751155.75
method: DELETE
body:
mimeType: application/json
text: ""
headers:
- name: Content-Type
value: application/json
id: pair_2694b5ff2f964512842dc3fa44ccd3e1
- name: User-Agent
value: insomnia/11.6.1
id: pair_4c3461e4c95d45bd973dcb4bfd5e519a
- id: pair_b3814f137d494ce389fbe6075385cb71
name: Authorization
value: Bearer
eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJVaDlNMG8wMERKaEdTQzdTRjdmdDlFZWFDNmE4UVdKV0NPXzdENVBKeXFRIn0.eyJleHAiOjE3NjEzNDg0ODUsImlhdCI6MTc2MTM0ODE4NSwianRpIjoib25ydHJvOjg4YWY2ZGE0LWYwMzAtMjMyZi0wYzVmLTNjM2E4YzhlNzcwOCIsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9yZWFsbXMvbXlzcHJpbmdib290YXBwcmVhbG0iLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiMmY5YWRhYzQtODU4Ni00NTI4LWE4Y2QtM2I3M2I5NTc0ODBiIiwidHlwIjoiQmVhcmVyIiwiYXpwIjoibXlzcHJpbmdib290YXBwIiwic2lkIjoiM2UyZmRhNzAtY2JiOC1jODZjLTc1YjYtMjQxMzY5YjU1Njg2IiwiYWNyIjoiMSIsImFsbG93ZWQtb3JpZ2lucyI6WyJodHRwOi8vbG9jYWxob3N0OjgwODIiXSwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbIm9mZmxpbmVfYWNjZXNzIiwidW1hX2F1dGhvcml6YXRpb24iLCJBRE1JTiIsImRlZmF1bHQtcm9sZXMtbXlzcHJpbmdib290YXBwcmVhbG0iXX0sInJlc291cmNlX2FjY2VzcyI6eyJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6InByb2ZpbGUgZW1haWwiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwibmFtZSI6IlRpYm8gUm9jaGFzIiwicHJlZmVycmVkX3VzZXJuYW1lIjoibXl1c2VyIiwiZ2l2ZW5fbmFtZSI6IlRpYm8iLCJmYW1pbHlfbmFtZSI6IlJvY2hhcyIsImVtYWlsIjoidGlib0BjYWNhLmNvbSJ9.I4qJZegiHsGn1JLbZMUF6waDq387tCXpOVWuaf4B-emczDw53cfVLGAHefbPmqYSrENqRJwpI-BrWdFxgNO8ELLMfrEKw_dyYbtfM_GJLcxo4zlvaoldZ2RhIN4muJB52zeKPYuBg34KwrlDR49HYvqGkrhNz9Ve8Jl4sbig4T8U53vhveLu0qqpC58RoC-5oXboq8qxVllGbk9mBUDzzU6DpzhyZOp8ywvf-qHs2JJW5svG4en6O2uK4Hpu4Nm_Mr6_ReI5jOJ-XK8C4eCZFjtPOo16x5lA07k4UVRBxu7W1ccMOp_N56pkmwftaOt40EXezXgmEBxmwxCWwzyJhA
description: ""
disabled: false
settings:
renderRequestBody: true
encodeUrl: true
followRedirects: global
cookies:
send: true
store: true
rebuildPath: true
- url: http://localhost:8082/reponse/removeChoix/1
name: "DELETE resp choix with ADMIN "
meta:
id: req_16e00e9051c84902a69a7822a49b8bfc
created: 1761348252746
modified: 1761348405701
isPrivate: false
description: ""
sortKey: -1761344744993.875
method: PUT
body:
mimeType: application/json
text: |-
{
"choix": "OptionA"
}
headers:
- name: Content-Type
value: application/json
id: pair_2694b5ff2f964512842dc3fa44ccd3e1
- name: User-Agent
value: insomnia/11.6.1
id: pair_4c3461e4c95d45bd973dcb4bfd5e519a
- id: pair_b3814f137d494ce389fbe6075385cb71
name: Authorization
value: Bearer
eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJVaDlNMG8wMERKaEdTQzdTRjdmdDlFZWFDNmE4UVdKV0NPXzdENVBKeXFRIn0.eyJleHAiOjE3NjEzNDg1OTIsImlhdCI6MTc2MTM0ODI5MiwianRpIjoib25ydHJvOjQwYjU0YTViLWRkMmItZTNlYy0zNDA3LWU5ODAwNWE5YThjMSIsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9yZWFsbXMvbXlzcHJpbmdib290YXBwcmVhbG0iLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiMmY5YWRhYzQtODU4Ni00NTI4LWE4Y2QtM2I3M2I5NTc0ODBiIiwidHlwIjoiQmVhcmVyIiwiYXpwIjoibXlzcHJpbmdib290YXBwIiwic2lkIjoiNjg0MjQ3YzUtZDAxYy0yY2Y3LTI0NTYtYWQ3MTgyNTExZWQ4IiwiYWNyIjoiMSIsImFsbG93ZWQtb3JpZ2lucyI6WyJodHRwOi8vbG9jYWxob3N0OjgwODIiXSwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbIm9mZmxpbmVfYWNjZXNzIiwidW1hX2F1dGhvcml6YXRpb24iLCJBRE1JTiIsImRlZmF1bHQtcm9sZXMtbXlzcHJpbmdib290YXBwcmVhbG0iXX0sInJlc291cmNlX2FjY2VzcyI6eyJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6InByb2ZpbGUgZW1haWwiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwibmFtZSI6IlRpYm8gUm9jaGFzIiwicHJlZmVycmVkX3VzZXJuYW1lIjoibXl1c2VyIiwiZ2l2ZW5fbmFtZSI6IlRpYm8iLCJmYW1pbHlfbmFtZSI6IlJvY2hhcyIsImVtYWlsIjoidGlib0BjYWNhLmNvbSJ9.aUvRWi5eYa0AmrLeTVKVHRA_oc0qPsHwsXZIQMhxWea8CEv3ScXi_BNi_H5U-3D_wAdGjOXz8iWS4WS2TtYiCjOwNhCmwVfheN36X-ub_h3PpmCn-SH68V7f-761BMmXk4Uao91CyQ-kXdhDJqde3qcmBsLjwx3ccuzmF9cMwUpoUVkCnWxfJEIhR-MGvjxxtku_EZZxce3CLFsxXmNYi8oa-BjMYh5GG3GQg2MIuivDIF-gfZFxjYZRV4icwybDTZ0jQht6aVopnoapnVh7kkggvjafsfmy0EZ34dkV5VsQGOOo-L6d4WRo9JbkO1e2ZiphMjCtU_W_H0eqbLqRsw
description: ""
disabled: false
settings:
renderRequestBody: true
encodeUrl: true
followRedirects: global
cookies:
send: true
store: true
rebuildPath: true
- name: QUIZZ
meta:
id: fld_7cc2d773f5a942ac98e9614bafc67a43
created: 1761348455968
modified: 1761348514804
sortKey: -1761344725037.875
description: ""
children:
- url: http://localhost:8082/quizz/create/1
name: "CREATE quizz with ADMIN "
meta:
id: req_e954bc2df607411a889380466d7889f0
created: 1761348544027
modified: 1761348778718
isPrivate: false
description: ""
sortKey: -1761348548595
method: POST
body:
mimeType: application/json
text: "{}"
headers:
- name: Content-Type
value: application/json
id: pair_2694b5ff2f964512842dc3fa44ccd3e1
- name: User-Agent
value: insomnia/11.6.1
id: pair_4c3461e4c95d45bd973dcb4bfd5e519a
- id: pair_b3814f137d494ce389fbe6075385cb71
name: Authorization
value: Bearer
eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJVaDlNMG8wMERKaEdTQzdTRjdmdDlFZWFDNmE4UVdKV0NPXzdENVBKeXFRIn0.eyJleHAiOjE3NjEzNDg4NzksImlhdCI6MTc2MTM0ODU3OSwianRpIjoib25ydHJvOmJiYmQyM2QwLTY2ZTctMWY0NS1iNTFiLTBiZGFjNzQzZmZiMyIsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9yZWFsbXMvbXlzcHJpbmdib290YXBwcmVhbG0iLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiMmY5YWRhYzQtODU4Ni00NTI4LWE4Y2QtM2I3M2I5NTc0ODBiIiwidHlwIjoiQmVhcmVyIiwiYXpwIjoibXlzcHJpbmdib290YXBwIiwic2lkIjoiN2FjZmE3YWItNTk4ZC01ZmVlLTU0MzktYzMyNDYyYzFkM2JjIiwiYWNyIjoiMSIsImFsbG93ZWQtb3JpZ2lucyI6WyJodHRwOi8vbG9jYWxob3N0OjgwODIiXSwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbIm9mZmxpbmVfYWNjZXNzIiwidW1hX2F1dGhvcml6YXRpb24iLCJBRE1JTiIsImRlZmF1bHQtcm9sZXMtbXlzcHJpbmdib290YXBwcmVhbG0iXX0sInJlc291cmNlX2FjY2VzcyI6eyJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6InByb2ZpbGUgZW1haWwiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwibmFtZSI6IlRpYm8gUm9jaGFzIiwicHJlZmVycmVkX3VzZXJuYW1lIjoibXl1c2VyIiwiZ2l2ZW5fbmFtZSI6IlRpYm8iLCJmYW1pbHlfbmFtZSI6IlJvY2hhcyIsImVtYWlsIjoidGlib0BjYWNhLmNvbSJ9.TrxycBI76TRjSNjA7kwDNycyKjmNwhjfMnQ2xOi0hVvBqpQN-nIH6mvm3hv6FwoTCVZz9lwwS5kpn83Z4FoYZVY5oKGYsccNR77tg42Rahn1UXOuQuCs4v9W0oqClQa5PtI8loQXO9d5P3mc8uuUvO2vClnGRrky48DqGDSis30fXPY-c26TIZvIRyi_PWPSOK2i2k9w7fkWPodkkGxdaRm4Sc45hNXCA9FT8xRJhzfxJ21ynOovx2Z9y8lILqV5Q4NqjMOTlzyVwkj6vS3veXIJkHAAk8LPdHJKoPrrqQzXXsb3ZIgTl8DyF2cYcJ58vOOle91UoGuqWi1U-pJSnw
description: ""
disabled: false
settings:
renderRequestBody: true
encodeUrl: true
followRedirects: global
cookies:
send: true
store: true
rebuildPath: true
- url: http://localhost:8082/quizz/getAll
name: Get all quizz from USER
meta:
id: req_f1529608fc064c4f83df2717cefb01ef
created: 1761348670144
modified: 1761348786170
isPrivate: false
description: ""
sortKey: -1761348548495
method: GET
body:
mimeType: application/x-www-form-urlencoded
params:
- id: pair_54b0a24cfe5c4d81ae864d64640e35f2
name: client_id
value: myspringbootapp
description: ""
disabled: false
- id: pair_f6c73c60f3024e42bbacc223615d3be1
name: client_secret
value: Y7xpKQbFalUFTGUGD9XDBcvawvs3zsWZ
description: ""
disabled: false
- id: pair_3698939343424230a63d135857f0acb1
name: username
value: myuser2
description: ""
disabled: false
- id: pair_f8b4c07baea14742a4ebd8f005ff5e92
name: password
value: "1"
description: ""
disabled: false
- id: pair_e49d8dbb324d484bad8747b563ae1615
name: grant_type
value: password
description: ""
disabled: false
headers:
- name: Content-Type
value: application/x-www-form-urlencoded
id: pair_987cf70c521843c8a47e1c51976cce3b
type: text
multiline: false
- name: User-Agent
value: insomnia/11.6.1
id: pair_4c3461e4c95d45bd973dcb4bfd5e519a
- id: pair_b3814f137d494ce389fbe6075385cb71
name: Authorization
value: Bearer
eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJVaDlNMG8wMERKaEdTQzdTRjdmdDlFZWFDNmE4UVdKV0NPXzdENVBKeXFRIn0.eyJleHAiOjE3NjEzNDg4NzksImlhdCI6MTc2MTM0ODU3OSwianRpIjoib25ydHJvOmJiYmQyM2QwLTY2ZTctMWY0NS1iNTFiLTBiZGFjNzQzZmZiMyIsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9yZWFsbXMvbXlzcHJpbmdib290YXBwcmVhbG0iLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiMmY5YWRhYzQtODU4Ni00NTI4LWE4Y2QtM2I3M2I5NTc0ODBiIiwidHlwIjoiQmVhcmVyIiwiYXpwIjoibXlzcHJpbmdib290YXBwIiwic2lkIjoiN2FjZmE3YWItNTk4ZC01ZmVlLTU0MzktYzMyNDYyYzFkM2JjIiwiYWNyIjoiMSIsImFsbG93ZWQtb3JpZ2lucyI6WyJodHRwOi8vbG9jYWxob3N0OjgwODIiXSwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbIm9mZmxpbmVfYWNjZXNzIiwidW1hX2F1dGhvcml6YXRpb24iLCJBRE1JTiIsImRlZmF1bHQtcm9sZXMtbXlzcHJpbmdib290YXBwcmVhbG0iXX0sInJlc291cmNlX2FjY2VzcyI6eyJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6InByb2ZpbGUgZW1haWwiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwibmFtZSI6IlRpYm8gUm9jaGFzIiwicHJlZmVycmVkX3VzZXJuYW1lIjoibXl1c2VyIiwiZ2l2ZW5fbmFtZSI6IlRpYm8iLCJmYW1pbHlfbmFtZSI6IlJvY2hhcyIsImVtYWlsIjoidGlib0BjYWNhLmNvbSJ9.TrxycBI76TRjSNjA7kwDNycyKjmNwhjfMnQ2xOi0hVvBqpQN-nIH6mvm3hv6FwoTCVZz9lwwS5kpn83Z4FoYZVY5oKGYsccNR77tg42Rahn1UXOuQuCs4v9W0oqClQa5PtI8loQXO9d5P3mc8uuUvO2vClnGRrky48DqGDSis30fXPY-c26TIZvIRyi_PWPSOK2i2k9w7fkWPodkkGxdaRm4Sc45hNXCA9FT8xRJhzfxJ21ynOovx2Z9y8lILqV5Q4NqjMOTlzyVwkj6vS3veXIJkHAAk8LPdHJKoPrrqQzXXsb3ZIgTl8DyF2cYcJ58vOOle91UoGuqWi1U-pJSnw
description: ""
disabled: false
settings:
renderRequestBody: true
encodeUrl: true
followRedirects: global
cookies:
send: true
store: true
rebuildPath: true
- name: QUESTION
meta:
id: fld_c6cc9e699561490db8dce6d93e60a0cd
created: 1761348479799
modified: 1761348510649
sortKey: -1761344727350.4062
description: ""
cookieJar:
name: Default Jar
meta:
id: jar_068e06f12cad1a0f9f00592ae145d89f7e23f621
created: 1759266691097
modified: 1761348288035
cookies:
- key: JSESSIONID
value: 43CC5321D4DE83F58DA69D80E2AC45A1
domain: localhost
path: /
httpOnly: true
hostOnly: true
creation: 2025-10-22T19:54:48.589Z
lastAccessed: 2025-10-24T23:24:48.035Z
id: eeeea037-2a2e-4b1b-badb-22b5c98f4519
environments:
name: Base Environment
meta:
id: env_068e06f12cad1a0f9f00592ae145d89f7e23f621
created: 1754408137751
modified: 1759266691083
isPrivate: false

139
README.md
View File

@@ -1,60 +1,95 @@
# TP1 et TP2_servlet
# TP TAA
## Demarrge
Optionnel : Reset la base de donné : ```rm -rd data/*```
## TP3 - TP4
lancer la base de donné : ```.\run-hsqldb-server.sh``` ou ```.\run-hsqldb-server.bat```
### Nous avons maintenant deux rôles :
run Maven : ```compile jetty:run``` ou ```mvn clean compile jetty:run```
- ADMIN : correspond à lenseignant
## Graph metier
- USER : correspond à létudiant
```mermaid
classDiagram
Utilisateur "*" -- "*" Session
Session "*" -- "*" Quizz
Quizz "1" -- "1..*" Question
Utilisateur "1" -- "*" Quizz
Question "1" -- "1" Reponse
Reponse <|-- ReponseCourte
Reponse <|-- Choix
Pour Keycloak, il faudrait normalement créer les utilisateurs via OAuth2. Cependant, pour ce TP, nous avons utilisé directement la base de données (BDD) pour créer les utilisateurs.
class Utilisateur {
-id : int
-name : String
-sessions : List&lt;Session&gt;
-email : String
-password : String
-quizzs : List&lt;Quizz&gt;
}
class Session{
-id : int
-codePIN : int
-quizzs : List&lt;Quizz&gt;
-utilisateurs : List&lt;Utilisateur&gt;
-theme : String
}
class Quizz{
-sessions: List&lt;Session&gt;
-id : int
-createur : Utilisateur
-quizz : Quizz
}
class Reponse{
-id : int
-question: Question
-reponses : ArrayList&lt;String&gt;
}
class Choix{
-choix : ArrayList&lt;String&gt;
}
class ReponseCourte{
}
class Question{
-id : int
-enonce : String
-reponse : Reponse
}
```
### Remarques sur les entités
Pour les classes Quizz, Question et Utilisateur, nous avons testé que tout fonctionne, mais elles sont liées à Utilisateur. Cela na pas beaucoup de sens avec les rôles USER de Keycloak et ce nest pas lobjectif principal du TP.
### Tests avec Insomnia
Pour simplifier et se concentrer sur les fonctionnalités principales, nous avons testé les classes Session et Reponse directement via Insomnia.
### Example de token admin et user dans OAuth2
- Site web de décodage:
https://www.jwt.io/
- Admin
`eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJVaDlNMG8wMERKaEdTQzdTRjdmdDlFZWFDNmE4UVdKV0NPXzdENVBKeXFRIn0.eyJleHAiOjE3NjEzNDg4NzksImlhdCI6MTc2MTM0ODU3OSwianRpIjoib25ydHJvOmJiYmQyM2QwLTY2ZTctMWY0NS1iNTFiLTBiZGFjNzQzZmZiMyIsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9yZWFsbXMvbXlzcHJpbmdib290YXBwcmVhbG0iLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiMmY5YWRhYzQtODU4Ni00NTI4LWE4Y2QtM2I3M2I5NTc0ODBiIiwidHlwIjoiQmVhcmVyIiwiYXpwIjoibXlzcHJpbmdib290YXBwIiwic2lkIjoiN2FjZmE3YWItNTk4ZC01ZmVlLTU0MzktYzMyNDYyYzFkM2JjIiwiYWNyIjoiMSIsImFsbG93ZWQtb3JpZ2lucyI6WyJodHRwOi8vbG9jYWxob3N0OjgwODIiXSwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbIm9mZmxpbmVfYWNjZXNzIiwidW1hX2F1dGhvcml6YXRpb24iLCJBRE1JTiIsImRlZmF1bHQtcm9sZXMtbXlzcHJpbmdib290YXBwcmVhbG0iXX0sInJlc291cmNlX2FjY2VzcyI6eyJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6InByb2ZpbGUgZW1haWwiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwibmFtZSI6IlRpYm8gUm9jaGFzIiwicHJlZmVycmVkX3VzZXJuYW1lIjoibXl1c2VyIiwiZ2l2ZW5fbmFtZSI6IlRpYm8iLCJmYW1pbHlfbmFtZSI6IlJvY2hhcyIsImVtYWlsIjoidGlib0BjYWNhLmNvbSJ9.TrxycBI76TRjSNjA7kwDNycyKjmNwhjfMnQ2xOi0hVvBqpQN-nIH6mvm3hv6FwoTCVZz9lwwS5kpn83Z4FoYZVY5oKGYsccNR77tg42Rahn1UXOuQuCs4v9W0oqClQa5PtI8loQXO9d5P3mc8uuUvO2vClnGRrky48DqGDSis30fXPY-c26TIZvIRyi_PWPSOK2i2k9w7fkWPodkkGxdaRm4Sc45hNXCA9FT8xRJhzfxJ21ynOovx2Z9y8lILqV5Q4NqjMOTlzyVwkj6vS3veXIJkHAAk8LPdHJKoPrrqQzXXsb3ZIgTl8DyF2cYcJ58vOOle91UoGuqWi1U-pJSnw`
- User
`eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJVaDlNMG8wMERKaEdTQzdTRjdmdDlFZWFDNmE4UVdKV0NPXzdENVBKeXFRIn0.eyJleHAiOjE3NjEzNDU2MjAsImlhdCI6MTc2MTM0NTMyMCwianRpIjoib25ydHJvOjJhMGIxOGZiLWE4MjEtMWI3MS1iODQ1LWE5NGY0NWY1ZDA4MSIsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9yZWFsbXMvbXlzcHJpbmdib290YXBwcmVhbG0iLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiOTkyZTI3OTktN2ExOS00ZWY1LTk0ODItYWMzMjljNTNhNDc5IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoibXlzcHJpbmdib290YXBwIiwic2lkIjoiMzFhYmVlNzYtOWJkNy02NWMyLWY0MzMtOTJiZjliODZlMDA1IiwiYWNyIjoiMSIsImFsbG93ZWQtb3JpZ2lucyI6WyJodHRwOi8vbG9jYWxob3N0OjgwODIiXSwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbIm9mZmxpbmVfYWNjZXNzIiwidW1hX2F1dGhvcml6YXRpb24iLCJVU0VSIiwiZGVmYXVsdC1yb2xlcy1teXNwcmluZ2Jvb3RhcHByZWFsbSJdfSwicmVzb3VyY2VfYWNjZXNzIjp7ImFjY291bnQiOnsicm9sZXMiOlsibWFuYWdlLWFjY291bnQiLCJtYW5hZ2UtYWNjb3VudC1saW5rcyIsInZpZXctcHJvZmlsZSJdfX0sInNjb3BlIjoicHJvZmlsZSBlbWFpbCIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJuYW1lIjoidWlvYXpkcSB6c29rZHFzamtkIiwicHJlZmVycmVkX3VzZXJuYW1lIjoibXl1c2VyMiIsImdpdmVuX25hbWUiOiJ1aW9hemRxIiwiZmFtaWx5X25hbWUiOiJ6c29rZHFzamtkIiwiZW1haWwiOiJva0BjYWNhLmNvbSJ9.GBNldYmb4q02AaOwnu1xoLxkF_9qvadLdw1ftjetOsaDNYSe_y_9XhqmStc1ocD11AJUVr0Ix9fqB6TACoNMBS6gegSI6xmmdjT2ABqGilcpMs3OY6edNB8qZ9LP_YFK_z6UWdBBgWmETSfr9zRGVOOfLDMFwadgxCtbeV1AxGLTmfdVLCDPOlZseN3SNKHeFbC_ApYgPR-_vO1Fjl8KE8CucWULoDzgyHBdU1zqlLttlpaOQHl6aHWS0mtb4ymvQWDp7UZd-aukVb41UT5oeVtPS9HC6w2jfd4UBxG1T2TdTfazoXXk1eGgAD7ir6QyoB2Pkv9aANiRMMrTlk0C_w`
#### Utilisateur Resource
| Methode | URL | Description |
|---------|----------------------------------------------------|----------------------------------------------------------------------------------------------|
| POST | `/utilisateur/create` | Créer un utilisateur (avec aussi l'id keyloak) ("name","email et "password" dans body json) |
| GET | `/utilisateur/getAll` | retourn tout les utilisateurs (id, name, email) |
| GET | `/utilisateur/getSessions/{session_id}` | Retourne les sessions de l'utilisateur |
| PUT | `/utilisateur/addSession/{user_id}/{session_id}` | rejoint une session à la liste de l'utilisateur |
| PUT | `/utilisateur/removeSession/{user_id}/{session_id}`| quite une session à la liste de l'utilisateur |
| PUT | `/utilisateur/update/{user_id}` | met à jour les info de l'utilisateur ("name","email et "password" dans body json) |
| DELETE | `/utilisteur/delete/{user_id}/delete` | Supprime l'utilisateur |
#### Session Resource
| Methode | URL | Description |
|---------|-------------------------------------------------|---------------------------------------------------------------|
| POST | `/session/create` | créer une nouvelle session ("theme":String dans body json) |
| GET | `/session/getAll` | Retourne la liste des sessions |
| PUT | `/session/addQuizz/{session_id}/{quizz_id}` | ajoute un quizz à la session |
| PUT | `/session/removeQuizz/{session_id}/{quizz_id}` | retire un quizz à la session |
| PUT | `/session/update/{session_id}` | change le thème ("theme":String dans body json) |
| PUT | `/session/join/{session_id}` | l'utilisateur courant (keycloak) rejout la session |
| PUT | `/session/leave/{session_id}` | l'utilisateur courant (keycloak) quitte la session |
| DELETE | `/session/delete/{session_id}` | Supprime la session |
#### ReponseController
| Methode | URL | Description |
|---------|-------------------------------------------------|---------------------------------------------------------------------------|
| POST | `/reponse/create/choix` | créer un objet réponse de type choix multiple |
| POST | `/reponse/create/courte` | créer un objet réponse de type réponse courte |
| GET | `/reponse/getAll` | affiche l'id et les réponse correct de chaque réponse |
| GET | `/reponse/get/{id_reponse}` | affiche toutes les info d'un réponse |
| DELETE | `/reponse/delete/{id_reponse}` | supprime un objet réponse |
| PUT | `/reponse/removeReponse/{id_reponse} ` | retire une réponse correcte ("reponse" dans body json) |
| PUT | `/reponse/addReponse/{id_reponse} ` | ajoute une réponse correcte ("reponse" dans body json) |
| PUT | `/reponse/addChoix/{id_reponse} ` | ajoute un choix (réponse choix uniquement) ("choix":String dans body json)|
| PUT | `/reponse/removeChoix/{id_reponse}` | retire un choix (réponse choix uniquement) ("choix":String dans body json)|
#### Quizz Resource
| Methode | URL | Description |
|---------|-------------------------------------------------|----------------------------------------------------|
| POST | `/quizz/create/{utilisateur_id}` | céer un nouveau quizz par associé à un utilisateur |
| GET | `/quizz/getQuestions/{quizz_id}` | Retourne la list des questions d'un quizz |
| GET | `/quizz/getAll` | Retourne toute la liste du quizz |
| PUT | `/quizz/add_question/{quizz_id}/{question_id}` | Ajoute une nouvelle question au quizz |
| PUT | `/quizz/removeQuestion/{quizz_id}/{question_id}`| Ajoute une nouvelle question au quizz |
| DELETE | `/quizz/delete/{quizz_id}` | Suprrime le quizz |
#### Question Resource
| Methode | URL | Description |
|----------|----------------------------------------------------|-----------------------------------------------------------------------|
| GET | `/question` | Retourne toute la liste du question |
| POST | `/question/create` | Créer une question ( "enonce":String dans body Json) |
| PUT | `/question/update/{question_id}` | Change l'énoncé de la question ("enonce":String dans body JSON) |
| GET | `/question/get/{question_id}` | donne toutes les infos de la question sous forme de String |
| GET | `/question/getAll` | donne l'id et l'énoncé de toutes les questions sous forme de String |
| GET | `/question/getReponse/{question_id}` | donne toutes les réponse correct sous forme de String |
| PUT | `/question/setReponse/{question_id}/{reponse_id}` | met à null l'objet réponse à la question |
| PUT | `/question/setReponse/{question_id}/{reponse_id}` | Associe un objet réponse à la question |
| PUT | `/question/delet/{question_id}` | supprime la question |
## Auteurs
- Tuan Minh VU
- Thibaut ROCHAS

Binary file not shown.

241
pom.xml Normal file → Executable file
View File

@@ -1,102 +1,209 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>test</groupId>
<packaging>war</packaging>
<artifactId>testjpa</artifactId>
<version>0.0.1-SNAPSHOT</version>
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-sample-data-jpa</artifactId>
<version>3.1.2</version>
<name>Spring Boot Data JPA Sample</name>
<description>Spring Boot Data JPA Sample</description>
<url>http://projects.spring.io/spring-boot/</url>
<organization>
<name>Pivotal Software, Inc.</name>
<url>http://www.spring.io</url>
</organization>
<properties>
<main.basedir>${basedir}/../..</main.basedir>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<org.mapstruct.version>1.6.3</org.mapstruct.version>
</properties>
</properties>
<dependencies>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.3</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.6.3</version>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>6.2.7.Final</version>
</dependency>
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>5.0.0</version>
<scope>provided</scope>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.30</version>
</dependency>
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<version>2.7.2</version>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.1.0</version>
</dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<version>2.7.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.validation/validation-api -->
<dependency>
<groupId>jakarta.validation</groupId>
<artifactId>jakarta.validation-api</artifactId>
<version>3.1.1</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<!-- <version>1.4.192</version> -->
<version>2.2.224</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.42</version>
<scope>provided</scope>
</dependency>
</dependencies>
</dependencies>
<build>
<plugins>
<plugin>
<!-- https://mvnrepository.com/artifact/org.eclipse.jetty/jetty-maven-plugin -->
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>11.0.16</version>
<configuration>
<webApp>
<contextPath>/</contextPath>
</webApp>
<httpConnector>
<port>8080</port>
</httpConnector>
</configuration>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>3.1.2</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.4.0</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<artifactId>maven-eclipse-plugin</artifactId>
<configuration>
<source>11</source> <!-- depending on your project -->
<target>11</target> <!-- depending on your project -->
<useProjectReferences>false</useProjectReferences>
<additionalConfig>
<file>
<name>.settings/org.eclipse.jdt.ui.prefs</name>
<location>${main.basedir}/eclipse/org.eclipse.jdt.ui.prefs</location>
</file>
<file>
<name>.settings/org.eclipse.jdt.core.prefs</name>
<location>${main.basedir}/eclipse/org.eclipse.jdt.core.prefs</location>
</file>
</additionalConfig>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.42</version>
</path>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.6.3</version>
</path>
<!-- other annotation processors -->
</annotationProcessorPaths>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<includes>
<include>**/*Tests.java</include>
</includes>
<excludes>
<exclude>**/Abstract*.java</exclude>
</excludes>
<systemPropertyVariables>
<java.security.egd>file:/dev/./urandom</java.security.egd>
<java.awt.headless>true</java.awt.headless>
</systemPropertyVariables>
</configuration>
</plugin>
</plugins>
<pluginManagement>
<plugins>
<!--This plugin's configuration is used to store Eclipse m2e settings
only. It has no influence on the Maven build itself. -->
<plugin>
<groupId>org.eclipse.m2e</groupId>
<artifactId>lifecycle-mapping</artifactId>
<version>1.0.0</version>
<configuration>
<lifecycleMappingMetadata>
<pluginExecutions>
<pluginExecution>
<pluginExecutionFilter>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-maven-plugin
</artifactId>
<versionRange>
[3.1.2,)
</versionRange>
<goals>
<goal>build-info</goal>
</goals>
</pluginExecutionFilter>
<action>
<ignore/>
</action>
</pluginExecution>
</pluginExecutions>
</lifecycleMappingMetadata>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
<pluginRepositories>
<pluginRepository>
<id>spring-releases</id>
<name>Spring Releases</name>
<url>http://repo.spring.io/release</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</project>

View File

@@ -1,3 +0,0 @@
mkdir data
cd data
java -cp ..\hsqldb-2.7.2.jar org.hsqldb.Server

View File

@@ -1,4 +0,0 @@
mvn dependency:copy-dependencies
mkdir data 2> /dev/null
cd data
java -cp ../target/dependency/hsqldb-2.7.2.jar org.hsqldb.Server

View File

@@ -1,2 +0,0 @@
java -cp hsqldb-2.7.2.jar org.hsqldb.util.DatabaseManagerSwing --driver org.hsqldb.jdbcDriver --url jdbc:hsqldb:hsql://localhost/ --user SA

View File

@@ -1,2 +0,0 @@
#mvn dependency:copy-dependencies
java -cp hsqldb-2.7.2.jar org.hsqldb.util.DatabaseManagerSwing --driver org.hsqldb.jdbcDriver --url jdbc:hsqldb:hsql://localhost/ --user SA

View File

@@ -1,63 +0,0 @@
package DAO;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityTransaction;
import jpa.EntityManagerHelper;
import java.io.Serializable;
import java.util.List;
public abstract class AbstractJpaDao<K, T extends Serializable> implements IGenericDao<K, T> {
protected EntityManager em;
private Class<T> entityClass;
public AbstractJpaDao() {
this.em = EntityManagerHelper.getEntityManager();
}
//Pour connaitre qu'on travaille avec quelle classe
public void setClass(Class<T> class2){
this.entityClass= class2;
}
public T findOne(K id) {
return em.find(entityClass, id);
}
public List<T> findAll() {
return em.createQuery("select e from " + entityClass.getName() + " as e", entityClass).getResultList();
}
//CRUD
public void create(T entity){
EntityTransaction t = em.getTransaction();
t.begin();
em.persist(entity);
t.commit();
}
public T findById(K id) {
return em.find(entityClass, id);
}
public T update(T entity){
EntityTransaction t = em.getTransaction();
t.begin();
T T_sync = em.merge(entity);
t.commit();
return T_sync;
}
public void delete(T entity){
EntityTransaction t = em.getTransaction();
t.begin();
em.remove(entity);
t.commit();
}
public void deleteById(K id) {
T T_to_be_deleted = em.find(entityClass, id);
em.remove(T_to_be_deleted);
}
}

View File

@@ -1,50 +0,0 @@
package DAO;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;
public class EntityManagerHelper {
private static final EntityManagerFactory emf;
private static final ThreadLocal<EntityManager> threadLocal;
static {
emf = Persistence.createEntityManagerFactory("dev");
threadLocal = new ThreadLocal<EntityManager>();
}
public static EntityManager getEntityManager() {
EntityManager em = threadLocal.get();
if (em == null) {
em = emf.createEntityManager();
threadLocal.set(em);
}
return em;
}
public static void closeEntityManager() {
EntityManager em = threadLocal.get();
if (em != null) {
em.close();
threadLocal.set(null);
}
}
public static void closeEntityManagerFactory() {
emf.close();
}
public static void beginTransaction() {
getEntityManager().getTransaction().begin();
}
public static void rollback() {
getEntityManager().getTransaction().rollback();
}
public static void commit() {
getEntityManager().getTransaction().commit();
}
}

View File

@@ -1,14 +0,0 @@
package DAO;
import java.io.Serializable;
import java.util.List;
public interface IGenericDao<K, T extends Serializable> {
void create(final T entity);
T findById(final K id);
T update(final T entity);
void delete(final T entity);
void deleteById(final K id);
List<T> findAll();
T findOne(final K id);
}

View File

@@ -1,10 +0,0 @@
package DAO;
import metier.Question;
public class QuestionDAO extends AbstractJpaDao<Integer, Question> {
public QuestionDAO(){
super();
this.setClass(Question.class);
}
}

View File

@@ -1,34 +0,0 @@
package DAO;
import jakarta.persistence.EntityTransaction;
import metier.Question;
import metier.Quizz;
public class QuizzDAO extends AbstractJpaDao<Integer, Quizz> {
public QuizzDAO(){
super();
this.setClass(Quizz.class);
}
public void deleteAllQuiz(){
EntityTransaction et= em.getTransaction();
et.begin();
em.createQuery("delete from Quizz").executeUpdate();
et.commit();
}
public void addQuestion(Quizz quizz, Question question) {
System.out.println("ajout de question dans le quizz");
EntityTransaction t = em.getTransaction();
t.begin();
question.setQuizz(quizz);
quizz.getQuestions().add(question);
em.merge(quizz);
t.commit();
em.refresh(quizz);
}
public void refresh(Quizz quizz) {
em.refresh(quizz);
}
}

View File

@@ -1,24 +0,0 @@
package DAO;
import jakarta.persistence.EntityTransaction;
import metier.Question;
import metier.Reponse;
public class ReponseDAO extends AbstractJpaDao<Integer, Reponse> {
public ReponseDAO(){
super();
this.setClass(Reponse.class);
}
public void addToQuestion(Reponse r, Question q) {
EntityTransaction t = em.getTransaction();
t.begin();
q.setReponse(r);
r.setQuestion(q);
em.merge(r);
t.commit();
em.refresh(q);
}
}

View File

@@ -1,42 +0,0 @@
package DAO;
import jakarta.persistence.EntityTransaction;
import jakarta.persistence.Query;
import metier.Quizz;
import metier.Session;
import java.util.List;
public class SessionDAO extends AbstractJpaDao<Integer, Session> {
public SessionDAO() {
super();
this.setClass(Session.class);
}
public List<Session> findByTheme(String theme){
Query query=em.createQuery("select s from Session s where s.theme=:theme");
query.setParameter("theme",theme);
List<Session> sessions=query.getResultList();
if(sessions.size()>0){
return sessions;
}else{
return null;
}
}
public void refresh(Session session) {
em.refresh(session);
}
public void addQuizz(Quizz q, Session s) {
EntityTransaction t = em.getTransaction();
t.begin();
q.getSessions().add(s);
s.getQuizzs().add(q);
em.merge(s);
t.commit();
}
}

View File

@@ -1,37 +0,0 @@
package DAO;
import jakarta.persistence.EntityTransaction;
import jakarta.persistence.Query;
import metier.Session;
import metier.Utilisateur;
public class UtilisateurDAO extends AbstractJpaDao<Integer, Utilisateur> {
public UtilisateurDAO() {
super();
this.setClass(Utilisateur.class);
}
public Utilisateur findByEmail(String email){
EntityTransaction t=em.getTransaction();
t.begin();
Query query=em.createQuery("select u from Utilisateur u where u.email=:email");
query.setParameter("email",email);
Utilisateur u=(Utilisateur)query.getSingleResult();
t.commit();
return u;
}
public void addToSession(int sessionId, int userId) {
EntityTransaction t = em.getTransaction();
t.begin();
Session s = em.find(Session.class, sessionId);
Utilisateur u = em.find(Utilisateur.class, userId);
//FAUT AJOUTER OWNING SIDE ( Ici u --> s)
u.getSessions().add(s);
//Jsp il faut birectionnelle ou pas?
s.getUtilisateurs().add(u);
em.merge(u);
t.commit();
}
}

View File

@@ -1,11 +0,0 @@
package DTO;
import lombok.Data;
import java.util.List;
@Data
public class QuestionDTO {
private int id;
private String question;
private List<String> reponses_string;
}

View File

@@ -1,12 +0,0 @@
package DTO;
import lombok.Data;
import java.util.List;
@Data
public class QuizzDTO {
private int id;
private Integer sessionId;
private Integer utilisateurId;
private List<Integer> questionsId;
}

View File

@@ -1,14 +0,0 @@
package DTO;
import lombok.Data;
import java.util.List;
@Data
public class SessionDTO {
private String theme;
private int codePIN;
private int id;
private List<Integer> quizzsId;
private List<Integer> utilisateursId;
}

View File

@@ -1,12 +0,0 @@
package DTO;
import lombok.Data;
@Data
public class UtilisateurDTO {
private int id;
private String name;
private String email;
private String password;
}

View File

@@ -1,12 +0,0 @@
package Mapper;
import DTO.QuestionDTO;
import metier.Question;
import org.mapstruct.factory.Mappers;
public interface QuestionMapper {
QuestionMapper INSTANCE = Mappers.getMapper( QuestionMapper.class );
QuestionDTO toDTO(Question question);
Question toEntity(QuestionDTO questionDTO);
}

View File

@@ -1,12 +0,0 @@
package Mapper;
import DTO.QuizzDTO;
import metier.Quizz;
import org.mapstruct.factory.Mappers;
public interface QuizzMapper {
QuizzMapper INSTANCE = Mappers.getMapper( QuizzMapper.class );
QuizzDTO toDTO(Quizz quizz);
Quizz toEntity(QuizzDTO quizzDTO);
}

View File

@@ -1,13 +0,0 @@
package Mapper;
import DTO.SessionDTO;
import metier.Session;
import metier.Utilisateur;
import org.mapstruct.factory.Mappers;
public interface SessionMapper {
SessionMapper INSTANCE = Mappers.getMapper( SessionMapper.class );
SessionDTO toDTO(Utilisateur utilisateur);
Session toEntity(SessionDTO sessionDTO);
}

View File

@@ -1,14 +0,0 @@
package Mapper;
import DTO.UtilisateurDTO;
import metier.Utilisateur;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
@Mapper
public interface UtilisateurMapper {
UtilisateurMapper INSTANCE = Mappers.getMapper(UtilisateurMapper.class);
UtilisateurDTO toDTO(Utilisateur utilisateur);
Utilisateur toEntity(UtilisateurDTO dto);
}

View File

@@ -1,50 +0,0 @@
package jpa;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;
public class EntityManagerHelper {
private static final EntityManagerFactory emf;
private static final ThreadLocal<EntityManager> threadLocal;
static {
emf = Persistence.createEntityManagerFactory("dev");
threadLocal = new ThreadLocal<EntityManager>();
}
public static EntityManager getEntityManager() {
EntityManager em = threadLocal.get();
if (em == null) {
em = emf.createEntityManager();
threadLocal.set(em);
}
return em;
}
public static void closeEntityManager() {
EntityManager em = threadLocal.get();
if (em != null) {
em.close();
threadLocal.set(null);
}
}
public static void closeEntityManagerFactory() {
emf.close();
}
public static void beginTransaction() {
getEntityManager().getTransaction().begin();
}
public static void rollback() {
getEntityManager().getTransaction().rollback();
}
public static void commit() {
getEntityManager().getTransaction().commit();
}
}

View File

@@ -1,150 +0,0 @@
package jpa;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityTransaction;
import jakarta.persistence.criteria.*;
import metier.*;
import java.util.ArrayList;
import java.util.List;
public class JpaTest {
private EntityManager manager;
public JpaTest(EntityManager manager) {
this.manager = manager;
}
/**
* @param args
*/
public static void main(String[] args) {
EntityManager manager = EntityManagerHelper.getEntityManager();
JpaTest test = new JpaTest(manager);
EntityTransaction tx = manager.getTransaction();
tx.begin();
try {
test.create_user_test();
test.create_session_test();
test.create_quizz_test(1,1);
test.list_utilisateur();
test.list_session();
test.list_quizz();
} catch (Exception e) {
e.printStackTrace();
}
tx.commit();
manager.close();
EntityManagerHelper.closeEntityManagerFactory();
System.out.println(".. done");
}
private void create_user_test() {
int numUser = manager.createQuery("SELECT u FROM Utilisateur u", Utilisateur.class).getResultList().size();
if (numUser == 0) {
//Utilisateur
Utilisateur utilisateur1 = new Utilisateur();
utilisateur1.setName("Titi");
utilisateur1.setEmail("titi@email.com");
utilisateur1.setPassword("123456");
Utilisateur utilisateur2 = new Utilisateur();
utilisateur2.setName("Toto");
manager.persist(utilisateur1);
manager.persist(utilisateur2);
}
}
private void create_session_test() {
int numUser = manager.createQuery("SELECT u FROM Session u", Session.class).getResultList().size();
if (numUser == 0) {
//Utilisateur
Session session1 = new Session();
session1.setCodePIN(1703);
session1.setTheme("Inphormatik");
session1.setQuizzs(new ArrayList<>());
List<Utilisateur> ulist = manager.createQuery("select user from Utilisateur user").getResultList();
session1.setUtilisateurs(ulist);
manager.persist(session1);
}
}
private void list_utilisateur() {
CriteriaBuilder criteriaBuilder = manager.getCriteriaBuilder();
CriteriaQuery<Utilisateur> query = criteriaBuilder.createQuery(Utilisateur.class);
Root<Utilisateur> from = query.from(Utilisateur.class);
query.select(from);
List<Utilisateur> result_utilisatuer_list = manager.createQuery(query).getResultList();
for (Utilisateur u : result_utilisatuer_list) {
System.out.println(u.getId() + " " + u.getName() + " " + u.getEmail());
}
}
private void list_session() {
CriteriaBuilder criteriaBuilder = manager.getCriteriaBuilder();
CriteriaQuery<Session> query = criteriaBuilder.createQuery(Session.class);
Root<Session> from = query.from(Session.class);
query.select(from);
List<Session> result_session_list = manager.createQuery(query).getResultList();
for (Session s : result_session_list) {
System.out.println(s.getCodePIN() + " " + s.getTheme());
for (Utilisateur u : s.getUtilisateurs()) {
System.out.println(u.getId() + " " + u.getName() + " " + u.getEmail());
}
}
}
private void create_quizz_test(int userId, int sessionId) {
CriteriaBuilder cb = manager.getCriteriaBuilder();
//GET USER
CriteriaQuery<Utilisateur> cqUser = cb.createQuery(Utilisateur.class);
Root<Utilisateur> userRoot = cqUser.from(Utilisateur.class);
cqUser.select(userRoot).where(cb.equal(userRoot.get("id"), userId));
Utilisateur u1 = manager.createQuery(cqUser).getSingleResult();
//GET SESSION
CriteriaQuery<Session> cqSess = cb.createQuery(Session.class);
Root<Session> sessRoot = cqSess.from(Session.class);
cqSess.select(sessRoot).where(cb.equal(sessRoot.get("id"), sessionId));
Session s1 = manager.createQuery(cqSess).getSingleResult();
List<Session> ls= u1.getSessions();
ls.add(s1);
u1.setSessions(ls);
Quizz quizz1 = new Quizz();
quizz1.setCreateur(u1);
quizz1.getSessions().add(s1);
manager.persist(quizz1);
manager.merge(u1);
manager.persist(s1);
}
private void list_quizz() {
CriteriaBuilder cb = manager.getCriteriaBuilder();
CriteriaQuery<Quizz> cq = cb.createQuery(Quizz.class);
Root<Quizz> from = cq.from(Quizz.class);
List<Integer> sessionIds = new ArrayList<>();
sessionIds.add(1);
//https://www.w3schools.com/SQL/sql_join_inner.asp
//https://stackoverflow.com/questions/15990141/how-to-make-a-criteriabuilder-join-with-a-custom-on-condition
Join<Quizz, Session> sessionJoin = from.join("session", JoinType.INNER);
cq.select(from).where(sessionJoin.get("id").in(sessionIds));
List<Quizz> quizzs = manager.createQuery(cq).getResultList();
for (Quizz q : quizzs) {
System.out.println("Quizz ID: " + q.getId() + ", User: " + q.getCreateur().getName() +
", nb session: " + q.getSessions().size());
}
}
}

View File

@@ -1,28 +0,0 @@
package metier;
import java.util.List;
import jakarta.persistence.Entity;
import jakarta.persistence.PrimaryKeyJoinColumn;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Entity
@Getter
@Setter
@NoArgsConstructor
@PrimaryKeyJoinColumn(name = "Choix_Id")
public class Choix extends Reponse{
List<String> choix;
@Override
public String valHTML(){
String res = "";
for (String val : this.choix) {
res+= val+"<br/>";
}
return res;
}
}

View File

@@ -1,21 +0,0 @@
package metier;
import jakarta.persistence.Entity;
import jakarta.persistence.PrimaryKeyJoinColumn;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Entity
@Getter
@Setter
@NoArgsConstructor
@PrimaryKeyJoinColumn(name = "RC_Id")
public class ReponseCourte extends Reponse{
String value;
@Override
public String valHTML(){
return "TEXT INPUT<br/>";
}
}

View File

@@ -0,0 +1,27 @@
/*
* Copyright 2012-2013 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package sample.data.jpa;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SampleDataJpaApplication {
public static void main(String[] args) throws Exception {
SpringApplication.run(SampleDataJpaApplication.class, args);
}
}

View File

@@ -0,0 +1,41 @@
package sample.data.jpa;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
@EnableWebSecurity
public class WebSecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests(auth -> auth
.requestMatchers("/").permitAll()
.requestMatchers("/index").hasAuthority("USER")
.requestMatchers("/admin").hasAuthority("ADMIN")
.requestMatchers("/session/**").hasAnyAuthority("USER", "ADMIN")
.requestMatchers("/quizz/**").hasAuthority("ADMIN")
.anyRequest().authenticated()
)
.oauth2ResourceServer(oauth2 -> oauth2
.jwt(jwt -> jwt.jwtAuthenticationConverter(jwtToken -> {
Map<String, Collection<String>> realmAccess = jwtToken.getClaim("realm_access");
Collection<String> roles = realmAccess.get("roles");
List<SimpleGrantedAuthority> grantedAuthorities = roles.stream()
.map(role -> new SimpleGrantedAuthority(role.toUpperCase()))
.toList();
return new JwtAuthenticationToken(jwtToken, grantedAuthorities);
}))
);
return http.build();
}
}

View File

@@ -0,0 +1,38 @@
package sample.data.jpa.controller;
import java.security.Principal;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class ViewController {
@GetMapping("/index")
@PreAuthorize("hasRole('USER')")
public ModelAndView index(JwtAuthenticationToken authentication) {
ModelAndView modelAndView = new ModelAndView("index");
authentication.getToken().getClaims().forEach((e, v) -> {
System.err.println(e + ' ' + v);
});
modelAndView.addObject("user", authentication);
return modelAndView;
}
@GetMapping("/")
public ModelAndView main() {
ModelAndView modelAndView = new ModelAndView("indexmain");
return modelAndView;
}
@GetMapping("/admin")
@PreAuthorize("hasRole('ADMIN')")
public ModelAndView admin(Principal principal) {
ModelAndView modelAndView = new ModelAndView("admin");
modelAndView.addObject("user", principal);
return modelAndView;
}
}

View File

@@ -0,0 +1,53 @@
package sample.data.jpa.metier;
import java.util.ArrayList;
import java.util.List;
import jakarta.persistence.Entity;
import jakarta.persistence.PrimaryKeyJoinColumn;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Entity
@Getter
@Setter
@NoArgsConstructor
@PrimaryKeyJoinColumn(name = "Choix_Id")
public class Choix extends Reponse{
List<String> choix = new ArrayList<String>();;
@Override
public String valHTML(){
String res = "";
for (String val : this.choix) {
res+=val+"<br/>";
}
return res;
}
public String prettyPrinter(int tab){
String tabStr = "";
for(int i =0; i<tab;i++)tabStr+="\t";
String res = "";
res += tabStr+"choix : [";
for (int i = 0; i<this.choix.size(); i++) {
res += this.choix.get(i);
if(i<this.choix.size()-1) res+= ", ";
}
res += "]\n";
res += tabStr +"reponses : [";
for (int i = 0; i<this.reponses.size(); i++) {
res += this.reponses.get(i);
if(i<this.reponses.size()-1) res+= ", ";
}
res += "]\n";
return res;
}
}

View File

@@ -1,4 +1,4 @@
package metier;
package sample.data.jpa.metier;
import jakarta.persistence.*;
import lombok.Getter;
@@ -24,4 +24,16 @@ public class Question implements Serializable {
@ManyToOne
@JoinColumn(name="id_quizz")
private Quizz quizz;
public String prettyPrinter(int tab){
String res = "";
String tabStr = "";
for(int i =0; i<tab;i++)tabStr+="\t";
res += tabStr + "id : " + this.getId() + "\n";
res += tabStr + "ennonce : \"" + this.getEnonce() + "\"\n";
res += this.getReponse().prettyPrinter(tab);;
return res;
}
}

View File

@@ -1,4 +1,4 @@
package metier;
package sample.data.jpa.metier;
import jakarta.persistence.*;
import lombok.Getter;
@@ -25,10 +25,6 @@ public class Quizz implements Serializable {
@JoinColumn(name="id_utilisateur")
private Utilisateur createur;
@OneToMany(mappedBy = "quizz", cascade = CascadeType.ALL, orphanRemoval = true)
@OneToMany(mappedBy = "quizz")
private List<Question> questions=new ArrayList<Question>();
public void addQuestion(Question question) {
this.questions.add(question);
}
}

View File

@@ -1,6 +1,7 @@
package metier;
package sample.data.jpa.metier;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import jakarta.persistence.*;
@@ -22,9 +23,23 @@ public abstract class Reponse implements Serializable {
@OneToOne
private Question question;
public List<String> reponses;
public List<String> reponses = new ArrayList<String>();
public String valHTML(){
return "";
}
public String prettyPrinter(int tab){
return "";
}
public String toString(){
String res = "[";
for (int i = 0; i<this.reponses.size(); i++) {
res += this.reponses.get(i);
if(i<this.reponses.size()-1) res+= ", ";
}
res += "]";
return res;
}
}

View File

@@ -0,0 +1,37 @@
package sample.data.jpa.metier;
import jakarta.persistence.Entity;
import jakarta.persistence.PrimaryKeyJoinColumn;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Entity
@Getter
@Setter
@NoArgsConstructor
@PrimaryKeyJoinColumn(name = "RC_Id")
public class ReponseCourte extends Reponse{
@Override
public String valHTML(){
return "INPUT";
}
public String prettyPrinter(int tab){
String tabStr = "";
for(int i =0; i<tab;i++)tabStr+="\t";
String res = tabStr+"INPUT\n";
res += tabStr +"reponses : [";
for (int i = 0; i<this.reponses.size(); i++) {
res += this.reponses.get(i);
if(i<this.reponses.size()-1) res+= ", ";
}
res += "]\n";
return res;
}
}

View File

@@ -1,4 +1,4 @@
package metier;
package sample.data.jpa.metier;
import java.io.Serializable;
import java.util.ArrayList;
@@ -20,7 +20,7 @@ public class Session implements Serializable {
@Column(unique=true)
private int codePIN;
@ManyToMany(mappedBy="sessions")
private List<Quizz> quizzs = new ArrayList<>();

View File

@@ -1,4 +1,4 @@
package metier;
package sample.data.jpa.metier;
import jakarta.persistence.*;
import lombok.*;
@@ -16,6 +16,10 @@ public class Utilisateur implements Serializable {
private int id;
private String name;
//Pour génénrer un sub diff pour chaque persone
@Column(unique = true)
private String keycloakId;
@Column(unique=true)
private String email;
private String password;
@@ -26,8 +30,8 @@ public class Utilisateur implements Serializable {
joinColumns = @JoinColumn(name="utilisateur_id"),
inverseJoinColumns = @JoinColumn(name = "session_id")
)
private List<Session> sessions= new ArrayList<>();;
private List<Session> sessions= new ArrayList<>();
@OneToMany(mappedBy = "createur")
private List<Quizz> quizzs;
private List<Quizz> quizzs = new ArrayList<>();
}

View File

@@ -0,0 +1,10 @@
package sample.data.jpa.service;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.transaction.annotation.Transactional;
import sample.data.jpa.metier.Question;
@Transactional
public interface QuestionDao extends JpaRepository<Question, Integer> {
}

View File

@@ -0,0 +1,11 @@
package sample.data.jpa.service;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.transaction.annotation.Transactional;
import sample.data.jpa.metier.Quizz;
@Transactional
public interface QuizzDao extends JpaRepository<Quizz, Integer> {
}

View File

@@ -0,0 +1,11 @@
package sample.data.jpa.service;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.transaction.annotation.Transactional;
import sample.data.jpa.metier.Reponse;
@Transactional
public interface ReponseDao extends JpaRepository<Reponse, Integer> {
}

View File

@@ -0,0 +1,9 @@
package sample.data.jpa.service;
import org.springframework.data.jpa.repository.JpaRepository;
import sample.data.jpa.metier.Session;
public interface SessionDao extends JpaRepository<Session, Integer> {
boolean existsByCodePIN(int codePIN);
}

View File

@@ -0,0 +1,9 @@
package sample.data.jpa.service;
import org.springframework.data.jpa.repository.JpaRepository;
import sample.data.jpa.metier.Utilisateur;
public interface UtilisateurDao extends JpaRepository<Utilisateur, Integer> {
Utilisateur findByKeycloakId(String keycloakId);
}

View File

@@ -0,0 +1,188 @@
package sample.data.jpa.web;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.security.access.prepost.PreAuthorize;
import sample.data.jpa.metier.Question;
import sample.data.jpa.metier.Reponse;
import sample.data.jpa.service.QuestionDao;
import sample.data.jpa.service.ReponseDao;
@Controller
@RequestMapping("/question")
public class QuestionController {
@Autowired
private QuestionDao qDao;
@Autowired
private ReponseDao rDao;
/*
Post /question/create param : body Jsp, "enonce"
Put /question/update/{id} param : body Jsp, "enonce"
Get /question/getAll
Get /question/get/{id}
Get /question/getReponse/{id}
Put /question/removeReponse
Put /question/setReponse/{id}/{idReponse}
Delete /question/delete/{id}
*/
/*
* Utiliser un Json pour mettre : String enonce
*/
@PostMapping("/create")
@ResponseBody
@PreAuthorize("hasRole('ADMIN')")
public String create(@RequestBody Map<String, String> body) {
String qId = "";
Question q = new Question();
try {
if (body.containsKey("enonce")) {
q.setEnonce(body.get("enonce"));
} else q.setEnonce("");
qDao.save(q);
qId = String.valueOf(q.getId());
} catch (Exception ex) {
return "Error creating the question : " + ex.toString();
}
return "Question \"" + q.getEnonce() + "\" succesfully created with id = " + qId;
}
/*
* Utiliser un Json pour mettre le String "enonce"
* l'id se met dans l'url
*/
@PutMapping("/update/{id}")
@ResponseBody
@PreAuthorize("hasRole('ADMIN')")
public String update(@PathVariable("id") int id, @RequestBody Map<String, String> body) {
Question q;
try {
q = qDao.findById(id).get();
q.setEnonce(body.get("enonce"));
qDao.save(q);
} catch (Exception ex) {
return "Error updating the question: " + ex.toString();
}
return "Question " + id + " succesfully updated! : " + q.getEnonce();
}
@GetMapping("/get/{id}")
@ResponseBody
@PreAuthorize("hasAnyRole('ADMIN','USER')")
public String get(@PathVariable("id") int id) {
Question q;
String res = "";
try {
q = qDao.findById(id).get();
res=q.prettyPrinter(0);
}
catch (Exception ex) {
return "Erreur lors de la récupération de la question : " + ex.toString();
}
return res;
}
@GetMapping("/getAll")
@ResponseBody
@PreAuthorize("hasAnyRole('ADMIN','USER')")
public String getAll() {
try {
List<Question> questions = qDao.findAll();
String res = "";
for (Question question : questions) {
res += "id: " + question.getId() + " , ";
res += "enonce: \"" + question.getEnonce() + "\"\n";
}
return res;
} catch (Exception ex) {
return "Erreur lors de la récupération des question : " + ex.toString();
}
}
@GetMapping("/getReponses/{id}")
@ResponseBody
@PreAuthorize("hasAnyRole('ADMIN','USER')")
public String getReponses(@PathVariable("id") int id) {
try {
Question question = qDao.findById(id).get();
Reponse rep = question.getReponse();
if (rep != null) {
List<String> reponses = rep.getReponses();
String res = "[";
for (int i = 0; i < reponses.size(); i++) {
res += reponses.get(i);
if (i < reponses.size() - 1) {
res += ",";
}
}
res += "]";
return "Réponse de la question " + id + " : " + res;
} else return "Réponse non initialisée pour la question : " + id;
} catch (Exception ex) {
return "Erreur lors de la récupération de la réponse : " + ex.toString();
}
}
@PutMapping("/removeReponse/{id}")
@ResponseBody
@PreAuthorize("hasRole('ADMIN')")
public String removeReponse(@PathVariable("id") int id) {
try {
Question question = qDao.findById(id).get();
Reponse reponse = question.getReponse();
reponse.setQuestion(null);
question.setReponse(null);
qDao.save(question);
rDao.save(reponse);
return "Reponses retiré de la question " + id;
} catch (Exception ex) {
return "Erreur lors de la mise en place de la Reponse : " + ex.toString();
}
}
@PutMapping("/setReponse/{id}/{idR}")
@ResponseBody
@PreAuthorize("hasRole('ADMIN')")
public String setReponse(@PathVariable("id") int id, @PathVariable("idR") int idR) {
try {
Question question = qDao.findById(id).get();
Reponse reponse = rDao.findById(idR).get();
question.setReponse(reponse);
reponse.setQuestion(question);
qDao.save(question);
rDao.save(reponse);
return "Reponses " + idR + " mises sur la question " + id;
} catch (Exception ex) {
return "Erreur lors de la mise en place de la Reponse : " + ex.toString();
}
}
@DeleteMapping("/delete/{id}")
@ResponseBody
@PreAuthorize("hasRole('ADMIN')")
public String delete(@PathVariable("id") int id) {
try {
Question q = qDao.findById(id).get();
qDao.delete(q);
} catch (Exception ex) {
return "Error deleting the question " + id + " :" + ex.toString();
}
return "Question " + id + " succesfully deleted!";
}
}

View File

@@ -0,0 +1,179 @@
package sample.data.jpa.web;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import sample.data.jpa.metier.Question;
import sample.data.jpa.metier.Quizz;
import sample.data.jpa.metier.Reponse;
import sample.data.jpa.metier.Session;
import sample.data.jpa.metier.Utilisateur;
import sample.data.jpa.service.QuestionDao;
import sample.data.jpa.service.QuizzDao;
import sample.data.jpa.service.UtilisateurDao;
@Controller
@RequestMapping("/quizz")
public class QuizzController {
@Autowired
private QuizzDao qDao;
@Autowired
private QuestionDao qtDao;
@Autowired
private UtilisateurDao uDao;
/*
Post /quizz/create
Delete /quizz/delete/{id}
Put /quizz/addQuestion/{idQuestion}/{idQuizz}
Put /quizz/removeQuestion/{idQuestin}/{idQuizz}
Get /quizz/getAll
Get /quizz/getQuestions/{id}
*/
@PostMapping("/create/{id}")
@ResponseBody
@PreAuthorize("hasRole('ADMIN')")
public String create(@PathVariable("id") int id) {
String qId = "";
String emailU = "";
try {
Quizz q = new Quizz();
Utilisateur u = uDao.findById(id).get();
emailU = u.getEmail();
q.setCreateur(u);
qDao.save(q);
qId = String.valueOf(q.getId());
} catch (Exception ex) {
return "Error creating the Quizz : " + ex.toString();
}
return "Quizz succesfully created by "+ emailU +" with id = " + qId;
}
@DeleteMapping("/delete/{id}")
@ResponseBody
@PreAuthorize("hasRole('ADMIN')")
public String delete(@PathVariable("id") int id) {
try {
Quizz q = qDao.findById(id).get();
qDao.delete(q);
} catch (Exception ex) {
return "Error deleting the quizz " + id + " :" + ex.toString();
}
return "Quizz " + id + " succesfully deleted!";
}
@PutMapping("/addQuestion/{id}/{idQ}")
@ResponseBody
@PreAuthorize("hasRole('ADMIN')")
public String addQuestion(@PathVariable("id") int id, @PathVariable("idQ") int qId) {
try {
Quizz q = qDao.findById(id).get();
Question qt = qtDao.findById(qId).get();
q.getQuestions().add(qt);
qt.setQuizz(q);
qDao.save(q);
} catch (Exception ex) {
return "Error adding question from the quizz " + id + " :" + ex.toString();
}
return "Question " + qId + " add in Quizz " + id;
}
@PutMapping("/removeQuestion/{id}/{idQ}")
@ResponseBody
@PreAuthorize("hasRole('ADMIN')")
public String removeQuestion(@PathVariable("id") int id, @PathVariable("idQ") int qId) {
try {
Quizz q = qDao.findById(id).get();
Question qt = qtDao.findById(qId).get();
q.getQuestions().remove(qt);
qt.setQuizz(null);
qDao.save(q);
} catch (Exception ex) {
return "Error removing question from the quizz " + id + " :" + ex.toString();
}
return "Question remove from Quizz " + id;
}
@GetMapping("/get/{id}")
@ResponseBody
@PreAuthorize("hasAnyRole('ADMIN', 'USER')")
public String get(@PathVariable("id") int id){
String res = "";
try {
Quizz q = qDao.findById(id).get();
res += "id : " + id + "\n";
if(q.getCreateur()!=null){
res += "create by : " + q.getCreateur().getId() +
" (" + q.getCreateur().getEmail() + ")\n";
}
List<Session> sessions = q.getSessions();
List<Question> questions = q.getQuestions();
res += "Sessions :\n";
for(Session session : sessions){
res += "\tid : " + session.getId()
+" , theme : " + session.getTheme()
+" , nbUtilisateur : " + session.getUtilisateurs().size()
+" , PIN : " + session.getCodePIN()+"\n";
}
res += "Question :\n";
for( int i = 0; i<questions.size(); i++){
res+="\tQ"+(i+1)+"\n";
res+=questions.get(i).prettyPrinter(2);
}
}
catch (Exception ex) {
return "Error get Quizz :" + ex.toString();
}
return "Quizz : \n" + res;
}
@GetMapping("/getAll")
@ResponseBody
@PreAuthorize("hasAnyRole('ADMIN', 'USER')")
public String getAll() {
String res = "";
try {
List<Quizz> quizzs = qDao.findAll();
for (Quizz quizz : quizzs) {
res += "id: " + quizz.getId() + " , ";
res += " nbQuestion:" + quizz.getQuestions().size() + "]\n";
}
} catch (Exception ex) {
return "Error get all Quizz :" + ex.toString();
}
return "Quizzs : \n" + res;
}
@GetMapping("/getQuestions/{id}")
@ResponseBody
@PreAuthorize("hasAnyRole('ADMIN', 'USER')")
public String getQuestion(@PathVariable("id") int id) {
String res = "";
try {
;
Quizz quizz = qDao.findById(id).get();
for (Question question : quizz.getQuestions()) {
res += "id: " + question.getId() + " , ";
res += "enonce: \"" + question.getEnonce() + "\"\n";
}
} catch (Exception ex) {
return "Error get question of the Quizz :" + ex.toString();
}
return "Questions : \n" + res;
}
}

View File

@@ -0,0 +1,191 @@
package sample.data.jpa.web;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import sample.data.jpa.metier.Choix;
import sample.data.jpa.metier.Reponse;
import sample.data.jpa.metier.ReponseCourte;
import sample.data.jpa.service.ReponseDao;
@Controller
@RequestMapping("/reponse")
public class ReponseController {
@Autowired
private ReponseDao rDao;
/*
Post /reponse/create/choix
Post /reponse/create/courte
Get /reponse/getAll
Get /reponse/get/{id}
Delete /reponse/delete/{id}
Put /reponse/removeReponse/{id} param : body Jsp, "reponse"
Put /reponse/addReponse/{id} param : body Jsp, "reponse"
Put /reponse/addChoix/{id} param : body Jsp, "choix"
Put /reponse/removeChoix/{id} param : body Jsp, "choix"
*/
/*
* Créer une réponse de type Choix
*/
@PostMapping("/create/choix")
@ResponseBody
@PreAuthorize("hasRole('ADMIN')")
public String createReponseChoix() {
try {
Choix r = new Choix();
rDao.save(r);
return "Réponses à choix multiple céée avec l'id : " + r.getId();
} catch (Exception ex) {
return "Erreur lors de la création d'une réponse à choix multiple : " + ex.toString();
}
}
/*
* Créer une réponse de type ReponseCourte
*/
@PostMapping("/create/courte")
@ResponseBody
@PreAuthorize("hasRole('ADMIN')")
public String createReponseCourte() {
try {
ReponseCourte r = new ReponseCourte();
rDao.save(r);
return "Réponses courte céée ";
} catch (Exception ex) {
return "Erreur lors de la création d'une réponse courte : " + ex.toString();
}
}
@GetMapping("/getAll")
@ResponseBody
@PreAuthorize("hasAnyRole('ADMIN','USER')")
public String getAll() {
try {
String res = "";
List<Reponse> reponses = rDao.findAll();
for (Reponse reponse : reponses) {
res += "id : " + reponse.getId() + " , " + reponse.toString() + "\n";
}
return res;
} catch (Exception ex) {
return "Erreur lors de la récupréation de toutes les réponses : " + ex.toString();
}
}
@GetMapping("/get/{id}")
@ResponseBody
@PreAuthorize("hasAnyRole('ADMIN','USER')")
public String get(@PathVariable("id") int id) {
try {
String res = "";
Reponse reponse = rDao.findById(id).get();
res+="id : " + reponse.getId() + "\n" + reponse.prettyPrinter(1);
return res;
} catch (Exception ex) {
return "Erreur lors de la récupréation de la réponse : "+id+" : " + ex.toString();
}
}
@DeleteMapping("/delete/{id}")
@ResponseBody
@PreAuthorize("hasRole('ADMIN')")
public String delete(@PathVariable("id") int id) {
try {
Reponse r = rDao.findById(id).get();
rDao.delete(r);
} catch (Exception ex) {
return "Erreur pendant la suppression de la Reponse " + id + " :" + ex.toString();
}
return "Reponse " + id + " supprimée avec succès";
}
@PutMapping("/addReponse/{id}")
@ResponseBody
@PreAuthorize("hasRole('ADMIN')")
public String addReponse(@PathVariable("id") int id, @RequestBody Map<String, String> body) {
try {
if (body.containsKey("reponse")) {
Reponse rep = rDao.findById(id).get();
String reponse = body.get("reponse");
rep.getReponses().add(reponse);
rDao.save(rep);
return "Réponse correcte \"" + reponse + "\" ajoutée à la Reponse " + id;
} else return "Erreur : mettre \"reponse\" dans le JSOIN";
} catch (Exception ex) {
return "Erreur lors de l'ajout de la réponse : " + ex.toString();
}
}
@PutMapping("/removeReponse/{id}")
@ResponseBody
@PreAuthorize("hasRole('ADMIN')")
public String removeReponses(@PathVariable("id") int id, @RequestBody Map<String, String> body) {
try {
Reponse rep = rDao.findById(id).get();
String reponse = body.get("reponse");
rep.getReponses().remove(reponse);
rDao.save(rep);
return "Réponses correct \"" + reponse + "\" supprimée de la Reponse " + id;
} catch (Exception ex) {
return "Erreur lors de la suppression de la réponse : " + ex.toString();
}
}
@PutMapping("/addChoix/{id}")
@ResponseBody
@PreAuthorize("hasRole('ADMIN')")
public String addChoix(@PathVariable("id") int id, @RequestBody Map<String, String> body) {
try {
Reponse reponse = rDao.findById(id).get();
if (reponse instanceof Choix) {
String choix = body.get("choix");
((Choix) reponse).getChoix().add(choix);
rDao.save(reponse);
return "Choix \"" + choix + "\" ajouté à la question " + id;
} else return "Erreur : la réponse doit être a choix multiple.";
} catch (Exception ex) {
return "Erreur lors de l'ajout du choix : " + ex.toString();
}
}
@PutMapping("/removeChoix/{id}")
@ResponseBody
@PreAuthorize("hasRole('ADMIN')")
public String removeChoix(@PathVariable("id") int id, @RequestBody Map<String, String> body) {
try {
Reponse reponse = rDao.findById(id).get();
if (reponse instanceof Choix) {
String choix = body.get("choix");
((Choix) reponse).getChoix().remove(choix);
rDao.save(reponse);
return "Choix \"" + choix + "\" supprimé à la question " + id;
} else return "Erreur : la réponse doit être a choix multiple.";
} catch (Exception ex) {
return "Erreur lors de la suppression du choix : " + ex.toString();
}
}
}

View File

@@ -0,0 +1,205 @@
package sample.data.jpa.web;
import java.util.List;
import java.util.Map;
import java.util.Random;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import sample.data.jpa.metier.Quizz;
import sample.data.jpa.metier.Session;
import sample.data.jpa.metier.Utilisateur;
import sample.data.jpa.service.QuizzDao;
import sample.data.jpa.service.SessionDao;
import sample.data.jpa.service.UtilisateurDao;
@Controller
@RequestMapping("/session")
public class SessionController {
@Autowired
private SessionDao sDao;
@Autowired
private QuizzDao qDao;
@Autowired
private UtilisateurDao uDao;
/*
Post /session/create param : body Jsp, "theme"
Delete /session/delete/{id}
Get /session/getAll
Put /session/addQuizz/{id}/{idQ}
Put /session/removeQuizz/{id}/{idQ}
Put /session/update/{id} param : body Jsp, "theme"
Put /session/join/{sessionId}
Put /session/leave/{sessionId}
*/
@PostMapping("/create")
@ResponseBody
@PreAuthorize("hasRole('ADMIN')")
public String create(@RequestBody Map<String, String> body) {
String sId = "";
Session session = new Session();
try {
session.setTheme(body.getOrDefault("theme", ""));
int codePIN;
if (body.containsKey("codePIN")) {
codePIN = Integer.parseInt(body.get("codePIN"));
if (sDao.existsByCodePIN(codePIN)) {
return "Error: codePIN already exists.";
}
} else {
do {
codePIN = new Random().nextInt(900000) + 100000;
} while (sDao.existsByCodePIN(codePIN));
}
session.setCodePIN(codePIN);
sDao.save(session);
sId = String.valueOf(session.getId());
} catch (Exception ex) {
return "Error creating the Session : " + ex.toString();
}
return "Session \"" + session.getTheme() + "\" successfully created with id = " + sId + " and codePIN = " + session.getCodePIN();
}
@DeleteMapping("/delete/{id}")
@ResponseBody
@PreAuthorize("hasRole('ADMIN')")
public String delete(@PathVariable("id") int id) {
try {
Session q = sDao.findById(id).get();
sDao.delete(q);
} catch (Exception ex) {
return "Error deleting the session " + id + " :" + ex.toString();
}
return "Session " + id + " succesfully deleted!";
}
@GetMapping("/getAll")
@ResponseBody
@PreAuthorize("hasAnyRole('ADMIN','USER')")
public String getAll() {
try {
List<Session> sessions = sDao.findAll();
String res = "";
for (Session session : sessions) {
res += "id: " + session.getId() + " , ";
res += "theme: \"" + session.getTheme() + "\" , ";
res += "nbUtilisateur :" + session.getUtilisateurs().size() + "\n";
}
return res;
} catch (Exception ex) {
return "Error get all session : " + ex.toString();
}
}
@PutMapping("/addQuizz/{id}/{qid}")
@ResponseBody
@PreAuthorize("hasRole('ADMIN')")
public String addQuizz(@PathVariable("id") int id, @PathVariable("qid") int qId) {
try {
Session s = sDao.findById(id).get();
Quizz q = qDao.findById(qId).get();
s.getQuizzs().add(q);
q.getSessions().add(s);
sDao.save(s);
qDao.save(q);
} catch (Exception ex) {
return "Error adding the quizz from the session : " + ex.toString();
}
return "Quizz " + qId + " add in Session " + id;
}
@PutMapping("/removeQuizz/{id}/{qid}")
@ResponseBody
@PreAuthorize("hasRole('ADMIN')")
public String removeQuizz(@PathVariable("id") int id, @PathVariable("qid") int qId) {
try {
Session s = sDao.findById(id).get();
Quizz q = qDao.findById(qId).get();
s.getQuizzs().remove(q);
q.getSessions().remove(s);
sDao.save(s);
qDao.save(q);
} catch (Exception ex) {
return "Error removing the quizz from the session : " + ex.toString();
}
return "Quizz " + qId + " remove from Session " + id;
}
/*
* Utiliser un Json pour mettre le String "theme"
* l'id se met dans l'url
*/
@PutMapping("/update/{id}")
@ResponseBody
@PreAuthorize("hasRole('ADMIN')")
public String updateQuestion(@PathVariable("id") int id, @RequestBody Map<String, String> body) {
Session s;
try {
s = sDao.findById(id).get();
s.setTheme(body.get("theme"));
sDao.save(s);
} catch (Exception ex) {
return "Error updating the Session: " + ex.toString();
}
return "Session " + id + " succesfully updated! : " + s.getTheme();
}
@PutMapping("/join/{sessionId}")
@ResponseBody
@PreAuthorize("hasRole('USER')")
public String joinSession(@PathVariable("sessionId") int sessionId, JwtAuthenticationToken auth) {
try {
String keycloakUserId = auth.getToken().getClaim("sub");
Utilisateur u = uDao.findByKeycloakId(keycloakUserId);
if (u == null) {
return "User not found in database.";
}
Session s = sDao.findById(sessionId).orElseThrow(() -> new Exception("Session not found"));
u.getSessions().add(s);
s.getUtilisateurs().add(u);
sDao.save(s);
uDao.save(u);
return "User " + u.getName() + " joined session " + sessionId;
} catch (Exception ex) {
return "Erreur pendant l'ajout de l'utilisateur dans la session : " + ex.toString();
}
}
@PutMapping("/leave/{sessionId}")
@ResponseBody
@PreAuthorize("hasRole('USER')")
public String leaveSession(@PathVariable("sessionId") int sessionId, JwtAuthenticationToken auth) {
try {
String keycloakUserId = auth.getToken().getClaim("sub");
Utilisateur u = uDao.findByKeycloakId(keycloakUserId);
if (u == null) {
return "User not found in database.";
}
Session s = sDao.findById(sessionId).orElseThrow(() -> new Exception("Session not found"));
u.getSessions().remove(s);
s.getUtilisateurs().remove(u);
sDao.save(s);
uDao.save(u);
return "User " + u.getName() + " left session " + sessionId;
} catch (Exception ex) {
return "Erreur pendant la suppression de l'utilisateur de la session : " + ex.toString();
}
}
}

View File

@@ -0,0 +1,167 @@
package sample.data.jpa.web;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import sample.data.jpa.metier.Session;
import sample.data.jpa.metier.Utilisateur;
import sample.data.jpa.service.SessionDao;
import sample.data.jpa.service.UtilisateurDao;
@Controller
@RequestMapping("/utilisateur")
public class UtilisateurController {
@Autowired
private UtilisateurDao uDao;
@Autowired
private SessionDao sDao;
/*
Post /utilisateur/create param : body Jsp, "name", "email", "password"
Delete /utilisateur/delete/{id}
Get /utilisateur/getAll
Get /utilisateur/getSessions
Put /utilisateur/addSession/{idUtilisateur}/{idSession}
Put /utilisateur/removeSession/{idUtilisateur}/{idSession}
Put /utilisateur/update/{id} param : body Jsp, "name", "email", "password"
*/
@PostMapping("/create")
@ResponseBody
@PreAuthorize("hasAnyRole('ADMIN','USER')")
public String create(@RequestBody Map<String, String> body, JwtAuthenticationToken auth) {
try {
if(body.containsKey("name") && body.containsKey("email") && body.containsKey("password")){
Utilisateur u = new Utilisateur();
String keycloakUserId = auth.getToken().getClaim("sub");
u.setName(body.get("name"));
u.setEmail(body.get("email"));
u.setPassword(body.get("password"));
u.setKeycloakId(keycloakUserId);
uDao.save(u);
String uId = String.valueOf(u.getId());
return "Utilisateur \"" + u.getName() + "\" créé avec succès avec l'id = " + uId;
} else return "Erreur, besoin de name, email et password dans le JSON";
} catch (Exception ex) {
return "Erreur durant la création de l'Utilisateur : " + ex.toString();
}
}
@DeleteMapping("/delete/{id}")
@ResponseBody
@PreAuthorize("hasRole('ADMIN')")
public String delete(@PathVariable("id") int id) {
try {
Utilisateur u = uDao.findById(id).get();
uDao.delete(u);
} catch (Exception ex) {
return "Erreur pendant la suppression de l'utilisateur " + id + " :" + ex.toString();
}
return "Utilisateur " + id + " supprimé avec succès !";
}
@GetMapping("/getAll")
@ResponseBody
@PreAuthorize("hasAnyRole('ADMIN','USER')")
public String getAll() {
try {
List<Utilisateur> utilisateurs = uDao.findAll();
String res = "";
for (Utilisateur utilisateur : utilisateurs) {
res += "id: " + utilisateur.getId() + " , ";
res += "name: " + utilisateur.getName() + " , ";
res += "email: \"" + utilisateur.getEmail() + "\"\n";
}
return res;
} catch (Exception ex) {
return "Erreur pendant la récupération des utilisateurs : " + ex.toString();
}
}
@GetMapping("/getSessions/{id}")
@ResponseBody
@PreAuthorize("hasAnyRole('ADMIN','USER')")
public String getSessions(@PathVariable("id") int id){
try {
Utilisateur u = uDao.findById(id).get();
String res = "";
for(Session s : u.getSessions()){
res += "id : "+ s.getId() + " , theme : " + s.getTheme() + "\n";
}
return res;
} catch (Exception ex) {
return "Erreur pendant la récupération les sessions de l'utilisateur : " + ex.toString();
}
}
@PutMapping("/addSession/{id}/{qid}")
@ResponseBody
@PreAuthorize("hasRole('ADMIN')")
public String addSession(@PathVariable("id") int id, @PathVariable("qid") int sId) {
try {
Utilisateur u = uDao.findById(id).get();
Session s = sDao.findById(sId).get();
u.getSessions().add(s);
s.getUtilisateurs().add(u);
sDao.save(s);
uDao.save(u);
} catch (Exception ex) {
return "Erreur pendant l'ajout de l'utilisateur dans la session : " + ex.toString();
}
return "Utilisateur " + id + " ajouté à la Session " + id;
}
@PutMapping("/removeSession/{id}/{qid}")
@ResponseBody
@PreAuthorize("hasRole('ADMIN')")
public String removeSession(@PathVariable("id") int id, @PathVariable("qid") int sId) {
try {
Utilisateur u = uDao.findById(id).get();
Session s = sDao.findById(sId).get();
u.getSessions().remove(s);
s.getUtilisateurs().remove(u);
sDao.save(s);
uDao.save(u);
} catch (Exception ex) {
return "Erreur pendant la suppression de l'utilisateur de la session : " + ex.toString();
}
return "Utilisateur " + id + " retiré de la Session " + id;
}
@PostMapping("/update/{id}")
@ResponseBody
@PreAuthorize("hasRole('ADMIN')")
public String update(@PathVariable("id") int id, @RequestBody Map<String, String> body) {
try {
if (body.containsKey("name") && body.containsKey("email") && body.containsKey("password")) {
Utilisateur u = uDao.findById(id).get();
u.setName(body.get("name"));
u.setEmail(body.get("email"));
u.setPassword(body.get("password"));
uDao.save(u);
return "Utilisateur \"" + u.getName() + "\" mis à jour avec succès";
} else return "Erreur, besoin de name, email et password dans le JSON";
} catch (Exception ex) {
return "Erreur durant la mise à jour de de l'Utilisateur : " + ex.toString();
}
}
}

View File

@@ -1,27 +0,0 @@
package servlet;
import java.io.IOException;
import java.io.PrintWriter;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@WebServlet(name="mytest",
urlPatterns={"/myurl"})
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter p = new PrintWriter(resp.getOutputStream());
p.print("Hello world");
p.flush();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
super.doPost(req, resp);
}
}

View File

@@ -1,90 +0,0 @@
package servlet;
import java.io.IOException;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import DAO.*;
import metier.*;
import java.util.List;
import java.util.Arrays;
@WebServlet(name="question",
urlPatterns={"/QuestionInfo"})
public class QuestionInfo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getRequestDispatcher("/Question.html").forward(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
QuizzDAO quizzDAO = new QuizzDAO();
QuestionDAO questionDAO = new QuestionDAO();
ReponseDAO reponseDAO = new ReponseDAO();
String ennonce = req.getParameter("question");
String type = req.getParameter("type");
String choixPossible = req.getParameter("choixPossible");
String reponse = req.getParameter("reponse");
String idQuizz = req.getParameter("idQuizz");
Quizz quizz = quizzDAO.findById(Integer.parseInt(idQuizz));
if(quizz==null){
resp.getWriter().println("<HTML>\n<BODY>\n" +
"<H1> Quizz non trouvable </H1>" +
"</BODY></HTML>");
return ;
}
Question question = new Question();
question.setEnonce(ennonce);
List<String> listRep = Arrays.asList(reponse.split("\n"));
questionDAO.create(question);
if(type.equals("choix")){
Choix choix = new Choix();
//question.setReponse(choix);
List<String> listChoix = Arrays.asList(choixPossible.split("\n"));
choix.setChoix(listChoix);
choix.setReponses(listRep);
reponseDAO.create(choix);
reponseDAO.addToQuestion(choix, question);
}
else if (type.equals("courte")){
ReponseCourte reponseCourte = new ReponseCourte();
//question.setReponse(reponseCourte);
reponseCourte.setReponses(listRep);
reponseDAO.create(reponseCourte);
reponseDAO.addToQuestion(reponseCourte, question);
}
else{
resp.getWriter().println(
"<HTML>\n<BODY>\n" +
"<H1> Type de question non trouvé </H1>" +
"</BODY></HTML>"
);
return ;
}
quizzDAO.addQuestion(quizz,question);
resp.getWriter().println(
"<HTML>\n<BODY>\n" +
"<H1> Question \"" + question.getEnonce() + "\" creee </H1>" +
"</BODY></HTML>"
);
return ;
}
}

View File

@@ -1,56 +0,0 @@
package servlet;
import java.io.IOException;
import DAO.QuizzDAO;
import DAO.UtilisateurDAO;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import metier.Quizz;
import metier.Utilisateur;
@WebServlet(name="quizz",
urlPatterns={"/QuizzInfo"})
public class QuizzInfo extends HttpServlet {
QuizzDAO quizzDAO = new QuizzDAO();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getRequestDispatcher("/Quizz.html").forward(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//Utilisateur
UtilisateurDAO uDAO = new UtilisateurDAO();
String email_user = req.getParameter("email_User");
String id_User = req.getParameter("id_User");
Utilisateur u_cree_quizz = null;
if (id_User != null && !id_User.isEmpty()) {
int id = Integer.parseInt(id_User);
u_cree_quizz=uDAO.findById(id);
}else if(email_user != null && !email_user.isEmpty()){
u_cree_quizz=uDAO.findByEmail(email_user);
}
if (u_cree_quizz == null) {
resp.getWriter().println("<HTML>\n<BODY>\n" +
"<H1> Utilisateur non trouvable </H1>" +
"</BODY></HTML>");
return ;
}
Quizz quizz = new Quizz();
quizz.setCreateur(u_cree_quizz);
//quizz.setSession(s_attached);
quizzDAO.create(quizz);
resp.getWriter().println("<HTML>\n<BODY>\n" +
"<H1>Quizz cree par " + u_cree_quizz.getName() + "</H1>" +
"</BODY></HTML>");
return ;
}
}

View File

@@ -1,59 +0,0 @@
package servlet;
import java.io.IOException;
import DAO.*;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import metier.Quizz;
import metier.Session;
@WebServlet(name = "session", urlPatterns = {"/SessionInfo"})
public class SessionInfo extends HttpServlet {
SessionDAO sessionDAO = new SessionDAO();
UtilisateurDAO uDAO = new UtilisateurDAO();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getRequestDispatcher("/Session.html").forward(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String action = req.getParameter("action");
if (action.equals("createSession")) {
// Créer une nouvelle session
String theme = req.getParameter("theme");
String codePin = req.getParameter("codePIN");
Session s = new Session();
s.setCodePIN(Integer.parseInt(codePin));
s.setTheme(theme);
sessionDAO.create(s);
resp.getWriter().println("<h1>Session creee avec id: " +
s.getId() + "</h1>");
resp.getWriter().println("<h1>Session creee avec code PIN: " +
s.getCodePIN() + "</h1>");
}
else if (action.equals("addQuizz")){
String idQuizz = req.getParameter("idQuizz");
String sessionID = req.getParameter("sessionID");
QuizzDAO quizzDAO = new QuizzDAO();
SessionDAO sessionDAO = new SessionDAO();
Quizz quizz = quizzDAO.findById(Integer.parseInt(idQuizz));
if(quizz==null) resp.getWriter().println("<h1>Ce quizz n'existe pas !</h1>");
if(quizz==null) resp.getWriter().println("<h1>Cette session n'existe pas !</h1>");
Session session = sessionDAO.findById(Integer.parseInt(sessionID));
sessionDAO.addQuizz(quizz,session);
resp.getWriter().println("<h1>Quizz"+ idQuizz +" est ajouté à la session " + sessionID + " !</h1>");
}
}
}

View File

@@ -1,140 +0,0 @@
package servlet;
import java.io.IOException;
import java.util.List;
import DAO.*;
import DTO.UtilisateurDTO;
import Mapper.UtilisateurMapper;
import metier.*;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.mapstruct.factory.Mappers;
@WebServlet(name = "Show", urlPatterns = {"/Show"})
public class Show extends HttpServlet {
Utilisateur u;
QuizzDAO quizzDAO = new QuizzDAO();
SessionDAO sessionDAO = new SessionDAO();
UtilisateurDAO utilisateurDAO = new UtilisateurDAO();
QuestionDAO questionDAO = new QuestionDAO();
UtilisateurMapper mapper_u = Mappers.getMapper(UtilisateurMapper.class);
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
String result = "<!DOCTYPE html>" +
"<html>" +
"<head>" +
"<link rel=\"stylesheet\" type=\"text/css\" href=\"" + request.getContextPath() + "/css/style.css\">" +
"</head>" +
"<body>";
//UTILISATEUR
List<Utilisateur> listUser = utilisateurDAO.findAll();
result += "<H2>Utilisateurs :</H2>";
result +=
"<table class=\"show\">" +
"<thead class=\"show\">" +
"<tr>" +
"<th class=\"Id\">Nom</th><th class=\"show\">Nom</th><th class=\"show\">mail</th><th class=\"show\">Password</th>" +
"</tr>" +
"</thead>" +
"<tbody>";
for (Utilisateur u : listUser) {
UtilisateurDTO dto = mapper_u.toDTO(u);
result +=
"<tr>" +
"<th class=\"show\">" + dto.getId() + "</th><th class=\"show\">" + dto.getName() + "</th><th class=\"show\">" + dto.getEmail() + "</th><th class=\"show\">" + dto.getPassword() + "</th>"+
"</tr>";
System.out.println(u.getName()+dto.getEmail());
}
result +=
"</tbody>"+
"</table>";
//QUIZZ
List<Quizz> listQuizz = quizzDAO.findAll();
result += "<H2>Quizz :</H2>";
for (Quizz quizz : listQuizz) {
quizzDAO.refresh(quizz);
result += "<div class=\"quizz\">";
result += "quizz n°" + quizz.getId() + "<br/>";
result += "<div class=\"tabulation\">";
result += "Createur : " + quizz.getCreateur().getEmail() + " (id: " + quizz.getCreateur().getId() + ") <br/>";
result += "nb Question : " + quizz.getQuestions().size() +"<br/>";
for (Question question : quizz.getQuestions()) {
result += "<div class=\"question\">";
result += "Q" + question.getId() + " Ennoncé : "+ question.getEnonce() + "<br/>";
result += "<b>Choix de réponse : </b><br/>";
result += "<div class=\"tabulation\">";
result += question.getReponse().valHTML();
result += "</div>";
result += "<b>Reponses corrects :</b><br/>";
result += "<div class=\"tabulation\">";
for (String reponse : question.getReponse().getReponses()) {
result += reponse;
}
result += "</div></div>";
}
result += "</div></div>";
}
//SESSION
List<Session> listSession = sessionDAO.findAll();
result += "<H2>Session : </H2>";
result +=
"<table class=\"show\">"+
"<thead class=\"show\">"+
"<tr>"+
"<th class=\"show\">ID</th><th class=\"show\">Theme</th><th class=\"show\">Code PIN</th><th class=\"show\">Quizzs</th><th class=\"show\">Participants</th>"+
"</tr>"+
"</thead>"+
"<tbody>";
for(Session session : listSession){
sessionDAO.refresh(session);
result+=
"<tr>"+
"<th class=\"show\">"+session.getId()+"</th>"+"<th class=\"show\">"+session.getTheme()+"</th>"+"<th class=\"show\">"+session.getCodePIN()+"</th>";
String quizzsID = "";
for(Quizz quizz : session.getQuizzs()){
quizzsID += quizz.getId() + " ; ";
}
String UtilisateurID = "";
for(Utilisateur utilisateur : session.getUtilisateurs()){
UtilisateurID += utilisateur.getEmail() + " ; ";
}
result += "<th class=\"show\">"+quizzsID+"</th>"+"<th class=\"show\">"+UtilisateurID+"</th>";
result+="</tr>";
}
result +=
"</tbody>"+
"</table>";
//HTML END
result += "</body>\n</html>";
response.getWriter().write(result);
}
}

View File

@@ -1,50 +0,0 @@
package servlet;
import java.io.IOException;
import java.io.PrintWriter;
import DAO.UtilisateurDAO;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import metier.Utilisateur;
@WebServlet(name = "userinfo", urlPatterns = {"/UserInfo"})
public class UserInfo extends HttpServlet {
UtilisateurDAO utilisateurDAO = new UtilisateurDAO();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getRequestDispatcher("/UserInfo.html").forward(req, resp);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
String action = request.getParameter("action");
if ("addUser".equals(action)) {
Utilisateur u = new Utilisateur();
u.setName(request.getParameter("name"));
u.setEmail(request.getParameter("email"));
u.setPassword(request.getParameter("password"));
utilisateurDAO.create(u);
PrintWriter out = response.getWriter();
out.println("<HTML>\n<BODY>\n" +
"<H1>Recapitulatif des informations de l'utilisateur</H1>\n" +
"<UL>\n" + " <LI>Nom: " + request.getParameter("name") +
"\n" + " <LI>Email: " + request.getParameter("email") + "\n" +
"</BODY></HTML>");
} else if ("addSession".equals(action)) {
int sessionId = Integer.parseInt(request.getParameter("sessionId"));
int userId = Integer.parseInt(request.getParameter("userId"));
utilisateurDAO.addToSession(sessionId, userId);
response.getWriter().println("<h1> Reussi d'ajouter utilisateur " +
userId + " à la session " + sessionId + "</h1>");
}
}
}

View File

@@ -1,67 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="https://jakarta.ee/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/persistence https://jakarta.ee/xml/ns/persistence/persistence_3_0.xsd"
version="3.0">
<persistence-unit name="dev" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<properties>
<property name="jakarta.persistence.jdbc.driver"
value="org.hsqldb.jdbcDriver" />
<property name="jakarta.persistence.jdbc.url"
value="jdbc:hsqldb:hsql://localhost/" />
<property name="jakarta.persistence.jdbc.user" value="sa" />
<property name="jakarta.persistence.jdbc.password" value="" />
<property
name="jakarta.persistence.schema-generation.database.action"
value="create" />
<property name="jakarta.persistence.dialect"
value="org.hibernate.dialect.HSQLDialect" />
<property name="hibernate.show_sql" value="true" />
</properties>
</persistence-unit>
<persistence-unit name="prod" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<properties>
<property name="jakarta.persistence.jdbc.driver"
value="org.hsqldb.jdbcDriver" />
<property name="jakarta.persistence.jdbc.url"
value="jdbc:hsqldb:hsql://localhost/" />
<property name="jakarta.persistence.jdbc.user" value="sa" />
<property name="jakarta.persistence.jdbc.password" value="" />
<property
name="jakarta.persistence.schema-generation.database.action"
value="update" />
<property name="jakarta.persistence.dialect"
value="org.hibernate.dialect.HSQLDialect" />
<property name="hibernate.show_sql" value="true" />
</properties>
</persistence-unit>
<persistence-unit name="mysql">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<properties>
<property name="jakarta.persistence.jdbc.driver"
value="com.mysql.cj.jdbc.Driver" />
<property name="jakarta.persistence.jdbc.url"
value="jdbc:mysql://localhost/mydatabase" />
<property name="jakarta.persistence.jdbc.user" value="tlc" />
<property name="jakarta.persistence.jdbc.password" value="tlc" />
<property
name="jakarta.persistence.schema-generation.database.action"
value="update" />
<property name="jakarta.persistence.dialect"
value="org.hibernate.dialect.MySQL8Dialect" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.c3p0.min_size" value="5" />
<property name="hibernate.c3p0.max_size" value="20" />
<property name="hibernate.c3p0.timeout" value="300" />
<property name="hibernate.c3p0.max_statements" value="50" />
<property name="hibernate.c3p0.idle_test_period" value="3000" />
</properties>
</persistence-unit>
</persistence>

View File

@@ -0,0 +1,21 @@
server.port=8082
spring.h2.console.enabled=true
spring.h2.console.path=/h2
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.sql.init.platform=h2
spring.sql.init.mode= always
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect
spring.security.oauth2.resourceserver.jwt.issuer-uri=http://localhost:8080/realms/myspringbootapprealm
spring.security.oauth2.resourceserver.jwt.jwk-set-uri=http://localhost:8080/realms/myspringbootapprealm/protocol/openid-connect/certs
keycloak.realm: myspringbootapprealm
keycloak.auth-server-url: http://localhost:8080/
keycloak.resource: myspringbootapp
keycloak.credentials.secret: Y7xpKQbFalUFTGUGD9XDBcvawvs3zsWZ
keycloak.use-resource-role-mappings: true
keycloak.bearer-only: true

View File

@@ -1,15 +0,0 @@
----------------------------------------------log4j.properties
### direct log messages to stdout
###
log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
# Log everything. Good for troubleshooting
log4j.logger.org.hibernate=ERROR
# Log all JDBC parameters
log4j.logger.org.hibernate.type=ERROR

View File

@@ -0,0 +1,14 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Admin</title>
</head>
<body>
This is the admin page
<br/>
Logged user: <span th:if="${user} != null" th:text="${user.name}"></span>
<br/>
<a href="/logout">logout</a>
</body>
</html>

View File

@@ -0,0 +1,14 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Index</title>
</head>
<body>
This is the index page.
<br/>
Logged user: <span th:if="${user} != null" th:text="${user.name}"></span>
<br/>
<a href="/admin">admin</a>
<a href="/logout">logout</a>
</body>

View File

@@ -0,0 +1,15 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Main</title>
</head>
<body>
This is the main page.
<br/>
<a href="/index">index</a>
<br/>
<a href="/admin">admin</a>
</body>
</html>
>

View File

@@ -0,0 +1,14 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Logout</title>
</head>
<body>
This is the logout page.
<br/>
Logged user: <span th:if="${user} != null" th:text="${user.name}"></span>
<br/>
<a href="/">main</a>
</body>
</html>

View File

@@ -1,41 +0,0 @@
<!DOCTYPE html>
<meta charset="UTF-8">
<html lang="fr">
<body>
<h1>Creer une Question</h1>
<form action="QuestionInfo" method="POST">
<input type="hidden" name="action" value="createSession">
Ennoncé de la question : <input type="text" name="question"><br/>
Type :
<select id="type" name="type">
<option value="choix">Choix multiple</option>
<option value="courte">Réponse courte</option>
</select><br/>
<div id="DivChoix">
Choix possible (séparez avec des retour à la ligne):<br/>
<textarea id="choixPossible" name="choixPossible" rows="5" cols="40"></textarea><br/>
</div>
Réponse autorisée (séparez avec des retour à la ligne):<br/>
<textarea id="reponse" name="reponse" rows="5" cols="40"></textarea><br/>
ID Quizz: <input type="number" name="idQuizz"><br/>
<input type="submit" value="Creer Session">
</form>
<script>
const select = document.getElementById('type');
const contenu1 = document.getElementById('DivChoix');
select.addEventListener('change', function () {
if (this.value === 'choix') {
contenu1.style.display = 'block';
} else{
contenu1.style.display = 'none';
}
});
</script>
</body>
</html>

View File

@@ -1,12 +0,0 @@
<!DOCTYPE html>
<meta charset="UTF-8">
<html lang="en">
<body>
<form action="QuizzInfo" method="POST">
<h1>Creer des quizz</h1>
Create from user id : <INPUT type="number" name="id_User" size="20"><BR>
Create from user email : <INPUT type="text" name="email_User" size="20"><BR>
<INPUT type="submit" value="Creer Quizz"></INPUT>
</form>
</body>
</html>

View File

@@ -1,28 +0,0 @@
<!DOCTYPE html>
<meta charset="UTF-8">
<html lang="en">
<body>
<h1>Creer une session</h1>
<form action="SessionInfo" method="POST">
<input type="hidden" name="action" value="createSession">
Theme: <input type="text" name="theme"><br/>
CodePin <input type="number" name="codePIN"><br/>
<input type="submit" value="createSession">
</form>
<h1>Ajouter un quizz à une session</h1>
<form action="SessionInfo" method="POST">
<input type="hidden" name="action" value="addQuizz">
session ID <input type="number" name="sessionID"><br/>
ID Quizz <input type="number" name="idQuizz"><br/>
<input type="submit" value="addQuizz">
</form>
</body>
</html>

View File

@@ -1,25 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>User manager</title>
</head>
<body>
<h1>Creer l'utilisateur</h1>
<FORM Method="POST" Action="UserInfo">
<input type="hidden" name="action" value="addUser">
Name : <INPUT type="text" size="20" name="name"><BR>
Email : <INPUT type="text" size="20" name="email"><BR>
Passworld : <INPUT type="text" size="20" name="password"><BR>
<INPUT type="submit" value="Send">
</FORM>
<h1>Ajouter utilisateur dans une session</h1>
<form action="UserInfo" method="POST">
<input type="hidden" name="action" value="addSession">
ID Session: <input type="number" name="sessionId"><br>
ID Utilisateur: <input type="number" name="userId"><br>
<input type="submit" value="Ajouter">
</form>
</body>
</html>

View File

@@ -1,39 +0,0 @@
body{
}
table.show{
border-collapse: collapse;
text-align: left;
border: 2px solid #C0C0C0;
}
thead.show{
background-color: #F0F0F0;
}
th.show{
padding-left: 5px;
padding-right: 5px;
border: 1px solid #C0C0C0
}
.tabulation{
padding-left: 10px;
}
.question{
border: solid;
border-color: #C0C0C0;
margin: 5px;
padding: 5px;
}
.quizz{
border: solid;
border-color: #909090;
margin: 5px;
padding: 5px;
}

View File

@@ -1,17 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Kaflop!</title>
</head>
<body>
<h1>Kaflop!</h1>
<a href =http://localhost:8080/UserInfo.html>myform</a>
<a href =http://localhost:8080/Session.html>session</a>
<a href =http://localhost:8080/Quizz.html>Quizz</a>
<a href =http://localhost:8080/Question.html>Question</a>
<a href =Show>show</a>
</body>
</html>

View File

@@ -0,0 +1,80 @@
/*
* Copyright 2012-2016 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package sample.data.jpa;
import java.lang.management.ManagementFactory;
import javax.management.ObjectName;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
import static org.assertj.core.api.Assertions.assertThat;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
/**
* Integration test to run the application.
*
* @author Oliver Gierke
* @author Dave Syer
*/
@RunWith(SpringRunner.class)
@SpringBootTest
// Enable JMX so we can test the MBeans (you can't do this in a properties file)
@TestPropertySource(properties = { "spring.jmx.enabled:true",
"spring.datasource.jmx-enabled:true" })
@ActiveProfiles("scratch")
// Separate profile for web tests to avoid clashing databases
public class SampleDataJpaApplicationTests {
@Autowired
private WebApplicationContext context;
private MockMvc mvc;
@Before
public void setUp() {
this.mvc = MockMvcBuilders.webAppContextSetup(this.context).build();
}
@Test
public void testHome() throws Exception {
this.mvc.perform(get("/")).andExpect(status().isOk())
.andExpect(content().string("Bath"));
}
@Test
public void testJmx() throws Exception {
assertThat(ManagementFactory.getPlatformMBeanServer()
.queryMBeans(new ObjectName("jpa.sample:type=ConnectionPool,*"), null))
.hasSize(1);
}
}

View File

@@ -0,0 +1,2 @@
spring.datasource.name=scratchdb
spring.jmx.default-domain=jpa.sample