24 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
63 changed files with 2381 additions and 1396 deletions

2
.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
/target/
/data/

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

100
README.md
View File

@@ -1,51 +1,91 @@
# TP TAA # TP TAA
## TP1 - TP2 ## TP3 - TP4
### Compte rendu ### Nous avons maintenant deux rôles :
- ADMIN : correspond à lenseignant
- USER : correspond à létudiant
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.
### 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 #### Utilisateur Resource
| Methode | URL | Description | | Methode | URL | Description |
|---------|---------------------------------------------------|-------------------------------------------------------| |---------|----------------------------------------------------|----------------------------------------------------------------------------------------------|
| GET | `/utilisateur` | Retourne toute la liste de l'utilisateur | | POST | `/utilisateur/create` | Créer un utilisateur (avec aussi l'id keyloak) ("name","email et "password" dans body json) |
| POST | `/utilisateur/register` | S'incrire nouveaux utilisateur | | GET | `/utilisateur/getAll` | retourn tout les utilisateurs (id, name, email) |
| GET | `/utilisateur/login` | Se connecter | | GET | `/utilisateur/getSessions/{session_id}` | Retourne les sessions de l'utilisateur |
| GET | `/utilisateur/{id}` | Retourne l'utilisateur par id | | PUT | `/utilisateur/addSession/{user_id}/{session_id}` | rejoint une session à la liste de l'utilisateur |
| GET | `/utilisateur/{user_id}/session` | Retoune la liste de session que l'utilisateur attends | | PUT | `/utilisateur/removeSession/{user_id}/{session_id}`| quite une session à la liste de l'utilisateur |
| PUT | `/utilisateur/{user_id}/add_session/{session_id}` | Ajoute un nouveau 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/{user_id}/delete` | Supprime l'utilisateur | | DELETE | `/utilisteur/delete/{user_id}/delete` | Supprime l'utilisateur |
#### Session Resource #### Session Resource
| Methode | URL | Description | | Methode | URL | Description |
|---------|--------------------------------------|------------------------------------| |---------|-------------------------------------------------|---------------------------------------------------------------|
| GET | `/session` | Retourne toute la liste du session | | POST | `/session/create` | créer une nouvelle session ("theme":String dans body json) |
| GET | `/session/{id}` | Retourne la session par id | | GET | `/session/getAll` | Retourne la liste des sessions |
| GET | `/session/{session_id}/quizzs` | Retourne la liste de quizzs | | PUT | `/session/addQuizz/{session_id}/{quizz_id}` | ajoute un quizz à la session |
| GET | `/session/{session_id}/utilisateurs` | Retourne la liste de l'utilisateur | | PUT | `/session/removeQuizz/{session_id}/{quizz_id}` | retire un quizz à la session |
| DELETE | `/session/{session_id}/delete` | Supprime 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 #### Quizz Resource
| Methode | URL | Description | | Methode | URL | Description |
|---------|------------------------------------------------|----------------------------------------| |---------|-------------------------------------------------|----------------------------------------------------|
| GET | `/quizz` | Retourne toute la liste du quizz | | POST | `/quizz/create/{utilisateur_id}` | céer un nouveau quizz par associé à un utilisateur |
| GET | `/quizz/{quizz_id}/add_question/{question_id}` | Ajoute une nouvuelle question au quizz | | GET | `/quizz/getQuestions/{quizz_id}` | Retourne la list des questions d'un quizz |
| DELETE | `/quizz/{quizz_id}/delete` | Suprrime le quizz | | GET | `/quizz/getAll` | Retourne toute la liste du quizz |
| PUT | `/quizz/{quizz_id}/deleteQ` | Supprime toute les questions de 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 #### Question Resource
| Methode | URL | Description | | Methode | URL | Description |
|----------|----------------------------------------------------|-----------------------------------------------------------------------| |----------|----------------------------------------------------|-----------------------------------------------------------------------|
| GET | `/question` | Retourne toute la liste du question | | GET | `/question` | Retourne toute la liste du question |
| POST | `/question/addQuestion` | Créer une question | | POST | `/question/create` | Créer une question ( "enonce":String dans body Json) |
| PUT | `/question/{question_id}/changeQuestion` | Change l'énoncé de la question | | PUT | `/question/update/{question_id}` | Change l'énoncé de la question ("enonce":String dans body JSON) |
| GET | `/question/{question_id}/getReponse` | retourne l'objet Reponse | | GET | `/question/get/{question_id}` | donne toutes les infos de la question sous forme de String |
| PUT | `/question/{question_id}/addReponse` | Ajoute une réponse à Reponse | | GET | `/question/getAll` | donne l'id et l'énoncé de toutes les questions sous forme de String |
| DELETE | `/question/{question_id}/deletReponses` | supprime toute les réponse correct | | GET | `/question/getReponse/{question_id}` | donne toutes les réponse correct sous forme de String |
| PUT | `/question/{question_id}/addReponse` | Ajoute une réponse à Reponse | | PUT | `/question/setReponse/{question_id}/{reponse_id}` | met à null l'objet réponse à la question |
| PUT | `/question/{question_id}/setReponse/choix` | créer un nouvel objet Reponse de type Choix pour la question | | PUT | `/question/setReponse/{question_id}/{reponse_id}` | Associe un objet ponse à la question |
| PUT | `/question/{question_id}/setReponse/reponseCourte` | créer un nouvel objet Reponse de type reponse courte pour la question | | PUT | `/question/delet/{question_id}` | supprime la question |
| PUT | `/question/{question_id}/addChoix` | rajoute un choix si Reponse est de type Choix |
## Auteurs ## Auteurs

231
pom.xml Normal file → Executable file
View File

@@ -1,89 +1,106 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" <project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 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> <modelVersion>4.0.0</modelVersion>
<groupId>fr.istic.taa</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>jaxrs-example</artifactId> <artifactId>spring-boot-sample-data-jpa</artifactId>
<packaging>jar</packaging> <version>3.1.2</version>
<version>1.0-SNAPSHOT</version> <name>Spring Boot Data JPA Sample</name>
<name>jaxrs-example</name> <description>Spring Boot Data JPA Sample</description>
<url>http://maven.apache.org</url> <url>http://projects.spring.io/spring-boot/</url>
<organization>
<name>Pivotal Software, Inc.</name>
<url>http://www.spring.io</url>
</organization>
<properties> <properties>
<maven.compiler.source>11</maven.compiler.source> <main.basedir>${basedir}/../..</main.basedir>
<maven.compiler.target>11</maven.compiler.target> <maven.compiler.source>17</maven.compiler.source>
<org.mapstruct.version>1.6.3</org.mapstruct.version> <maven.compiler.target>17</maven.compiler.target>
</properties> </properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.3</version>
<relativePath/>
</parent>
<dependencies> <dependencies>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency> <dependency>
<groupId>junit</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>junit</artifactId> <artifactId>spring-boot-starter-web</artifactId>
<version>4.12</version> </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<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> <scope>test</scope>
</dependency> </dependency>
<!-- ==== JPA / Hibernate ==== -->
<dependency> <dependency>
<groupId>org.hibernate</groupId> <groupId>org.springframework.security</groupId>
<artifactId>hibernate-core</artifactId> <artifactId>spring-security-test</artifactId>
<version>6.2.7.Final</version> <scope>test</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.slf4j</groupId> <groupId>com.mysql</groupId>
<artifactId>slf4j-log4j12</artifactId> <artifactId>mysql-connector-j</artifactId>
<version>1.7.30</version>
</dependency> </dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<dependency> <dependency>
<groupId>org.hsqldb</groupId> <groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId> <artifactId>hsqldb</artifactId>
<version>2.7.2</version> <version>2.7.2</version>
</dependency> </dependency>
<!-- https://mvnrepository.com/artifact/javax.validation/validation-api -->
<dependency> <dependency>
<groupId>com.mysql</groupId> <groupId>jakarta.validation</groupId>
<artifactId>mysql-connector-j</artifactId> <artifactId>jakarta.validation-api</artifactId>
<version>8.1.0</version> <version>3.1.1</version>
</dependency>
<!-- ==== REST API ==== -->
<!--https://mvnrepository.com/artifact/org.jboss.resteasy/resteasy-undertow -->
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-undertow</artifactId>
<version>6.2.4.Final</version>
</dependency>
<!--https://mvnrepository.com/artifact/org.jboss.resteasy/resteasy-jackson2-provider -->
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jackson2-provider</artifactId>
<version>6.2.4.Final</version>
</dependency>
<!--https://mvnrepository.com/artifact/org.jboss.resteasy/resteasy-jaxb-provider -->
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxb-provider</artifactId>
<version>6.2.4.Final</version>
</dependency>
<!-- OpenAPI-->
<!--https://mvnrepository.com/artifact/io.swagger.core.v3/swagger-jaxrs2-jakarta -->
<dependency>
<groupId>io.swagger.core.v3</groupId>
<artifactId>swagger-jaxrs2-jakarta</artifactId>
<version>2.2.15</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>io.swagger.core.v3</groupId> <groupId>com.h2database</groupId>
<artifactId>swagger-jaxrs2-servlet-initializer-v2</artifactId> <artifactId>h2</artifactId>
<version>2.2.15</version> <!-- <version>1.4.192</version> -->
</dependency> <version>2.2.224</version>
<scope>runtime</scope>
<!-- ==== MapStruct/ Lombok ==== -->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.6.3</version>
</dependency> </dependency>
<dependency> <dependency>
@@ -95,30 +112,98 @@
</dependencies> </dependencies>
<build> <build>
<defaultGoal>install</defaultGoal>
<plugins> <plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>3.1.2</version>
</plugin>
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId> <artifactId>maven-eclipse-plugin</artifactId>
<version>3.11.0</version>
<configuration> <configuration>
<source>11</source> <useProjectReferences>false</useProjectReferences>
<target>11</target> <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> <annotationProcessorPaths>
<path> <path>
<groupId>org.projectlombok</groupId> <groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId> <artifactId>lombok</artifactId>
<version>1.18.42</version> <version>1.18.42</version>
</path> </path>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.6.3</version>
</path>
</annotationProcessorPaths> </annotationProcessorPaths>
</configuration> </configuration>
</plugin> </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> </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> </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> </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 ./target/dependency/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 ./target/dependency/hsqldb-2.7.2.jar org.hsqldb.util.DatabaseManagerSwing --driver org.hsqldb.jdbcDriver --url jdbc:hsqldb:hsql://localhost/ --user SA

View File

@@ -1,60 +0,0 @@
package fr.istic.taa.jaxrs.DAO;
import java.io.Serializable;
import java.util.List;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityTransaction;
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 fr.istic.taa.jaxrs.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 fr.istic.taa.jaxrs.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,82 +0,0 @@
package fr.istic.taa.jaxrs.DAO;
import java.util.ArrayList;
import java.util.List;
import fr.istic.taa.jaxrs.metier.Choix;
import fr.istic.taa.jaxrs.metier.Question;
import fr.istic.taa.jaxrs.metier.Reponse;
import fr.istic.taa.jaxrs.metier.ReponseCourte;
import fr.istic.taa.jaxrs.metier.Session;
import fr.istic.taa.jaxrs.metier.Utilisateur;
import jakarta.persistence.EntityTransaction;
public class QuestionDAO extends AbstractJpaDao<Integer, Question> {
public QuestionDAO(){
super();
this.setClass(Question.class);
}
public void addReponse(String reponse, int questionId){
EntityTransaction t = em.getTransaction();
t.begin();
Question q = em.find(Question.class,questionId);
q.getReponse().getReponses().add(reponse);
em.merge(q);
t.commit();
}
public void deleteReponse( int questionId) {
EntityTransaction t = em.getTransaction();
t.begin();
Question q = em.find(Question.class,questionId);
q.getReponse().setReponses(new ArrayList<>());
em.merge(q);
t.commit();
}
public void setReponse(Reponse rep, Integer id) {
EntityTransaction t = em.getTransaction();
t.begin();
Question q = em.find(Question.class,id);
q.setReponse(rep);
em.merge(q);
t.commit();
}
public void setChoix(Integer id) {
setReponse(new Choix(),id);
}
public void setReponseCourte(Integer id) {
setReponse(new ReponseCourte(),id);
}
public void addChoix(Integer id, String choix) {
EntityTransaction t = em.getTransaction();
t.begin();
Question q = em.find(Question.class,id);
((Choix)q.getReponse()).getChoix().add(choix);
em.merge(q);
t.commit();
}
public void changeQuestion(String newQuestion, Integer id) {
EntityTransaction t = em.getTransaction();
t.begin();
Question q = em.find(Question.class,id);
q.setQuestion(newQuestion);
em.merge(q);
t.commit();
}
}

View File

@@ -1,32 +0,0 @@
package fr.istic.taa.jaxrs.DAO;
import fr.istic.taa.jaxrs.metier.Question;
import jakarta.persistence.EntityTransaction;
import fr.istic.taa.jaxrs.metier.Quizz;
public class QuizzDAO extends AbstractJpaDao<Integer, Quizz> {
public QuizzDAO(){
super();
this.setClass(Quizz.class);
}
public void deleteAllQustion(int quizz_id){
EntityTransaction et= em.getTransaction();
et.begin();
Quizz quizz = em.find(Quizz.class, quizz_id);
quizz.getQuestions().clear();
em.merge(quizz);
et.commit();
}
public void addQuestion(int quizz_id, int question_id){
EntityTransaction et= em.getTransaction();
et.begin();
Quizz quizz = em.find(Quizz.class, quizz_id);
Question question =em.find(Question.class, question_id);
quizz.getQuestions().add(question);
em.merge(quizz);
et.commit();
}
}

View File

@@ -1,19 +0,0 @@
package fr.istic.taa.jaxrs.DAO;
import fr.istic.taa.jaxrs.metier.Reponse;
public class ReponseDAO extends AbstractJpaDao<Integer, Reponse> {
public ReponseDAO(){
super();
this.setClass(Reponse.class);
}
/*public List<String> getGoodResponses(){
EntityTransaction t=em.getTransaction();
t.begin();
Query query=em.createQuery("select r from Reponse r where r.reponses");
List<String> lString=query.getResultList();
t.commit();
return lString;
}*/
}

View File

@@ -1,27 +0,0 @@
package fr.istic.taa.jaxrs.DAO;
import jakarta.persistence.EntityTransaction;
import jakarta.persistence.Query;
import fr.istic.taa.jaxrs.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){
EntityTransaction t=em.getTransaction();
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;
}
}
}

View File

@@ -1,40 +0,0 @@
package fr.istic.taa.jaxrs.DAO;
import jakarta.persistence.EntityTransaction;
import fr.istic.taa.jaxrs.metier.Session;
import fr.istic.taa.jaxrs.metier.Utilisateur;
import java.util.List;
public class UtilisateurDAO extends AbstractJpaDao<Integer, Utilisateur> {
public UtilisateurDAO() {
super();
this.setClass(Utilisateur.class);
}
public Utilisateur findByEmail(String email) {
List<Utilisateur> results =
em.createQuery("SELECT u FROM Utilisateur u WHERE u.email = :email", Utilisateur.class)
.setParameter("email", email).getResultList();
if (results.isEmpty()) {
return null;
} else {
return results.get(0);
}
}
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.getSession().add(s);
//Jsp il faut birectionnelle ou pas?
//s.getUtilisateurs().add(u);
em.merge(u);
t.commit();
}
}

View File

@@ -1,15 +0,0 @@
package fr.istic.taa.jaxrs.DTO;
import jakarta.xml.bind.annotation.XmlRootElement;
import lombok.Data;
import java.util.List;
@Data
@XmlRootElement
public class QuestionDTO {
private int id;
private String question;
private List<String> reponses_string;
}

View File

@@ -1,14 +0,0 @@
package fr.istic.taa.jaxrs.DTO;
import jakarta.xml.bind.annotation.XmlRootElement;
import lombok.Data;
import java.util.List;
@Data
@XmlRootElement
public class QuizzDTO {
private int id;
private Integer sessionId;
private Integer utilisateurId;
private List<Integer> questionsId;
}

View File

@@ -1,17 +0,0 @@
package fr.istic.taa.jaxrs.DTO;
import jakarta.xml.bind.annotation.XmlRootElement;
import lombok.Data;
import java.util.List;
@Data
@XmlRootElement
public class SessionDTO {
private String theme;
private int codePIN;
private int id;
private List<Integer> quizzsId;
private List<Integer> utilisateursId;
}

View File

@@ -1,13 +0,0 @@
package fr.istic.taa.jaxrs.DTO;
import jakarta.xml.bind.annotation.XmlRootElement;
import lombok.Data;
@Data
@XmlRootElement
public class UtilisateurDTO {
private int id;
private String name;
private String email;
private String password;
}

View File

@@ -1,28 +0,0 @@
package fr.istic.taa.jaxrs.Mapper;
import fr.istic.taa.jaxrs.DTO.QuestionDTO;
import fr.istic.taa.jaxrs.metier.Question;
import fr.istic.taa.jaxrs.metier.Reponse;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
import java.util.ArrayList;
import java.util.List;
@Mapper
public interface QuestionMapper {
QuestionMapper INSTANCE = Mappers.getMapper( QuestionMapper.class );
@Mapping(target = "reponses_string", expression = "java(question_ReponseString(question.getReponse()))")
QuestionDTO toDTO(Question question);
Question toEntity(QuestionDTO questionDTO);
List<QuestionDTO> toDTOs(List<Question> questionList);
default List<String> question_ReponseString(Reponse reponse){
return reponse.getReponses();
}
}

View File

@@ -1,34 +0,0 @@
package fr.istic.taa.jaxrs.Mapper;
import fr.istic.taa.jaxrs.DTO.QuizzDTO;
import fr.istic.taa.jaxrs.metier.Question;
import fr.istic.taa.jaxrs.metier.Quizz;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
import java.util.ArrayList;
import java.util.List;
@Mapper
public interface QuizzMapper {
QuizzMapper INSTANCE = Mappers.getMapper( QuizzMapper.class );
//https://www.baeldung.com/mapstruct-map-source-object-target-list
//https://mapstruct.org/
@Mapping(target="sessionId", source="session.id")
@Mapping(target="utilisateurId", source = "utilisateur.id")
@Mapping(target="questionsId",expression="java(function_mapQ(quizz.getQuestions()))")
QuizzDTO toDTO(Quizz quizz);
Quizz toEntity(QuizzDTO quizzDTO);
List<QuizzDTO> toDTOs(List<Quizz> quizzes);
default List<Integer> function_mapQ(List<Question> questionList){
List<Integer> list=new ArrayList<Integer>();
for(Question question : questionList){
list.add(question.getId());
}
return list;
}
}

View File

@@ -1,42 +0,0 @@
package fr.istic.taa.jaxrs.Mapper;
import fr.istic.taa.jaxrs.DTO.SessionDTO;
import fr.istic.taa.jaxrs.metier.Quizz;
import fr.istic.taa.jaxrs.metier.Session;
import fr.istic.taa.jaxrs.metier.Utilisateur;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
import java.util.ArrayList;
import java.util.List;
@Mapper
public interface SessionMapper {
SessionMapper INSTANCE = Mappers.getMapper( SessionMapper.class );
@Mapping(target="utilisateursId",expression="java(function_mapU(session.getUtilisateurs()))")
@Mapping(target="quizzsId",expression="java(function_mapQ(session.getQuizzs()))")
SessionDTO toDTO(Session session);
Session toEntity(SessionDTO sessionDTO);
List<SessionDTO> toDTOs(List<Session> sessions);
//https://www.baeldung.com/mapstruct-map-source-object-target-list
default List<Integer> function_mapU(List<Utilisateur> utilisateurList) {
List<Integer> result = new ArrayList<>();
for (Utilisateur utilisateur : utilisateurList) {
result.add(utilisateur.getId());
}
return result;
}
default List<Integer> function_mapQ(List<Quizz> quizzList) {
List<Integer> result = new ArrayList<>();
for (Quizz quizz : quizzList) {
result.add(quizz.getId());
}
return result;
}
}

View File

@@ -1,19 +0,0 @@
package fr.istic.taa.jaxrs.Mapper;
import fr.istic.taa.jaxrs.DTO.UtilisateurDTO;
import fr.istic.taa.jaxrs.metier.Utilisateur;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
import java.util.List;
@Mapper
public interface UtilisateurMapper {
UtilisateurMapper INSTANCE = Mappers.getMapper(UtilisateurMapper.class);
UtilisateurDTO toDTO(Utilisateur utilisateur);
Utilisateur toEntity(UtilisateurDTO dto);
List<UtilisateurDTO> toDTOs(List<Utilisateur> utilisateurList);
}

View File

@@ -1,28 +0,0 @@
package fr.istic.taa.jaxrs;
import io.undertow.Undertow;
import org.jboss.resteasy.plugins.server.undertow.UndertowJaxrsServer;
import java.util.logging.Logger;
/**
* RESTfull microservice, based on JAX-RS and JBoss Undertow
*
*/
public class RestServer {
private static final Logger logger = Logger.getLogger(RestServer.class.getName());
public static void main(String[] args) {
UndertowJaxrsServer ut = new UndertowJaxrsServer();
TestApplication ta = new TestApplication();
ut.deploy(ta);
ut.start(
Undertow.builder()
.addHttpListener(8080, "localhost")
);
logger.info("JAX-RS based micro-service running!");
}
}

View File

@@ -1,46 +0,0 @@
/**
* JBoss, Home of Professional Open Source
* Copyright Red Hat, Inc., and individual contributors.
*
* 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 fr.istic.taa.jaxrs;
import java.util.HashSet;
import java.util.Set;
import fr.istic.taa.jaxrs.rest.*;
import io.swagger.v3.jaxrs2.integration.resources.OpenApiResource;
import jakarta.ws.rs.ApplicationPath;
import jakarta.ws.rs.core.Application;
@ApplicationPath("/")
public class TestApplication extends Application {
@Override
public Set<Class<?>> getClasses() {
final Set<Class<?>> clazzes = new HashSet<Class<?>>();
clazzes.add(OpenApiResource.class);
clazzes.add(PetResource.class);
clazzes.add(QuestionResource.class);
clazzes.add(QuizzResource.class);
clazzes.add(UtilisateurResource.class);
clazzes.add(SessionResource.class);
clazzes.add(SwaggerResource.class);
return clazzes;
}
}

View File

@@ -1,44 +0,0 @@
package fr.istic.taa.jaxrs.domain;
import java.util.ArrayList;
import java.util.List;
import io.swagger.v3.oas.models.tags.Tag;
import jakarta.xml.bind.annotation.XmlElement;
import jakarta.xml.bind.annotation.XmlElementWrapper;
import jakarta.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "Pet")
public class Pet {
private long id;
private String name;
private List<Tag> tags = new ArrayList<Tag>();
@XmlElement(name = "id")
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
@XmlElement(name = "name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@XmlElementWrapper(name = "tags")
@XmlElement(name = "tag")
public List<Tag> getTags() {
return tags;
}
public void setTags(List<Tag> tags) {
this.tags = tags;
}
}

View File

@@ -1,28 +0,0 @@
package fr.istic.taa.jaxrs.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 fr.istic.taa.jaxrs.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 "INPUT";
}
}

View File

@@ -1,38 +0,0 @@
package fr.istic.taa.jaxrs.rest;
import fr.istic.taa.jaxrs.domain.Pet;
import io.swagger.v3.oas.annotations.Parameter;
import jakarta.ws.rs.Consumes;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.POST;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.PathParam;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.Response;
@Path("pet")
@Produces({"application/json", "application/xml"})
public class PetResource {
@GET
@Path("/{petId}")
public Pet getPetById(@PathParam("petId") Long petId) {
// return pet
return new Pet();
}
@GET
@Path("/")
public Pet getPet(Long petId) {
return new Pet();
}
@POST
@Consumes("application/json")
public Response addPet(
@Parameter(description = "Pet object that needs to be added to the store", required = true) Pet pet) {
// add pet
return Response.ok().entity("SUCCESS").build();
}
}

View File

@@ -1,133 +0,0 @@
package fr.istic.taa.jaxrs.rest;
import java.util.List;
import fr.istic.taa.jaxrs.DAO.QuestionDAO;
import fr.istic.taa.jaxrs.DTO.QuestionDTO;
import fr.istic.taa.jaxrs.Mapper.QuestionMapper;
import fr.istic.taa.jaxrs.metier.Choix;
import fr.istic.taa.jaxrs.metier.Question;
import fr.istic.taa.jaxrs.metier.Reponse;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import jakarta.ws.rs.Consumes;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.PATCH;
import jakarta.ws.rs.PUT;
import jakarta.ws.rs.POST;
import jakarta.ws.rs.DELETE;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.PathParam;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.Response;
@Path("question")
@Consumes({"application/json", "application/xml"})
@Produces({"application/json", "application/xml"})
public class QuestionResource {
private final QuestionDAO questionDAO = new QuestionDAO();
private final QuestionMapper mapper = QuestionMapper.INSTANCE;
@GET
public List<Question> listQuestion(){
List<Question> questions = questionDAO.findAll();
return questions;
}
@POST
@Path("/addQuestion")
public Response addQuestion(QuestionDTO dto){
Question question = mapper.toEntity(dto);
questionDAO.create(question);
return Response.status(Response.Status.CREATED).entity("Question ajouté avec Succès : \"" + dto.getQuestion() + "\"").build();
}
@PUT
@Path("/{question_id}/changeQuestion/")
public Response changeQuestion(@PathParam("question_id") Integer id, String newQuestion){
Question question = questionDAO.findById(id);
if(question == null){
return Response.status(Response.Status.NOT_FOUND).build();
}
questionDAO.changeQuestion(newQuestion,id);
return Response.status(Response.Status.CREATED).entity("Question mis à jour : " + newQuestion).build();
}
@GET
@Path("/{question_id}/getReponse/")
public Response getReponse(@PathParam("question_id") Integer id){
Question question = questionDAO.findById(id);
if(question == null){
return Response.status(Response.Status.NOT_FOUND).build();
}
Reponse result = question.getReponse();
return Response.ok(result).build();
}
@PUT
@Path("/{question_id}/addReponse/")
public Response addReponse(@PathParam("question_id") Integer id, String reponse){
Question question = questionDAO.findById(id);
if(question == null){
return Response.status(Response.Status.NOT_FOUND).build();
}
questionDAO.addReponse(reponse,id);
return Response.status(Response.Status.CREATED).entity("Reponse correct \""+reponse+"\" ajouté à la question " + id).build();
}
@DELETE
@Path("/{question_id}/deletReponses/")
public Response addReponse(@PathParam("question_id") Integer id){
Question question = questionDAO.findById(id);
if(question == null){
return Response.status(Response.Status.NOT_FOUND).build();
}
questionDAO.deleteReponse(id);
return Response.status(Response.Status.CREATED).entity("Reponses supprimé de la question " + id).build();
}
@PUT
@Path("/{question_id}/setReponse/choix")
public Response setChoix(@PathParam("question_id") Integer id){
Question question = questionDAO.findById(id);
if(question == null){
return Response.status(Response.Status.NOT_FOUND).build();
}
questionDAO.setChoix(id);
return Response.status(Response.Status.CREATED).entity("Reponses à choix multiple mise sur la question " + id).build();
}
@PUT
@Path("/{question_id}/setReponse/reponseCourte")
public Response setReponseCourte(@PathParam("question_id") Integer id){
Question question = questionDAO.findById(id);
if(question == null){
return Response.status(Response.Status.NOT_FOUND).build();
}
questionDAO.setReponseCourte(id);
return Response.status(Response.Status.CREATED).entity("Reponses courte mise sur la question " + id).build();
}
@PUT
@Path("/{question_id}/AddChoix")
public Response addChoix(@PathParam("question_id") Integer id, String choix){
Question question = questionDAO.findById(id);
if(question == null){
return Response.status(Response.Status.NOT_FOUND).build();
}
if(question.getReponse() instanceof Choix){
return Response.status(Response.Status.EXPECTATION_FAILED).build();
}
questionDAO.addChoix(id, choix);
return Response.status(Response.Status.CREATED).entity("Reponses courte mise sur la question " + id).build();
}
}

View File

@@ -1,73 +0,0 @@
package fr.istic.taa.jaxrs.rest;
import fr.istic.taa.jaxrs.DAO.QuestionDAO;
import fr.istic.taa.jaxrs.DAO.QuizzDAO;
import fr.istic.taa.jaxrs.DTO.QuestionDTO;
import fr.istic.taa.jaxrs.DTO.QuizzDTO;
import fr.istic.taa.jaxrs.Mapper.QuestionMapper;
import fr.istic.taa.jaxrs.Mapper.QuizzMapper;
import fr.istic.taa.jaxrs.metier.Question;
import fr.istic.taa.jaxrs.metier.Quizz;
import jakarta.ws.rs.*;
import jakarta.ws.rs.core.Response;
import java.util.List;
@Path("quizz")
@Consumes({"application/json", "application/xml"})
@Produces({"application/json", "application/xml"})
public class QuizzResource {
public final QuizzMapper mapper = QuizzMapper.INSTANCE;
public final QuizzDAO quizzDAO= new QuizzDAO();
public final QuestionDAO questionDAO = new QuestionDAO();
@GET
@Path("/{quizz_id}")
public Response getQuizzById(@PathParam("quizz_id") Integer quizzId) {
Quizz quizz = quizzDAO.findById(quizzId);
if (quizz == null) {
return Response.status(Response.Status.NOT_FOUND).build();
}
QuizzDTO dto = mapper.toDTO(quizz);
return Response.status(Response.Status.OK).entity(dto).build();
}
@GET
@Path("/{quizz_id}/questions")
public Response getQuestions(@PathParam("quizz_id") Integer quizzId) {
Quizz quizz = quizzDAO.findById(quizzId);
if (quizz == null) {
return Response.status(Response.Status.NOT_FOUND).build();
}
List<Question> questionList= quizz.getQuestions();
List<QuestionDTO> dtos = QuestionMapper.INSTANCE.toDTOs(questionList);
return Response.status(Response.Status.OK).entity(dtos).build();
}
@PUT
@Path("/{quizz_id}/add_question/{question_id}")
public Response addQuestion(@PathParam("quizz_id") Integer quizzId, @PathParam("question_id") Integer questionId) {
Quizz quizz = quizzDAO.findById(quizzId);
Question question = questionDAO.findById(questionId);
if (quizz == null || question == null) {
return Response.status(Response.Status.NOT_FOUND).build();
}
quizzDAO.addQuestion(quizzId,questionId);
quizzDAO.update(quizz);
QuizzDTO quizzDTO = mapper.toDTO(quizz);
return Response.status(Response.Status.OK).entity(quizzDTO).build();
}
@PUT
@Path("/{quizz_id}/deleteQ")
public Response deleteQuestion(@PathParam("quizz_id") Integer quizzId) {
Quizz quizz = quizzDAO.findById(quizzId);
if (quizz == null) {
return Response.status(Response.Status.NOT_FOUND).build();
}
quizzDAO.deleteAllQustion(quizzId);
quizzDAO.update(quizz);
return Response.status(Response.Status.OK).build();
}
}

View File

@@ -1,75 +0,0 @@
package fr.istic.taa.jaxrs.rest;
import fr.istic.taa.jaxrs.DAO.SessionDAO;
import fr.istic.taa.jaxrs.DTO.QuizzDTO;
import fr.istic.taa.jaxrs.DTO.SessionDTO;
import fr.istic.taa.jaxrs.DTO.UtilisateurDTO;
import fr.istic.taa.jaxrs.Mapper.QuizzMapper;
import fr.istic.taa.jaxrs.Mapper.SessionMapper;
import fr.istic.taa.jaxrs.Mapper.UtilisateurMapper;
import fr.istic.taa.jaxrs.metier.Session;
import fr.istic.taa.jaxrs.metier.Utilisateur;
import jakarta.ws.rs.*;
import jakarta.ws.rs.core.Response;
import java.util.List;
@Path("session")
@Consumes({"application/json", "application/xml"})
@Produces({"application/json", "application/xml"})
public class SessionResource {
private final SessionDAO sessionDAO = new SessionDAO();
private final SessionMapper mapper = SessionMapper.INSTANCE;
@GET
public List<Session> listSession() {
List<Session> sessions = sessionDAO.findAll();
return sessions;
}
@GET
@Path("/{id}")
public Response getSession(@PathParam("id") Integer id) {
Session session = sessionDAO.findById(id);
if (session == null) {
return Response.status(Response.Status.NOT_FOUND).build();
}
SessionDTO result = mapper.toDTO(session);
return Response.status(Response.Status.OK).entity(result).build();
}
@GET
@Path("/{session_id}/quizzs")
public Response getQuizzs(@PathParam("session_id") Integer sessionId) {
Session session = sessionDAO.findById(sessionId);
if (session == null) {
return Response.status(Response.Status.NOT_FOUND).build();
}
List<QuizzDTO> results= QuizzMapper.INSTANCE.toDTOs(session.getQuizzs());
return Response.status(Response.Status.OK).entity(results).build();
}
@GET
@Path("/{session_id}/utilisateurs")
public Response getUtilisateurs(@PathParam("session_id") Integer sessionId) {
Session session = sessionDAO.findById(sessionId);
if (session == null) {
return Response.status(Response.Status.NOT_FOUND).build();
}
List<Utilisateur> utilisateurList= session.getUtilisateurs();
List<UtilisateurDTO> dtos= UtilisateurMapper.INSTANCE.toDTOs(utilisateurList);
return Response.status(Response.Status.OK).entity(dtos).build();
}
@DELETE
@Path("/{session_id}/delete")
public Response deleteSession(@PathParam("session_id") Integer sessionId) {
Session session = sessionDAO.findById(sessionId);
if (session == null) {
return Response.status(Response.Status.NOT_FOUND).build();
}
sessionDAO.delete(session);
return Response.status(Response.Status.OK).entity("Réussi de supprimer").build();
}
}

View File

@@ -1,35 +0,0 @@
package fr.istic.taa.jaxrs.rest;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.util.logging.Logger;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.PathParam;
@Path("/api")
public class SwaggerResource {
private static final Logger logger = Logger.getLogger(SwaggerResource.class.getName());
@GET
public byte[] Get1() {
try {
return Files.readAllBytes(FileSystems.getDefault().getPath("src/main/webapp/swagger/index.html"));
} catch (IOException e) {
return null;
}
}
@GET
@Path("{path:.*}")
public byte[] Get(@PathParam("path") String path) {
try {
return Files.readAllBytes(FileSystems.getDefault().getPath("src/main/webapp/swagger/"+path));
} catch (IOException e) {
return null;
}
}
}

View File

@@ -1,142 +0,0 @@
package fr.istic.taa.jaxrs.rest;
import fr.istic.taa.jaxrs.DAO.SessionDAO;
import fr.istic.taa.jaxrs.DAO.UtilisateurDAO;
import fr.istic.taa.jaxrs.DTO.SessionDTO;
import fr.istic.taa.jaxrs.DTO.UtilisateurDTO;
import fr.istic.taa.jaxrs.Mapper.SessionMapper;
import fr.istic.taa.jaxrs.Mapper.UtilisateurMapper;
import fr.istic.taa.jaxrs.metier.Question;
import fr.istic.taa.jaxrs.metier.Session;
import fr.istic.taa.jaxrs.metier.Utilisateur;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import jakarta.ws.rs.*;
import jakarta.ws.rs.core.Response;
import java.util.List;
@Path("utilisateur")
@Consumes({"application/json", "application/xml"})
@Produces({"application/json", "application/xml"})
public class UtilisateurResource {
private final UtilisateurDAO utilisateurDAO = new UtilisateurDAO();
private final UtilisateurMapper mapper = UtilisateurMapper.INSTANCE;
@GET
public List<Utilisateur> listUtilisateur() {
List<Utilisateur> utilisateurs = utilisateurDAO.findAll();
return utilisateurs;
}
@POST
@Path("/register")
public Response registerUtilisateur(UtilisateurDTO dto) {
String email_verification = dto.getEmail();
Utilisateur existing = utilisateurDAO.findByEmail(email_verification);
//VERIFACTION S'IL EXISTE DANS BDD
if (existing != null) {
return Response.status(Response.Status.CONFLICT).entity("Email est déjà registré").build();
}
Utilisateur utilisateur = mapper.toEntity(dto);
utilisateurDAO.create(utilisateur);
return Response.status(Response.Status.CREATED).entity("Registration succès").build();
}
@POST
@Path("/login")
public Response loginUtilisateur(UtilisateurDTO dto) {
Utilisateur utilisateur = utilisateurDAO.findByEmail(dto.getEmail());
if (utilisateur == null) {
return Response.status(Response.Status.NOT_FOUND).entity("Email n'existe pas").build();
} else if (!utilisateur.getPassword().equals(dto.getPassword())) {
return Response.status(Response.Status.UNAUTHORIZED).entity("Mauvais mdp").build();
}
UtilisateurDTO result = mapper.toDTO(utilisateur);
return Response.status(Response.Status.OK).entity(result).build();
}
@GET
@Path("/{id}")
@Operation(summary = "Get user by ID",
tags = {"utilisateur"},
description = "Get User by ID",
responses = {
@ApiResponse(description = "Utilisateur", content = @Content(
schema = @Schema(implementation = Utilisateur.class)
)),
@ApiResponse(responseCode = "400", description = "Invalid ID supplied"),
@ApiResponse(responseCode = "404", description = "User not found")
})
public Response getUtilisateur(@Parameter(
description = "ID of user that needs to be fetched",
schema = @Schema(
type = "integer",
format = "int32",
description = "param ID of user that needs to be fetched"
),
required = true)
@PathParam("id") Integer id) {
Utilisateur utilisateur = utilisateurDAO.findById(id);
if (utilisateur == null) {
return Response.status(Response.Status.NOT_FOUND).build();
}
UtilisateurDTO result = mapper.toDTO(utilisateur);
return Response.ok(result).build();
}
@PUT
@Path("/{user_id}/add_session/{session_id}")
public Response addSession(@PathParam("user_id") Integer user_id, @PathParam("session_id") Integer session_id) {
SessionDAO sessionDAO = new SessionDAO();
Session existingSession = sessionDAO.findById(session_id);
Utilisateur utilisateur = utilisateurDAO.findById(user_id);
if (existingSession == null || utilisateur == null) {
return Response.status(Response.Status.NOT_FOUND).build();
}
//If user already joined
if (utilisateur.getSession().contains(existingSession)) {
return Response.status(Response.Status.CONFLICT).build();
}
utilisateurDAO.addToSession(user_id, session_id);
utilisateurDAO.update(utilisateur);
// We update it so have to return new DTO
UtilisateurDTO dto = mapper.toDTO(utilisateur);
return Response.status(Response.Status.OK).entity(dto).build();
}
@GET
@Path("{user_id}/session")
public Response listSession(@PathParam("user_id") Integer user_id) {
Utilisateur utilisateur = utilisateurDAO.findById(user_id);
if (utilisateur == null) {
return Response.status(Response.Status.NOT_FOUND).build();
}
List<Session> sess = utilisateur.getSession();
List<SessionDTO> dtos = SessionMapper.INSTANCE.toDTOs(sess);
return Response.status(Response.Status.OK).entity(dtos).build();
}
@DELETE
@Path("{user_id}/delete")
public Response deleteUtilisateur(@PathParam("user_id") Integer user_id) {
Utilisateur existing = utilisateurDAO.findById(user_id);
if (existing == null) {
return Response.status(Response.Status.NOT_FOUND).build();
}
utilisateurDAO.delete(existing);
return Response.status(Response.Status.OK).build();
}
}

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 fr.istic.taa.jaxrs.metier; package sample.data.jpa.metier;
import jakarta.persistence.*; import jakarta.persistence.*;
import lombok.Getter; import lombok.Getter;
@@ -15,7 +15,7 @@ public class Question implements Serializable {
@Id @Id
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)
private int id; private int id;
private String question; private String enonce;
@OneToOne(cascade = CascadeType.ALL) @OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name ="bonne_reponse", referencedColumnName = "id") @JoinColumn(name ="bonne_reponse", referencedColumnName = "id")
@@ -24,4 +24,16 @@ public class Question implements Serializable {
@ManyToOne @ManyToOne
@JoinColumn(name="id_quizz") @JoinColumn(name="id_quizz")
private Quizz 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 fr.istic.taa.jaxrs.metier; package sample.data.jpa.metier;
import jakarta.persistence.*; import jakarta.persistence.*;
import lombok.Getter; import lombok.Getter;
@@ -18,12 +18,12 @@ public class Quizz implements Serializable {
@GeneratedValue @GeneratedValue
private int id; private int id;
@ManyToOne @ManyToMany
private Session session; private List<Session> sessions = new ArrayList<Session>();
@ManyToOne @ManyToOne
@JoinColumn(name="id_utilisateur") @JoinColumn(name="id_utilisateur")
private Utilisateur utilisateur; private Utilisateur createur;
@OneToMany(mappedBy = "quizz") @OneToMany(mappedBy = "quizz")
private List<Question> questions=new ArrayList<Question>(); private List<Question> questions=new ArrayList<Question>();

View File

@@ -1,6 +1,7 @@
package fr.istic.taa.jaxrs.metier; package sample.data.jpa.metier;
import java.io.Serializable; import java.io.Serializable;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import jakarta.persistence.*; import jakarta.persistence.*;
@@ -22,9 +23,23 @@ public abstract class Reponse implements Serializable {
@OneToOne @OneToOne
private Question question; private Question question;
public List<String> reponses; public List<String> reponses = new ArrayList<String>();
public String valHTML(){ public String valHTML(){
return ""; 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 fr.istic.taa.jaxrs.metier; package sample.data.jpa.metier;
import java.io.Serializable; import java.io.Serializable;
import java.util.ArrayList; import java.util.ArrayList;
@@ -21,10 +21,10 @@ public class Session implements Serializable {
@Column(unique=true) @Column(unique=true)
private int codePIN; private int codePIN;
@OneToMany(mappedBy="session") @ManyToMany(mappedBy="sessions")
private List<Quizz> quizzs = new ArrayList<>(); private List<Quizz> quizzs = new ArrayList<>();
@ManyToMany(mappedBy = "session") @ManyToMany(mappedBy = "sessions")
private List<Utilisateur> utilisateurs = new ArrayList<>(); private List<Utilisateur> utilisateurs = new ArrayList<>();
private String theme; private String theme;
} }

View File

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

@@ -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

@@ -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