master #16
							
								
								
									
										77
									
								
								.drone.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								.drone.yml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,77 @@ | |||||||
|  | --- | ||||||
|  | kind: pipeline | ||||||
|  | type: docker | ||||||
|  | name: test | ||||||
|  |  | ||||||
|  | steps:  | ||||||
|  |   - name: Backend-Tests | ||||||
|  |     image: eclipse-temurin:21 | ||||||
|  |     workspace: backend/ | ||||||
|  |     commands: | ||||||
|  |       - echo "Backend CI Test TODO" | ||||||
|  |   - name: FrontEnd-Tests | ||||||
|  |     image: node:lts-alpine | ||||||
|  |     workspace: frontend/ | ||||||
|  |     commands: | ||||||
|  |       - echo "Frontend CI Test TODO" | ||||||
|  |  | ||||||
|  | --- | ||||||
|  | kind: pipeline | ||||||
|  | type: docker | ||||||
|  | name: build | ||||||
|  |  | ||||||
|  | depends_on: | ||||||
|  |   - test | ||||||
|  |  | ||||||
|  | steps:  | ||||||
|  |   - name: Backend-build | ||||||
|  |     image: eclipse-temurin:21 | ||||||
|  |     workspace: backend/ | ||||||
|  |     commands: | ||||||
|  |       - echo "Backend CI build TODO" | ||||||
|  |   - name: FrontEnd-build | ||||||
|  |     image: node:lts-alpine | ||||||
|  |     workspace: frontend/ | ||||||
|  |     commands: | ||||||
|  |       - echo "Frontend CI build TODO" | ||||||
|  |  | ||||||
|  | --- | ||||||
|  | kind: pipeline | ||||||
|  | type: exec | ||||||
|  | name: deploy | ||||||
|  |  | ||||||
|  | depends_on: | ||||||
|  |   - build | ||||||
|  |  | ||||||
|  | server: | ||||||
|  |   host: | ||||||
|  |     from_secret: host | ||||||
|  |   user: | ||||||
|  |     from_secret: user | ||||||
|  |   ssh_key:  | ||||||
|  |     from_secret: ssh_key  | ||||||
|  |  | ||||||
|  | plateform: | ||||||
|  |   os: linux | ||||||
|  |   arch: amd64 | ||||||
|  |  | ||||||
|  | trigger: | ||||||
|  |   branch: | ||||||
|  |     - master | ||||||
|  |   event: | ||||||
|  |     - push | ||||||
|  |  | ||||||
|  | steps: | ||||||
|  |   - name: deploy frontend | ||||||
|  |     commands: | ||||||
|  |       - cd frontend | ||||||
|  |       - npm run build | ||||||
|  |       - install -d "dist/" "$HOME/dist" | ||||||
|  |   - name: deploy backend  | ||||||
|  |     commands: | ||||||
|  |       - echo "deploying backend TODO" | ||||||
|  | --- | ||||||
|  | kind: signature | ||||||
|  | hmac: 3c5387c57626f0946636d82b97fad0daaf09dbb5f02f201791363ff33cc0bb82 | ||||||
|  |  | ||||||
|  | ... | ||||||
| @ -18,6 +18,10 @@ tags: | |||||||
|     description: Scientifics articles extension's endpoints |     description: Scientifics articles extension's endpoints | ||||||
|   - name: Ext (Schedule) |   - name: Ext (Schedule) | ||||||
|     description: Schedule extension's endpoints |     description: Schedule extension's endpoints | ||||||
|  |   - name: Ext (Student Registration) | ||||||
|  |     description: Student Registration's endpoints | ||||||
|  |   - name: Ext (Messaging) | ||||||
|  |     description: Messaging extension's endpoints | ||||||
|  |  | ||||||
| paths: | paths: | ||||||
|   /ping: |   /ping: | ||||||
| @ -31,6 +35,662 @@ paths: | |||||||
|               schema: |               schema: | ||||||
|                 type: string |                 type: string | ||||||
|                 example: pong |                 example: pong | ||||||
|  |   # Messaging | ||||||
|  |  | ||||||
|  |   /forum: | ||||||
|  |     get: | ||||||
|  |       summary: get list of available forum | ||||||
|  |       security: | ||||||
|  |         - bearer: [] | ||||||
|  |       tags: | ||||||
|  |         - Ext (Messaging) | ||||||
|  |         - Forum | ||||||
|  |       responses: | ||||||
|  |         '200': | ||||||
|  |           description: OK | ||||||
|  |           content: | ||||||
|  |             application/json: | ||||||
|  |               schema: | ||||||
|  |                 type: array  | ||||||
|  |                 items: | ||||||
|  |                   type: object | ||||||
|  |                   required: | ||||||
|  |                     - id | ||||||
|  |                     - name | ||||||
|  |                     - owner | ||||||
|  |                   properties: | ||||||
|  |                     id: | ||||||
|  |                       type: integer | ||||||
|  |                     name: | ||||||
|  |                       type: string | ||||||
|  |                     owner: | ||||||
|  |                       type: integer | ||||||
|  |                       description: user id of the teacher  | ||||||
|  |         '401': | ||||||
|  |           $ref: '#/components/responses/UnauthorizedError' | ||||||
|  |     post: | ||||||
|  |       summary: Create a new forum | ||||||
|  |       security: | ||||||
|  |         - bearer: [] | ||||||
|  |       tags: | ||||||
|  |         - Ext (Messaging) | ||||||
|  |         - Forum | ||||||
|  |       requestBody: | ||||||
|  |         required: true | ||||||
|  |         content: | ||||||
|  |           application/x-www-form-urlencoded: | ||||||
|  |             schema: | ||||||
|  |               type: object | ||||||
|  |               properties: | ||||||
|  |                 name: | ||||||
|  |                   type: string | ||||||
|  |                 courseId: | ||||||
|  |                   type: integer | ||||||
|  |       responses: | ||||||
|  |         '201': | ||||||
|  |           description: User created | ||||||
|  |         '401': | ||||||
|  |           $ref: '#/components/responses/UnauthorizedError' | ||||||
|  |   /forum/{forumId}: | ||||||
|  |     parameters: | ||||||
|  |       - name: forumId  | ||||||
|  |         in: path | ||||||
|  |         description: Id of the forum | ||||||
|  |         required: true | ||||||
|  |         schema: | ||||||
|  |           type: integer | ||||||
|  |     get: | ||||||
|  |       summary: get informations about a forum | ||||||
|  |       tags: | ||||||
|  |         - Ext (Messaging) | ||||||
|  |         - Forum | ||||||
|  |       responses: | ||||||
|  |         '200': | ||||||
|  |           description: OK | ||||||
|  |           content: | ||||||
|  |             application/json: | ||||||
|  |               schema: | ||||||
|  |                 type: array  | ||||||
|  |                 items: | ||||||
|  |                   type: object | ||||||
|  |                   required: | ||||||
|  |                     - id | ||||||
|  |                     - name | ||||||
|  |                     - owner | ||||||
|  |                   properties: | ||||||
|  |                     id: | ||||||
|  |                       type: integer | ||||||
|  |                     name: | ||||||
|  |                       type: string | ||||||
|  |                     owner: | ||||||
|  |                       type: integer | ||||||
|  |                       description: user id of the teacher  | ||||||
|  |                     topics: | ||||||
|  |                       type: array | ||||||
|  |                       items: | ||||||
|  |                         type: object | ||||||
|  |                         properties: | ||||||
|  |                           id: | ||||||
|  |                             type: integer | ||||||
|  |                           name: | ||||||
|  |                             type: string | ||||||
|  |                           autor: | ||||||
|  |                             type: integer | ||||||
|  |                             description: user Id | ||||||
|  |                     registered: | ||||||
|  |                       description: List of registered user only if have the authorisation to view | ||||||
|  |                       type: array | ||||||
|  |                       items: | ||||||
|  |                         type: integer  | ||||||
|  |                         description: userId | ||||||
|  |         '401': | ||||||
|  |           $ref: '#/components/responses/UnauthorizedError' | ||||||
|  |     delete: | ||||||
|  |       summary: remove the forum | ||||||
|  |       security: | ||||||
|  |         - bearer: [] | ||||||
|  |       tags: | ||||||
|  |         - Ext (Messaging) | ||||||
|  |         - Forum | ||||||
|  |       responses: | ||||||
|  |         '201': | ||||||
|  |           description: Forum deleted | ||||||
|  |         '401': | ||||||
|  |           $ref: '#/components/responses/UnauthorizedError' | ||||||
|  |   /forum/{forumId}/topic: | ||||||
|  |     parameters: | ||||||
|  |       - name: forumId  | ||||||
|  |         in: path | ||||||
|  |         description: Id of the forum | ||||||
|  |         required: true | ||||||
|  |         schema: | ||||||
|  |           type: integer | ||||||
|  |     get: | ||||||
|  |       summary: list topics of a forum | ||||||
|  |       tags: | ||||||
|  |         - Ext (Messaging) | ||||||
|  |         - Forum | ||||||
|  |       responses: | ||||||
|  |         '200': | ||||||
|  |           description: OK | ||||||
|  |           content: | ||||||
|  |             application/json: | ||||||
|  |               schema: | ||||||
|  |                 type: array  | ||||||
|  |                 items: | ||||||
|  |                   type: object | ||||||
|  |                   required: | ||||||
|  |                     - id | ||||||
|  |                     - name | ||||||
|  |                     - author | ||||||
|  |                   properties: | ||||||
|  |                     id: | ||||||
|  |                       type: integer | ||||||
|  |                     name: | ||||||
|  |                       type: string | ||||||
|  |                     author: | ||||||
|  |                       type: integer | ||||||
|  |                       description: user id of the author | ||||||
|  |         '401': | ||||||
|  |           $ref: '#/components/responses/UnauthorizedError' | ||||||
|  |     post: | ||||||
|  |       summary: create a new topic in the forum | ||||||
|  |       tags: | ||||||
|  |         - Ext (Messaging) | ||||||
|  |         - Forum | ||||||
|  |       requestBody: | ||||||
|  |         required: true | ||||||
|  |         content: | ||||||
|  |           application/x-www-form-urlencoded: | ||||||
|  |             schema: | ||||||
|  |               type: object | ||||||
|  |               properties: | ||||||
|  |                 subject: | ||||||
|  |                   type: string | ||||||
|  |                 content: | ||||||
|  |                   type: integer | ||||||
|  |       responses: | ||||||
|  |         '201': | ||||||
|  |           description: post created | ||||||
|  |         '401': | ||||||
|  |           $ref: '#/components/responses/UnauthorizedError' | ||||||
|  |   /forum/{forumId}/topic/{topicId}: | ||||||
|  |     parameters: | ||||||
|  |       - name: forumId  | ||||||
|  |         in: path | ||||||
|  |         description: Id of the forum | ||||||
|  |         required: true | ||||||
|  |         schema: | ||||||
|  |           type: integer | ||||||
|  |       - name: topicId  | ||||||
|  |         in: path | ||||||
|  |         description: Id of the topic  | ||||||
|  |         required: true | ||||||
|  |         schema: | ||||||
|  |           type: integer | ||||||
|  |     get: | ||||||
|  |       summary: get info about a topic | ||||||
|  |       tags: | ||||||
|  |         - Ext (Messaging) | ||||||
|  |         - Forum | ||||||
|  |       responses: | ||||||
|  |         '200': | ||||||
|  |           description: OK | ||||||
|  |           content: | ||||||
|  |             application/json: | ||||||
|  |               schema: | ||||||
|  |                 type: object | ||||||
|  |                 required: | ||||||
|  |                   - id | ||||||
|  |                   - name | ||||||
|  |                   - author | ||||||
|  |                   - locked | ||||||
|  |                 properties: | ||||||
|  |                   id: | ||||||
|  |                     type: integer | ||||||
|  |                   name: | ||||||
|  |                     type: string | ||||||
|  |                   author: | ||||||
|  |                     type: integer | ||||||
|  |                     description: user id of the author | ||||||
|  |                   locked:  | ||||||
|  |                     type: boolean | ||||||
|  |                     description: define if the topic is locked to new responses or not | ||||||
|  |         '401': | ||||||
|  |           $ref: '#/components/responses/UnauthorizedError' | ||||||
|  |     delete: | ||||||
|  |       summary: delete a topic | ||||||
|  |       security: | ||||||
|  |         - bearer: [] | ||||||
|  |       tags: | ||||||
|  |         - Ext (Messaging) | ||||||
|  |         - Forum | ||||||
|  |       responses: | ||||||
|  |         '201': | ||||||
|  |           description: Topic deleted | ||||||
|  |         '401': | ||||||
|  |           $ref: '#/components/responses/UnauthorizedError' | ||||||
|  |   /forum/{forumId}/topic/{topicId}/response: | ||||||
|  |     parameters: | ||||||
|  |       - name: forumId  | ||||||
|  |         in: path | ||||||
|  |         description: Id of the forum | ||||||
|  |         required: true | ||||||
|  |         schema: | ||||||
|  |           type: integer | ||||||
|  |       - name: topicId  | ||||||
|  |         in: path | ||||||
|  |         description: Id of the topic  | ||||||
|  |         required: true | ||||||
|  |         schema: | ||||||
|  |           type: integer | ||||||
|  |     get: | ||||||
|  |       summary: list responses of a topic | ||||||
|  |       tags: | ||||||
|  |         - Ext (Messaging) | ||||||
|  |         - Forum | ||||||
|  |       responses: | ||||||
|  |         '200': | ||||||
|  |           description: OK | ||||||
|  |           content: | ||||||
|  |             application/json: | ||||||
|  |               schema: | ||||||
|  |                 type: array  | ||||||
|  |                 items: | ||||||
|  |                   type: object | ||||||
|  |                   properties: | ||||||
|  |                     id: | ||||||
|  |                       type: integer | ||||||
|  |                     author: | ||||||
|  |                       type: integer | ||||||
|  |                       description: user id of the author  | ||||||
|  |                     content: | ||||||
|  |                       type: string | ||||||
|  |         '401': | ||||||
|  |           $ref: '#/components/responses/UnauthorizedError' | ||||||
|  |     post: | ||||||
|  |       summary: create a new response | ||||||
|  |       tags: | ||||||
|  |         - Ext (Messaging) | ||||||
|  |         - Forum | ||||||
|  |       requestBody: | ||||||
|  |         required: true | ||||||
|  |         content: | ||||||
|  |           application/x-www-form-urlencoded: | ||||||
|  |             schema: | ||||||
|  |               type: object | ||||||
|  |               properties: | ||||||
|  |                 content: | ||||||
|  |                   type: integer | ||||||
|  |       responses: | ||||||
|  |         '201': | ||||||
|  |           description: Message posted | ||||||
|  |         '401': | ||||||
|  |           $ref: '#/components/responses/UnauthorizedError' | ||||||
|  |   /forum/{forumId}/topic/{topicId}/response/{responseId}: | ||||||
|  |     parameters: | ||||||
|  |       - name: forumId  | ||||||
|  |         in: path | ||||||
|  |         description: Id of the forum | ||||||
|  |         required: true | ||||||
|  |         schema: | ||||||
|  |           type: integer | ||||||
|  |       - name: topicId  | ||||||
|  |         in: path | ||||||
|  |         description: Id of the topic  | ||||||
|  |         required: true | ||||||
|  |         schema: | ||||||
|  |           type: integer | ||||||
|  |       - name: responseId | ||||||
|  |         in: path | ||||||
|  |         description: Id of the response  | ||||||
|  |         required: true | ||||||
|  |         schema: | ||||||
|  |           type: integer | ||||||
|  |     get: | ||||||
|  |       summary: get info on a response | ||||||
|  |       tags: | ||||||
|  |         - Ext (Messaging) | ||||||
|  |         - Forum | ||||||
|  |       responses: | ||||||
|  |         '200': | ||||||
|  |           description: OK | ||||||
|  |           content: | ||||||
|  |             application/json: | ||||||
|  |               schema: | ||||||
|  |                 type: object | ||||||
|  |                 required: | ||||||
|  |                   - id | ||||||
|  |                   - author  | ||||||
|  |                   - content  | ||||||
|  |                 properties: | ||||||
|  |                   id: | ||||||
|  |                     type: integer | ||||||
|  |                   author: | ||||||
|  |                     type: string | ||||||
|  |                   content: | ||||||
|  |                     type: integer | ||||||
|  |         '401': | ||||||
|  |           $ref: '#/components/responses/UnauthorizedError' | ||||||
|  |     delete: | ||||||
|  |       summary: delete a response | ||||||
|  |       tags: | ||||||
|  |         - Ext (Messaging) | ||||||
|  |         - Forum | ||||||
|  |       responses: | ||||||
|  |         '201': | ||||||
|  |           description: Message deleted | ||||||
|  |         '401': | ||||||
|  |           $ref: '#/components/responses/UnauthorizedError' | ||||||
|  |  | ||||||
|  |   /discussion: | ||||||
|  |     get: | ||||||
|  |       summary: get list of available discussions | ||||||
|  |       tags: | ||||||
|  |         - Ext (Messaging) | ||||||
|  |         - discussion  | ||||||
|  |       responses: | ||||||
|  |         '201': | ||||||
|  |           description: OK | ||||||
|  |           content:  | ||||||
|  |             application/json: | ||||||
|  |               schema: | ||||||
|  |                 type: array | ||||||
|  |                 items: | ||||||
|  |                   type: object | ||||||
|  |                   properties: | ||||||
|  |                     id: | ||||||
|  |                       type: integer | ||||||
|  |                     name: | ||||||
|  |                       type: string | ||||||
|  |                     users: | ||||||
|  |                       type: array | ||||||
|  |                       items: | ||||||
|  |                         type: integer | ||||||
|  |         '401': | ||||||
|  |           $ref: '#/components/responses/UnauthorizedError' | ||||||
|  |     post: | ||||||
|  |       summary: create a new discussion | ||||||
|  |       tags: | ||||||
|  |         - Ext (Messaging) | ||||||
|  |         - discussion  | ||||||
|  |       requestBody: | ||||||
|  |         required: true | ||||||
|  |         content: | ||||||
|  |           application/x-www-form-urlencoded: | ||||||
|  |             schema: | ||||||
|  |               type: object | ||||||
|  |               properties: | ||||||
|  |                 name: | ||||||
|  |                   type: string | ||||||
|  |                 users: | ||||||
|  |                   type: array | ||||||
|  |                   description: id of users | ||||||
|  |                   items: | ||||||
|  |                     type: integer | ||||||
|  |       responses: | ||||||
|  |         '201': | ||||||
|  |           description: Discussion created | ||||||
|  |         '401': | ||||||
|  |           $ref: '#/components/responses/UnauthorizedError' | ||||||
|  |   /discussion/{id}: | ||||||
|  |     parameters: | ||||||
|  |       - name: id | ||||||
|  |         in: path | ||||||
|  |         description: Id of the discussion | ||||||
|  |         required: true | ||||||
|  |         schema: | ||||||
|  |           type: integer | ||||||
|  |     get: | ||||||
|  |       summary: get info on a discussion | ||||||
|  |       tags: | ||||||
|  |         - Ext (Messaging) | ||||||
|  |         - discussion  | ||||||
|  |       responses: | ||||||
|  |         '200': | ||||||
|  |           description: OK | ||||||
|  |           content: | ||||||
|  |             application/json: | ||||||
|  |               schema: | ||||||
|  |                 type: object | ||||||
|  |                 required: | ||||||
|  |                   - id | ||||||
|  |                   - name | ||||||
|  |                   - users  | ||||||
|  |                 properties: | ||||||
|  |                   id: | ||||||
|  |                     type: integer | ||||||
|  |                   name: | ||||||
|  |                     type: string | ||||||
|  |                   users: | ||||||
|  |                     type: integer | ||||||
|  |                     description: user ids of participants | ||||||
|  |         '401': | ||||||
|  |           $ref: '#/components/responses/UnauthorizedError' | ||||||
|  |   /discussion/{id}/msg: | ||||||
|  |     parameters: | ||||||
|  |       - name: id | ||||||
|  |         in: path | ||||||
|  |         description: Id of the discussion | ||||||
|  |         required: true | ||||||
|  |         schema: | ||||||
|  |           type: integer | ||||||
|  |     get: | ||||||
|  |       summary: list messages in a discussion | ||||||
|  |       tags: | ||||||
|  |         - Ext (Messaging) | ||||||
|  |         - discussion  | ||||||
|  |       responses: | ||||||
|  |         '200': | ||||||
|  |           description: Ok  | ||||||
|  |           content: | ||||||
|  |             application/json: | ||||||
|  |               schema: | ||||||
|  |                 type: array | ||||||
|  |                 items: | ||||||
|  |                   type: object | ||||||
|  |                   properties: | ||||||
|  |                     id: | ||||||
|  |                       type: integer | ||||||
|  |                     datetime: | ||||||
|  |                       type: integer | ||||||
|  |                     author: | ||||||
|  |                       type: integer | ||||||
|  |                     content: | ||||||
|  |                       type: string | ||||||
|  |         '401': | ||||||
|  |           $ref: '#/components/responses/UnauthorizedError' | ||||||
|  |     post: | ||||||
|  |       summary: post a new message in a discussion | ||||||
|  |       tags: | ||||||
|  |         - Ext (Messaging) | ||||||
|  |         - discussion  | ||||||
|  |       requestBody: | ||||||
|  |         required: true | ||||||
|  |         content: | ||||||
|  |           application/x-www-form-urlencoded: | ||||||
|  |             schema: | ||||||
|  |               type: string | ||||||
|  |               description: message content | ||||||
|  |       responses: | ||||||
|  |         '201': | ||||||
|  |           description: Message sent | ||||||
|  |         '401': | ||||||
|  |           $ref: '#/components/responses/UnauthorizedError' | ||||||
|  |   /discussion/{id}/msg/{msgId}: | ||||||
|  |     parameters: | ||||||
|  |       - name: id | ||||||
|  |         in: path | ||||||
|  |         description: Id of the discussion | ||||||
|  |         required: true | ||||||
|  |         schema: | ||||||
|  |           type: integer | ||||||
|  |       - name: msgId | ||||||
|  |         in: path | ||||||
|  |         description: Id of the message  | ||||||
|  |         required: true | ||||||
|  |         schema: | ||||||
|  |           type: integer  | ||||||
|  |     get: | ||||||
|  |       summary: get info about message  | ||||||
|  |       tags: | ||||||
|  |         - Ext (Messaging) | ||||||
|  |         - discussion  | ||||||
|  |       responses: | ||||||
|  |         '200': | ||||||
|  |           description: Ok  | ||||||
|  |           content: | ||||||
|  |             application/json: | ||||||
|  |               schema: | ||||||
|  |                 type: object | ||||||
|  |                 properties: | ||||||
|  |                   id: | ||||||
|  |                     type: integer | ||||||
|  |                   datetime: | ||||||
|  |                     type: integer | ||||||
|  |                   author: | ||||||
|  |                     type: integer | ||||||
|  |                   content: | ||||||
|  |                     type: string | ||||||
|  |         '401': | ||||||
|  |           $ref: '#/components/responses/UnauthorizedError' | ||||||
|  |     delete: | ||||||
|  |       summary: delete a message  | ||||||
|  |       security: | ||||||
|  |         - bearer: [] | ||||||
|  |       tags: | ||||||
|  |         - Ext (Messaging) | ||||||
|  |         - discussion  | ||||||
|  |       responses: | ||||||
|  |         '201': | ||||||
|  |           description: Message deleted | ||||||
|  |         '401': | ||||||
|  |           $ref: '#/components/responses/UnauthorizedError' | ||||||
|  |  | ||||||
|  |  | ||||||
|  |   /appointment: | ||||||
|  |     get: | ||||||
|  |       summary: list appointments | ||||||
|  |       tags: | ||||||
|  |         - Ext (Messaging) | ||||||
|  |         - appointment  | ||||||
|  |       parameters: | ||||||
|  |         - name: type | ||||||
|  |           in: query | ||||||
|  |           required: false | ||||||
|  |           schema: | ||||||
|  |             type: string  | ||||||
|  |             enum: [open, closed] | ||||||
|  |       responses: | ||||||
|  |         '200': | ||||||
|  |           description: Ok | ||||||
|  |           content: | ||||||
|  |             text/calendar: | ||||||
|  |               schema: | ||||||
|  |                 type: string | ||||||
|  |             application/json: | ||||||
|  |               schema: | ||||||
|  |                 type: array | ||||||
|  |                 items: | ||||||
|  |                   type: object | ||||||
|  |                   properties: | ||||||
|  |                     id: | ||||||
|  |                       type: integer | ||||||
|  |                     teacher: | ||||||
|  |                       type: integer | ||||||
|  |                     student: | ||||||
|  |                       type: integer | ||||||
|  |                     date: | ||||||
|  |                       type: integer | ||||||
|  |                     status: | ||||||
|  |                       type: string | ||||||
|  |         '401': | ||||||
|  |           $ref: '#/components/responses/UnauthorizedError' | ||||||
|  |     post: | ||||||
|  |       summary: create a new appointment | ||||||
|  |       tags: | ||||||
|  |         - Ext (Messaging) | ||||||
|  |         - appointment  | ||||||
|  |       requestBody: | ||||||
|  |         required: true | ||||||
|  |         content: | ||||||
|  |           application/x-www-form-urlencoded: | ||||||
|  |             schema: | ||||||
|  |               type: object | ||||||
|  |               properties: | ||||||
|  |                 content: | ||||||
|  |                   type: integer | ||||||
|  |                 datetime: | ||||||
|  |                   type: integer | ||||||
|  |                 to: | ||||||
|  |                   type: integer | ||||||
|  |                   description: user id of the person to request to | ||||||
|  |       responses: | ||||||
|  |         '201': | ||||||
|  |           description: Appointment created | ||||||
|  |         '401': | ||||||
|  |           $ref: '#/components/responses/UnauthorizedError' | ||||||
|  |   /appointment/{id}: | ||||||
|  |     parameters: | ||||||
|  |       - name: id | ||||||
|  |         in: path | ||||||
|  |         description: Id of the appointment | ||||||
|  |         required: true | ||||||
|  |         schema: | ||||||
|  |           type: integer | ||||||
|  |     get: | ||||||
|  |       summary: get info on an appointment | ||||||
|  |       tags: | ||||||
|  |         - Ext (Messaging) | ||||||
|  |         - appointment  | ||||||
|  |       responses: | ||||||
|  |         '200': | ||||||
|  |           description: Ok | ||||||
|  |           content: | ||||||
|  |             text/calendar: | ||||||
|  |               schema: | ||||||
|  |                 type: string | ||||||
|  |             application/json: | ||||||
|  |               schema: | ||||||
|  |                 type: object | ||||||
|  |                 properties: | ||||||
|  |                   id: | ||||||
|  |                     type: integer | ||||||
|  |                   teacher: | ||||||
|  |                     type: integer | ||||||
|  |                   student: | ||||||
|  |                     type: integer | ||||||
|  |                   date: | ||||||
|  |                     type: integer | ||||||
|  |                   status: | ||||||
|  |                     type: string | ||||||
|  |         '401': | ||||||
|  |           $ref: '#/components/responses/UnauthorizedError' | ||||||
|  |     post: | ||||||
|  |       summary: Accept, decline or propose a new schedule for the appointment | ||||||
|  |       tags: | ||||||
|  |         - Ext (Messaging) | ||||||
|  |         - appointment  | ||||||
|  |       requestBody: | ||||||
|  |         required: true | ||||||
|  |         content: | ||||||
|  |           application/x-www-form-urlencoded: | ||||||
|  |             schema: | ||||||
|  |               type: object | ||||||
|  |               properties: | ||||||
|  |                 action: | ||||||
|  |                   type: string | ||||||
|  |                   enum: [accept, refuse, propose] | ||||||
|  |                 data: | ||||||
|  |                   type: object | ||||||
|  |                   description: context dependant response (can be null) | ||||||
|  |       responses: | ||||||
|  |         '201': | ||||||
|  |           description: Done | ||||||
|  |         '401': | ||||||
|  |           $ref: '#/components/responses/UnauthorizedError' | ||||||
|  |  | ||||||
|  | # general  | ||||||
|   /users: |   /users: | ||||||
|     get: |     get: | ||||||
|       summary: list all users  |       summary: list all users  | ||||||
| @ -44,7 +704,7 @@ paths: | |||||||
|           name: type |           name: type | ||||||
|           required: false  |           required: false  | ||||||
|           schema: |           schema: | ||||||
|             $ref: '#components/schemas/Roles' |             $ref: '#/components/schemas/Roles' | ||||||
|       responses:  |       responses:  | ||||||
|         '200': |         '200': | ||||||
|           description: OK |           description: OK | ||||||
| @ -378,6 +1038,140 @@ paths: | |||||||
|         '401': |         '401': | ||||||
|           $ref: '#/components/responses/UnauthorizedError' |           $ref: '#/components/responses/UnauthorizedError' | ||||||
|  |  | ||||||
|  |   /Requests/{type}: | ||||||
|  |     get: | ||||||
|  |       summary: Give an array of every requests of the specified type | ||||||
|  |       tags :  | ||||||
|  |         - Requests | ||||||
|  |         - SI | ||||||
|  |         - Ext (Student Registration) | ||||||
|  |       responses :  | ||||||
|  |         '200': | ||||||
|  |           description : OK | ||||||
|  |           content :  | ||||||
|  |             application/json :  | ||||||
|  |               schema :  | ||||||
|  |                 type : array | ||||||
|  |                 items : | ||||||
|  |                   allOf: | ||||||
|  |                   - type : object | ||||||
|  |                     properties :  | ||||||
|  |                       id :  | ||||||
|  |                         type : integer | ||||||
|  |                   - oneOf :  | ||||||
|  |                     - $ref : '#/components/schemas/RRRequest' | ||||||
|  |                     - $ref : '#/components/schemas/SSRequest' | ||||||
|  |                     - $ref : '#/components/schemas/UnRegRequest' | ||||||
|  |                     - $ref : '#/components/schemas/ExempRequest' | ||||||
|  |                     - $ref : '#/components/schemas/RegRequest' | ||||||
|  |                   discriminator: | ||||||
|  |                     propertyName : type | ||||||
|  |     parameters: | ||||||
|  |       - name: type | ||||||
|  |         in: path | ||||||
|  |         description: type of the request | ||||||
|  |         required: true | ||||||
|  |         schema: | ||||||
|  |           type: integer | ||||||
|  |            | ||||||
|  |     post :  | ||||||
|  |       summary: create a request | ||||||
|  |       tags :  | ||||||
|  |         - Requests | ||||||
|  |         - Guest | ||||||
|  |         - Student | ||||||
|  |         - Ext (Student Registration) | ||||||
|  |       security:  | ||||||
|  |         - bearer: [] | ||||||
|  |       requestBody: | ||||||
|  |         required: true | ||||||
|  |         content: | ||||||
|  |           application/x-www-form-urlencoded: | ||||||
|  |             schema: | ||||||
|  |               oneOf: | ||||||
|  |                 - $ref : '#/components/schemas/RRRequest' | ||||||
|  |                 - $ref : '#/components/schemas/SSRequest' | ||||||
|  |                 - $ref : '#/components/schemas/UnRegRequest' | ||||||
|  |                 - $ref : '#/components/schemas/ExempRequest' | ||||||
|  |                 - $ref : '#/components/schemas/RegRequest' | ||||||
|  |               discriminator: | ||||||
|  |                     propertyName : type | ||||||
|  |       responses: | ||||||
|  |         '201': | ||||||
|  |           description: New request created | ||||||
|  |         '401': | ||||||
|  |           $ref : '#/components/responses/UnauthorizedError'  | ||||||
|  |      | ||||||
|  |   /Requests/{type}/{id}: | ||||||
|  |     parameters: | ||||||
|  |         - name: type | ||||||
|  |           in: path | ||||||
|  |           description: type of the request | ||||||
|  |           required: true | ||||||
|  |           schema: | ||||||
|  |             type: integer | ||||||
|  |              | ||||||
|  |         - name : id | ||||||
|  |           in : path | ||||||
|  |           description: id of the selected Request | ||||||
|  |           required : true | ||||||
|  |           schema :  | ||||||
|  |             type : integer | ||||||
|  |          | ||||||
|  |     get : | ||||||
|  |       summary : Get all the data composing a request | ||||||
|  |       tags :  | ||||||
|  |         - Requests | ||||||
|  |         - SI | ||||||
|  |         - Teacher | ||||||
|  |         - Ext (Student Registration) | ||||||
|  |       responses :  | ||||||
|  |         '200': | ||||||
|  |           description : OK | ||||||
|  |           content :  | ||||||
|  |             application/json : | ||||||
|  |               schema : | ||||||
|  |                 allOf: | ||||||
|  |                   - type : object | ||||||
|  |                     properties :  | ||||||
|  |                       id :  | ||||||
|  |                         type : integer | ||||||
|  |                   - oneOf :  | ||||||
|  |                     - $ref : '#/components/schemas/RRRequest' | ||||||
|  |                     - $ref : '#/components/schemas/SSRequest' | ||||||
|  |                     - $ref : '#/components/schemas/UnRegRequest' | ||||||
|  |                     - $ref : '#/components/schemas/ExempRequest' | ||||||
|  |                     - $ref : '#/components/schemas/RegRequest' | ||||||
|  |                 discriminator: | ||||||
|  |                   propertyName : type  | ||||||
|  |      | ||||||
|  |     patch: | ||||||
|  |         summary: Change the state of request | ||||||
|  |         tags: | ||||||
|  |           - Requests | ||||||
|  |           - SI | ||||||
|  |           - Teacher | ||||||
|  |           - Ext (Student Registration) | ||||||
|  |         security: | ||||||
|  |           - bearer: [] | ||||||
|  |         requestBody: | ||||||
|  |           required : true | ||||||
|  |           content: | ||||||
|  |               application/x-www-form-urlencoded: | ||||||
|  |                 schema: | ||||||
|  |                   oneOf :  | ||||||
|  |                     - $ref : '#/components/schemas/RRRequest' | ||||||
|  |                     - $ref : '#/components/schemas/SSRequest' | ||||||
|  |                     - $ref : '#/components/schemas/UnRegRequest' | ||||||
|  |                     - $ref : '#/components/schemas/ExempRequest' | ||||||
|  |                     - $ref : '#/components/schemas/RegRequest' | ||||||
|  |                   discriminator: | ||||||
|  |                     propertyName : type  | ||||||
|  |         responses: | ||||||
|  |           '201': | ||||||
|  |             description: State modified | ||||||
|  |           '401': | ||||||
|  |             $ref: '#/components/responses/UnauthorizedError'  | ||||||
|               |               | ||||||
|   /lesson: |   /lesson: | ||||||
|     post: |     post: | ||||||
| @ -777,6 +1571,7 @@ paths: | |||||||
|         summary: get a list of article's data |         summary: get a list of article's data | ||||||
|         tags: |         tags: | ||||||
|           - Users |           - Users | ||||||
|  |           - Guest | ||||||
|           - Ext (scientific articles) |           - Ext (scientific articles) | ||||||
|         responses:  |         responses:  | ||||||
|           '200': |           '200': | ||||||
| @ -886,6 +1681,84 @@ components: | |||||||
|     Roles: |     Roles: | ||||||
|       type: string |       type: string | ||||||
|       enum: [teacher, student, secretary] |       enum: [teacher, student, secretary] | ||||||
|  |  | ||||||
|  |     RegRequest: | ||||||
|  |       type : object | ||||||
|  |       properties: | ||||||
|  |         Name : | ||||||
|  |           type: string | ||||||
|  |         Firstname : | ||||||
|  |           type : string | ||||||
|  |         Address : | ||||||
|  |           $ref: "#/components/schemas/Address" | ||||||
|  |         Email: | ||||||
|  |           type : string | ||||||
|  |         BirthDate: | ||||||
|  |           type : string | ||||||
|  |           description: Follow the iso 8601 ("YYYY-MM-DD") | ||||||
|  |         Cursus: | ||||||
|  |           type : integer | ||||||
|  |           description : ID of a specific cursus | ||||||
|  |         Photo: | ||||||
|  |           type : string | ||||||
|  |           description: Path of the picture that the user uploaded | ||||||
|  |  | ||||||
|  |         IdentityCard: | ||||||
|  |           type : string | ||||||
|  |           description: Path of the picture of the user's identity card | ||||||
|  |         Degree: | ||||||
|  |           type : string | ||||||
|  |           description: Path of the pdf containing the user's degree | ||||||
|  |         Certificate: | ||||||
|  |           type : string | ||||||
|  |           description: Path of the pdf containing the user's admission certificate (optionnal) | ||||||
|  |         ForeignerCertificate: | ||||||
|  |           type : string | ||||||
|  |           description: Path of the pdf containing the user's foreigner certificate (optionnal) | ||||||
|  |         State: | ||||||
|  |           type : string | ||||||
|  |      | ||||||
|  |      | ||||||
|  |     RRRequest: | ||||||
|  |       type : object | ||||||
|  |       properties : | ||||||
|  |         RegNo :  | ||||||
|  |           type : integer | ||||||
|  |         NewCursusid :  | ||||||
|  |           type : integer | ||||||
|  |         State :  | ||||||
|  |           type : string | ||||||
|  |        | ||||||
|  |      | ||||||
|  |     SSRequest:  | ||||||
|  |       type : object | ||||||
|  |       properties :  | ||||||
|  |         RegNo :  | ||||||
|  |           type : integer | ||||||
|  |         Amount :  | ||||||
|  |           type : integer | ||||||
|  |         Document :  | ||||||
|  |           type : string | ||||||
|  |           description : justification document for a scholarship | ||||||
|  |                | ||||||
|  |     UnRegRequest : | ||||||
|  |       type : object | ||||||
|  |       properties :  | ||||||
|  |         RegNo :  | ||||||
|  |           type : integer | ||||||
|  |         State : | ||||||
|  |           type : string | ||||||
|  |            | ||||||
|  |     ExempRequest : | ||||||
|  |       type : object | ||||||
|  |       properties : | ||||||
|  |         RegNo :  | ||||||
|  |           type : integer | ||||||
|  |         Courseid : | ||||||
|  |           type : integer | ||||||
|  |         State : | ||||||
|  |           type : string | ||||||
|  |            | ||||||
|     Article: |     Article: | ||||||
|       type: object |       type: object | ||||||
|       properties: |       properties: | ||||||
| @ -1018,10 +1891,7 @@ components: | |||||||
|           "displayMode": "grid", |           "displayMode": "grid", | ||||||
|           "UserId": 12 |           "UserId": 12 | ||||||
|         } |         } | ||||||
|  |  | ||||||
|   responses: |   responses: | ||||||
|     UnauthorizedError: |     UnauthorizedError: | ||||||
|       description: Unauthorized access or missing bearer  |       description: Unauthorized access or missing bearer  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | |||||||
							
								
								
									
										87
									
								
								Documents/proto/messaging_extension/ERD.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								Documents/proto/messaging_extension/ERD.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,87 @@ | |||||||
|  | # Entity relational diagram | ||||||
|  |  | ||||||
|  | ## Messaging extension  | ||||||
|  |  | ||||||
|  | ```mermaid | ||||||
|  | %%{init: {  "er": {"fontSize": 25, "stroke": "black" }}}%% | ||||||
|  | erDiagram | ||||||
|  |  | ||||||
|  | %% General | ||||||
|  | Users | ||||||
|  |  | ||||||
|  | %% Messages | ||||||
|  | Discussions{ | ||||||
|  |     Integer id PK | ||||||
|  |     String name | ||||||
|  | } | ||||||
|  |  | ||||||
|  | Messages{ | ||||||
|  |     Integer id PK | ||||||
|  |     Integer response FK "Messages" | ||||||
|  |     String content | ||||||
|  | } | ||||||
|  |  | ||||||
|  | Discussions ||--o{ Messages: ""  | ||||||
|  | Discussions ||--o{ Users: "" | ||||||
|  |  | ||||||
|  | Messages o|--o{ Messages: "answers" | ||||||
|  |  | ||||||
|  | %% Forums | ||||||
|  | Forums{ | ||||||
|  |     Integer id PK | ||||||
|  |     String name | ||||||
|  |     Integer course FK "Course" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | Topics{ | ||||||
|  |     Integer id PK | ||||||
|  |     String subject | ||||||
|  |     String content | ||||||
|  |     Boolean locked | ||||||
|  | } | ||||||
|  | Answers{ | ||||||
|  |     Integer id PK | ||||||
|  |     String content | ||||||
|  |     Boolean anonymous | ||||||
|  |     TimeStamp creation_time  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | Polls{ | ||||||
|  |     Integer id PK | ||||||
|  |     enum PollType | ||||||
|  | } | ||||||
|  | Options{ | ||||||
|  |     Integer id PK | ||||||
|  |     String name | ||||||
|  | } | ||||||
|  |  | ||||||
|  | Forums ||--o{ Users: "Registered" | ||||||
|  | Forums ||--|| Teacher: "Owner" | ||||||
|  | Forums ||--o{ Topics: "" | ||||||
|  | Forums ||--o{ Polls: "" | ||||||
|  |  | ||||||
|  | Topics ||--|| Teacher: "Author" | ||||||
|  | Topics ||--|| Users: "Author" | ||||||
|  | Topics ||--o{ Answers: "" | ||||||
|  |  | ||||||
|  | Polls ||--o{ Options: "" | ||||||
|  |  | ||||||
|  | Options ||--o{ Votes : "" | ||||||
|  |  | ||||||
|  | Votes }o--|| Users: "Voter" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | %% Appointments | ||||||
|  | Teacher | ||||||
|  | Appointments{ | ||||||
|  |     Integer id PK | ||||||
|  |     Integer teacher FK "Teacher" | ||||||
|  |     TIME sent_time | ||||||
|  |     enum Status | ||||||
|  | } | ||||||
|  |  | ||||||
|  | Appointments ||--|| Users: "" | ||||||
|  |  | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | Debucquoy Anthony | ||||||
| @ -11,8 +11,9 @@ extension_messagerie.pdf:use_case_messagerie.tex extension_messagerie.bbl extens | |||||||
| use_case_messagerie.tex: use_case_messagerie.uml | use_case_messagerie.tex: use_case_messagerie.uml | ||||||
| 	plantuml -tlatex:nopreamble use_case_messagerie.uml | 	plantuml -tlatex:nopreamble use_case_messagerie.uml | ||||||
|  |  | ||||||
| image: use_case_messagerie.uml interaction_diagram.uml | image: use_case_messagerie.uml interaction_diagram.uml class.uml  | ||||||
| 	plantuml $^  | 	plantuml $^  | ||||||
|  | 	mmdc -i ERD.md -o ERD.png | ||||||
|  |  | ||||||
| extension_messagerie.bbl: extension_messagerie.bcf | extension_messagerie.bbl: extension_messagerie.bcf | ||||||
| 	biber extension_messagerie | 	biber extension_messagerie | ||||||
| @ -24,6 +25,7 @@ clean: | |||||||
| 	latexmk -C | 	latexmk -C | ||||||
| 	rm -f use_case_messagerie.tex | 	rm -f use_case_messagerie.tex | ||||||
| 	rm -f extension_messagerie.{bbl,run.xml} | 	rm -f extension_messagerie.{bbl,run.xml} | ||||||
|  | 	rm -f class.tex | ||||||
|  |  | ||||||
| run: extension_messagerie.pdf | run: extension_messagerie.pdf | ||||||
| 	xdg-open $< | 	xdg-open $< | ||||||
|  | |||||||
							
								
								
									
										86
									
								
								Documents/proto/messaging_extension/class.uml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								Documents/proto/messaging_extension/class.uml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,86 @@ | |||||||
|  | @startuml | ||||||
|  | title Class diagram for Messaging extension | ||||||
|  |  | ||||||
|  | package Messages { | ||||||
|  | 	class Message{ | ||||||
|  | 		content: String | ||||||
|  | 		response: Message | ||||||
|  | 		respond(User, String) | ||||||
|  | 	} | ||||||
|  | 	class Discussion{ | ||||||
|  | 		name: String | ||||||
|  | 		users: ArrayList<User> | ||||||
|  | 		invite(User) | ||||||
|  | 		sendMessage(User, String) | ||||||
|  | 	} | ||||||
|  | 	Discussion *-- Message | ||||||
|  | } | ||||||
|  |  | ||||||
|  | package Forums { | ||||||
|  | 	class Forum{ | ||||||
|  | 		name: String | ||||||
|  | 		Owner: Teacher | ||||||
|  | 		Registered: ArrayList<User> | ||||||
|  | 		{static} createForum(Course): Forum | ||||||
|  | 		createTopic(String): Topic | ||||||
|  | 		createPoll(String, PollType, ArrayList<Option>): Poll | ||||||
|  | 	} | ||||||
|  | 	class Topic{ | ||||||
|  | 		subject: String | ||||||
|  | 		author: Teacher  | ||||||
|  | 		content: String | ||||||
|  | 		answer(User, String): Answer | ||||||
|  | 		lock(Boolean) | ||||||
|  | 	} | ||||||
|  | 	class Answer{ | ||||||
|  | 		author: User | ||||||
|  | 		content: String | ||||||
|  | 		anonymous: Boolean  | ||||||
|  | 		remove() | ||||||
|  | 	} | ||||||
|  | 	class Poll{ | ||||||
|  | 		options: ArrayList<Option> | ||||||
|  | 		type: PollType | ||||||
|  | 		answer(User, Option): Vote | ||||||
|  | 		addOption(Option) | ||||||
|  | 	} | ||||||
|  | 	class Option{ | ||||||
|  | 		name: String | ||||||
|  | 	} | ||||||
|  | 	class Vote{ | ||||||
|  | 		voter: User | ||||||
|  | 	} | ||||||
|  | 	enum PollType { | ||||||
|  | 		ALLOW_NEW_OPTIONS | ||||||
|  | 		ALLOW_MULTIPLE_CHOICE | ||||||
|  | 	} | ||||||
|  | 	note "Change the behaviour of poll" as N | ||||||
|  |  | ||||||
|  | 	Forum *-l- Topic | ||||||
|  | 	Topic *-l- Answer | ||||||
|  |  | ||||||
|  | 	Topic <|-d- Poll | ||||||
|  | 	Poll *-l- Option | ||||||
|  | 	Option "1..*" -d-x Vote | ||||||
|  | 	Poll *-- Vote | ||||||
|  |  | ||||||
|  | 	Poll -- PollType | ||||||
|  | 	PollType .r. N | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | package Appointments{ | ||||||
|  | 	class Appointment{ | ||||||
|  | 		date: Date | ||||||
|  | 		teacher: Teacher | ||||||
|  | 		student: Student | ||||||
|  | 		{static} Appointment(Student, Teacher, Date) | ||||||
|  | 		accept() | ||||||
|  | 		refuse() | ||||||
|  | 		propose(Date) | ||||||
|  | 		export(): File | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | Appointments -[hidden]d- Messages | ||||||
|  | @enduml | ||||||
| @ -3,6 +3,7 @@ | |||||||
| \usepackage[utf8]{inputenc} | \usepackage[utf8]{inputenc} | ||||||
| \usepackage[T1]{fontenc} | \usepackage[T1]{fontenc} | ||||||
| \usepackage{amsmath, amsfonts, amssymb, amsthm} | \usepackage{amsmath, amsfonts, amssymb, amsthm} | ||||||
|  | \usepackage{dirtytalk} | ||||||
| \usepackage{tikz} | \usepackage{tikz} | ||||||
| \usepackage{biblatex} | \usepackage{biblatex} | ||||||
|  |  | ||||||
| @ -20,77 +21,74 @@ | |||||||
| \resizebox{345pt}{!}{ | \resizebox{345pt}{!}{ | ||||||
| 	\input{./use_case_messagerie.tex} | 	\input{./use_case_messagerie.tex} | ||||||
| } | } | ||||||
| \caption{Use Case Diagram of the messaging extension} | \caption{Use Case Diagram pour l'extension de messagerie} | ||||||
| \label{fig:useCase:msg_ext}  | \label{fig:useCase:msg_ext}  | ||||||
| \end{figure} | \end{figure} | ||||||
|  |  | ||||||
| In the diagram Figure~\ref{fig:useCase:msg_ext}, | Dans le diagramme \ref{fig:useCase:msg_ext}, la définition du <<extend>> est tirée du livre: | ||||||
| the <<extend>> definition is not pulled from the "Genie logiciel" course | "uml Pocket reference" de Dan Pilone \cite{Pilone2006-fn}.  | ||||||
| of the University of Mons (UMONS). It is in fact the definition from |  | ||||||
| the Dan Pilone's pocket reference \cite{Pilone2006-fn}. | \say{Use case extension encapsulates a distinct flow of events | ||||||
|  | 	that are not considered part of the normal or basic flow. | ||||||
|  | 	They are not necessarily exceptional conditions.} | ||||||
|  |  | ||||||
| \subsection{Answer topic} | \subsection{Answer topic} | ||||||
|  |  | ||||||
| The user should be able to answer to a topic created by a teacher. | L'utilisateur doit être capable de répondre à un topic crée par l'enseignant. | ||||||
| This answer will depend on the type of topic. The answer could be a selection on a poll, | Cette réponse va dépendre du type de topic. Elle peut être une réponse à un questionnaire, | ||||||
| a private answer (which mean that the answer is not visible to the other users except to the professor). | un message privé (qui ne serait pas visible par les autres utilisateur excepté l'enseignant) ou  | ||||||
| The answer could finally be a basic answer to the topic and be visible to other users browsing the topic. | une simple réponse qui serait visible par tous. | ||||||
|  |  | ||||||
| \subsection{Create discutions} | \subsection{Create discutions} | ||||||
|  |  | ||||||
| The user can select multiple users and group them into a discussion. | L'utilisateur peut séléctionner plusieurs utilisateurs et les include dans un groupe de discussion. | ||||||
| In this discussion, users will be able to exchange messages readable by | Dans cette discussion, les utilisateurs peuvent échanger des messages lisible par les autres membres du | ||||||
| every other members of the discussion | groupe | ||||||
|  |  | ||||||
| \subsubsection{Send messages} | \subsubsection{Send messages} | ||||||
|  |  | ||||||
| Allow the creation of a message in a discussion. | Permet la création d'un message dans une discusison. | ||||||
| The text sent to others shall be received by other users | Ce message va être reçu par les autres utilisateur et ceux-ci vont être notifié | ||||||
| and these users shall be notified of this message by the notification | du message par le système de notification | ||||||
| system. |  | ||||||
|  |  | ||||||
| \subsection{Ask appointment} | \subsection{Ask appointment} | ||||||
|  |  | ||||||
| A student can ask for an appointment to a teacher. | Un étudiant peut demander un rendes-vous à un enseignant. | ||||||
| In this request, the student will have to give a date, a time | Dans cette demande, l'étudiant doit donner une date qui lui convient pour ce rendez-vous | ||||||
| and a subject he want to propose to the teacher. | ainsi qu'une raison à ce rendez-vous. | ||||||
|  |  | ||||||
| \subsubsection{Export to calendar} | \subsubsection{Export to calendar} | ||||||
|  |  | ||||||
| When an appointment is made. The program can export the event | Quand un rendez-vous est crée, Le programme peut exporter l'événement dans un  | ||||||
| to an open format that can be read by calendar software to add | format libre qui pourra être lu par les programme de gestions de planning. | ||||||
| the event to the user's calendar. |  | ||||||
|  |  | ||||||
| \subsection{Manage appointment} | \subsection{Manage appointment} | ||||||
|  |  | ||||||
| When a teacher received an appointment, he is able to | Quand un enseignant reçois une demande de rendez-vous, | ||||||
| validate, deny or propose a new appointment schedule to the | il a la possibilité de valider/refuser ou de proposer un nouveau rendez-vous | ||||||
| student. | à l'étudiant | ||||||
|  |  | ||||||
| \subsubsection{Propose new appointment} | \subsubsection{Propose new appointment} | ||||||
|  |  | ||||||
| If the teacher can't attend to an appointment because of his | Si l'enseignant n'est pas disponible pour le rendez-vous proposé, | ||||||
| schedule, he can make a new time proposal and send it to | il peut alors proposer un nouveau créneau horaire et l'envoyer à l'étudiant. | ||||||
| the student. The student then receive a notification of | L'étudiant reçois alors une notification du nouveau créneau horaire. | ||||||
| the proposed modifications. |  | ||||||
|  |  | ||||||
| \subsection{Create forum} | \subsection{Create forum} | ||||||
|  |  | ||||||
| The teacher can create a new forum under a specific course | L'enseignant peut créer un nouveau forum lié à un cours. | ||||||
| The new forum will then make every student of this course | Ce nouveau forum enregistrera les étudiant du cours automatiquement. | ||||||
| follow the forum and its topic. |  | ||||||
|  |  | ||||||
| \subsubsection{Post topics} | \subsubsection{Post topics} | ||||||
|  |  | ||||||
| The teacher can post a new topic inside a forum to let  | L'enseignant peut envoyer un topic dans un forum pour préciser quelque chose aux étudiants | ||||||
| the student know of something specific or to ask a question to | ou pour poser une questions | ||||||
| them. |  | ||||||
|  |  | ||||||
| \subsubsection{Post poll} | \subsubsection{Post poll} | ||||||
|  |  | ||||||
| When posting a topic to a forum, the teacher can choose to | Lors d'un post, il est possible de choisir de créer un questionnaire à choix multiples ou non. | ||||||
| make the post as a poll. In that case, student will have to vote | Dans ce cas, les étudiants vont devoir voter pour l'une des options proposée ou potentiellement | ||||||
| for one of the options or if allowed by the teacher, create a new option. | crée une nouvelle option. | ||||||
|  |  | ||||||
| \printbibliography | \printbibliography | ||||||
|  |  | ||||||
|  | |||||||
| @ -1,23 +1,19 @@ | |||||||
| @startuml | @startuml | ||||||
| note | mainframe Appointment | ||||||
| 	Appointment |  | ||||||
| endnote |  | ||||||
| start | start | ||||||
| :Asking Apointment] | :Asking Appointment] | ||||||
| repeat | repeat | ||||||
| if (accepted) is (yes) then | if (accepted) is (yes) then | ||||||
| 	:Export to calendar] | 	:Export to calendar] | ||||||
| 	stop | 	stop | ||||||
| else (no) | else (no) | ||||||
| 	:Propose new apointment] | 	:Propose new appointment] | ||||||
| endif | endif | ||||||
| 	 | 	 | ||||||
| @enduml | @enduml | ||||||
|  |  | ||||||
| @startuml | @startuml | ||||||
| note | mainframe Messaging | ||||||
| 	Messaging |  | ||||||
| endnote |  | ||||||
| start | start | ||||||
| split  | split  | ||||||
| 	:Create Discution] | 	:Create Discution] | ||||||
| @ -31,10 +27,7 @@ stop | |||||||
| @enduml | @enduml | ||||||
|  |  | ||||||
| @startuml | @startuml | ||||||
| note  | mainframe Forum | ||||||
| 	Forum |  | ||||||
| endnote |  | ||||||
|  |  | ||||||
| start | start | ||||||
| :Forum Creation] | :Forum Creation] | ||||||
|  |  | ||||||
|  | |||||||
| @ -5,14 +5,13 @@ left to right direction | |||||||
| :Student: as s | :Student: as s | ||||||
| :Teacher: as t | :Teacher: as t | ||||||
|  |  | ||||||
|  |  | ||||||
| package "Messagerie"{ | package "Messagerie"{ | ||||||
|  |  | ||||||
| (Answer topics) as at | (Answer topics) as at | ||||||
| (Ask appointement) as aa | (Ask appointment) as aa | ||||||
| (Create Discution) as cd | (Create Discussion) as cd | ||||||
| (Create Forum) as cf | (Create Forum) as cf | ||||||
| (Manage appointement) as ma | (Manage appointment) as ma | ||||||
|  |  | ||||||
| s -- at | s -- at | ||||||
| s -- aa | s -- aa | ||||||
| @ -32,7 +31,7 @@ cf <-- pt : << include >> | |||||||
| pt <|-- (Post poll) | pt <|-- (Post poll) | ||||||
| cd <-- (Send messages) : << include >> | cd <-- (Send messages) : << include >> | ||||||
|  |  | ||||||
| ma <-- (Propose new appointment) : << exlude>> \n [refuse] | ma <-- (Propose new appointment) : << extends >> \n [refuse] | ||||||
|  |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  | |||||||
							
								
								
									
										30
									
								
								frontend/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								frontend/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,30 @@ | |||||||
|  | # Logs | ||||||
|  | logs | ||||||
|  | *.log | ||||||
|  | npm-debug.log* | ||||||
|  | yarn-debug.log* | ||||||
|  | yarn-error.log* | ||||||
|  | pnpm-debug.log* | ||||||
|  | lerna-debug.log* | ||||||
|  |  | ||||||
|  | node_modules | ||||||
|  | .DS_Store | ||||||
|  | dist | ||||||
|  | dist-ssr | ||||||
|  | coverage | ||||||
|  | *.local | ||||||
|  |  | ||||||
|  | # Editor directories and files | ||||||
|  | .vscode/* | ||||||
|  | !.vscode/extensions.json | ||||||
|  | .idea | ||||||
|  | *.suo | ||||||
|  | *.ntvs* | ||||||
|  | *.njsproj | ||||||
|  | *.sln | ||||||
|  | *.sw? | ||||||
|  |  | ||||||
|  | *.tsbuildinfo | ||||||
|  |  | ||||||
|  | # Personal but I don't like to store the lock | ||||||
|  | package-lock.json | ||||||
							
								
								
									
										33
									
								
								frontend/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								frontend/README.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,33 @@ | |||||||
|  | # Clyde | ||||||
|  |  | ||||||
|  | This is the frontend part of the Clyde application | ||||||
|  |  | ||||||
|  | ## Project Setup | ||||||
|  |  | ||||||
|  | ```sh | ||||||
|  | npm install | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ### Compile and Hot-Reload for Development | ||||||
|  |  | ||||||
|  | ```sh | ||||||
|  | npm run dev | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ### Compile and Minify for Production | ||||||
|  |  | ||||||
|  | ```sh | ||||||
|  | npm run build | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ### Run Unit Tests with [Vitest](https://vitest.dev/) | ||||||
|  |  | ||||||
|  | ```sh | ||||||
|  | npm run test:unit | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ### Lint with [ESLint](https://eslint.org/) | ||||||
|  |  | ||||||
|  | ```sh | ||||||
|  | npm run lint | ||||||
|  | ``` | ||||||
							
								
								
									
										13
									
								
								frontend/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								frontend/index.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,13 @@ | |||||||
|  | <!DOCTYPE html> | ||||||
|  | <html lang="en"> | ||||||
|  |   <head> | ||||||
|  |     <meta charset="UTF-8"> | ||||||
|  |     <link rel="icon" href="/favicon.ico"> | ||||||
|  |     <meta name="viewport" content="width=device-width, initial-scale=1.0"> | ||||||
|  |     <title>Vite App</title> | ||||||
|  |   </head> | ||||||
|  |   <body> | ||||||
|  |     <div id="app"></div> | ||||||
|  |     <script type="module" src="/src/main.js"></script> | ||||||
|  |   </body> | ||||||
|  | </html> | ||||||
							
								
								
									
										8
									
								
								frontend/jsconfig.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								frontend/jsconfig.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,8 @@ | |||||||
|  | { | ||||||
|  |   "compilerOptions": { | ||||||
|  |     "paths": { | ||||||
|  |       "@/*": ["./src/*"] | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   "exclude": ["node_modules", "dist"] | ||||||
|  | } | ||||||
							
								
								
									
										25
									
								
								frontend/package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								frontend/package.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,25 @@ | |||||||
|  | { | ||||||
|  |   "name": "clyde", | ||||||
|  |   "version": "0.0.0", | ||||||
|  |   "private": true, | ||||||
|  |   "type": "module", | ||||||
|  |   "scripts": { | ||||||
|  |     "dev": "vite", | ||||||
|  |     "build": "vite build", | ||||||
|  |     "preview": "vite preview", | ||||||
|  |     "test:unit": "vitest", | ||||||
|  |     "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs --fix --ignore-path .gitignore" | ||||||
|  |   }, | ||||||
|  |   "dependencies": { | ||||||
|  |     "vue": "^3.4.15" | ||||||
|  |   }, | ||||||
|  |   "devDependencies": { | ||||||
|  |     "@vitejs/plugin-vue": "^5.0.3", | ||||||
|  |     "@vue/test-utils": "^2.4.4", | ||||||
|  |     "eslint": "^8.49.0", | ||||||
|  |     "eslint-plugin-vue": "^9.17.0", | ||||||
|  |     "jsdom": "^24.0.0", | ||||||
|  |     "vite": "^5.0.11", | ||||||
|  |     "vitest": "^1.2.2" | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										
											BIN
										
									
								
								frontend/public/favicon.ico
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								frontend/public/favicon.ico
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 4.2 KiB | 
							
								
								
									
										47
									
								
								frontend/src/App.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								frontend/src/App.vue
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,47 @@ | |||||||
|  | <script setup> | ||||||
|  | import HelloWorld from './components/HelloWorld.vue' | ||||||
|  | import TheWelcome from './components/TheWelcome.vue' | ||||||
|  | </script> | ||||||
|  |  | ||||||
|  | <template> | ||||||
|  |   <header> | ||||||
|  |     <img alt="Vue logo" class="logo" src="./assets/logo.svg" width="125" height="125" /> | ||||||
|  |  | ||||||
|  |     <div class="wrapper"> | ||||||
|  |       <HelloWorld msg="You did it!" /> | ||||||
|  |     </div> | ||||||
|  |   </header> | ||||||
|  |  | ||||||
|  |   <main> | ||||||
|  |     <TheWelcome /> | ||||||
|  |   </main> | ||||||
|  | </template> | ||||||
|  |  | ||||||
|  | <style scoped> | ||||||
|  | header { | ||||||
|  |   line-height: 1.5; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .logo { | ||||||
|  |   display: block; | ||||||
|  |   margin: 0 auto 2rem; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @media (min-width: 1024px) { | ||||||
|  |   header { | ||||||
|  |     display: flex; | ||||||
|  |     place-items: center; | ||||||
|  |     padding-right: calc(var(--section-gap) / 2); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   .logo { | ||||||
|  |     margin: 0 2rem 0 0; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   header .wrapper { | ||||||
|  |     display: flex; | ||||||
|  |     place-items: flex-start; | ||||||
|  |     flex-wrap: wrap; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | </style> | ||||||
							
								
								
									
										86
									
								
								frontend/src/assets/base.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								frontend/src/assets/base.css
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,86 @@ | |||||||
|  | /* color palette from <https://github.com/vuejs/theme> */ | ||||||
|  | :root { | ||||||
|  |   --vt-c-white: #ffffff; | ||||||
|  |   --vt-c-white-soft: #f8f8f8; | ||||||
|  |   --vt-c-white-mute: #f2f2f2; | ||||||
|  |  | ||||||
|  |   --vt-c-black: #181818; | ||||||
|  |   --vt-c-black-soft: #222222; | ||||||
|  |   --vt-c-black-mute: #282828; | ||||||
|  |  | ||||||
|  |   --vt-c-indigo: #2c3e50; | ||||||
|  |  | ||||||
|  |   --vt-c-divider-light-1: rgba(60, 60, 60, 0.29); | ||||||
|  |   --vt-c-divider-light-2: rgba(60, 60, 60, 0.12); | ||||||
|  |   --vt-c-divider-dark-1: rgba(84, 84, 84, 0.65); | ||||||
|  |   --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48); | ||||||
|  |  | ||||||
|  |   --vt-c-text-light-1: var(--vt-c-indigo); | ||||||
|  |   --vt-c-text-light-2: rgba(60, 60, 60, 0.66); | ||||||
|  |   --vt-c-text-dark-1: var(--vt-c-white); | ||||||
|  |   --vt-c-text-dark-2: rgba(235, 235, 235, 0.64); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* semantic color variables for this project */ | ||||||
|  | :root { | ||||||
|  |   --color-background: var(--vt-c-white); | ||||||
|  |   --color-background-soft: var(--vt-c-white-soft); | ||||||
|  |   --color-background-mute: var(--vt-c-white-mute); | ||||||
|  |  | ||||||
|  |   --color-border: var(--vt-c-divider-light-2); | ||||||
|  |   --color-border-hover: var(--vt-c-divider-light-1); | ||||||
|  |  | ||||||
|  |   --color-heading: var(--vt-c-text-light-1); | ||||||
|  |   --color-text: var(--vt-c-text-light-1); | ||||||
|  |  | ||||||
|  |   --section-gap: 160px; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @media (prefers-color-scheme: dark) { | ||||||
|  |   :root { | ||||||
|  |     --color-background: var(--vt-c-black); | ||||||
|  |     --color-background-soft: var(--vt-c-black-soft); | ||||||
|  |     --color-background-mute: var(--vt-c-black-mute); | ||||||
|  |  | ||||||
|  |     --color-border: var(--vt-c-divider-dark-2); | ||||||
|  |     --color-border-hover: var(--vt-c-divider-dark-1); | ||||||
|  |  | ||||||
|  |     --color-heading: var(--vt-c-text-dark-1); | ||||||
|  |     --color-text: var(--vt-c-text-dark-2); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | *, | ||||||
|  | *::before, | ||||||
|  | *::after { | ||||||
|  |   box-sizing: border-box; | ||||||
|  |   margin: 0; | ||||||
|  |   font-weight: normal; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | body { | ||||||
|  |   min-height: 100vh; | ||||||
|  |   color: var(--color-text); | ||||||
|  |   background: var(--color-background); | ||||||
|  |   transition: | ||||||
|  |     color 0.5s, | ||||||
|  |     background-color 0.5s; | ||||||
|  |   line-height: 1.6; | ||||||
|  |   font-family: | ||||||
|  |     Inter, | ||||||
|  |     -apple-system, | ||||||
|  |     BlinkMacSystemFont, | ||||||
|  |     'Segoe UI', | ||||||
|  |     Roboto, | ||||||
|  |     Oxygen, | ||||||
|  |     Ubuntu, | ||||||
|  |     Cantarell, | ||||||
|  |     'Fira Sans', | ||||||
|  |     'Droid Sans', | ||||||
|  |     'Helvetica Neue', | ||||||
|  |     sans-serif; | ||||||
|  |   font-size: 15px; | ||||||
|  |   text-rendering: optimizeLegibility; | ||||||
|  |   -webkit-font-smoothing: antialiased; | ||||||
|  |   -moz-osx-font-smoothing: grayscale; | ||||||
|  | } | ||||||
							
								
								
									
										1
									
								
								frontend/src/assets/logo.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								frontend/src/assets/logo.svg
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | |||||||
|  | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 261.76 226.69"><path d="M161.096.001l-30.225 52.351L100.647.001H-.005l130.877 226.688L261.749.001z" fill="#41b883"/><path d="M161.096.001l-30.225 52.351L100.647.001H52.346l78.526 136.01L209.398.001z" fill="#34495e"/></svg> | ||||||
| After Width: | Height: | Size: 276 B | 
							
								
								
									
										35
									
								
								frontend/src/assets/main.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								frontend/src/assets/main.css
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,35 @@ | |||||||
|  | @import './base.css'; | ||||||
|  |  | ||||||
|  | #app { | ||||||
|  |   max-width: 1280px; | ||||||
|  |   margin: 0 auto; | ||||||
|  |   padding: 2rem; | ||||||
|  |   font-weight: normal; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | a, | ||||||
|  | .green { | ||||||
|  |   text-decoration: none; | ||||||
|  |   color: hsla(160, 100%, 37%, 1); | ||||||
|  |   transition: 0.4s; | ||||||
|  |   padding: 3px; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @media (hover: hover) { | ||||||
|  |   a:hover { | ||||||
|  |     background-color: hsla(160, 100%, 37%, 0.2); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @media (min-width: 1024px) { | ||||||
|  |   body { | ||||||
|  |     display: flex; | ||||||
|  |     place-items: center; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   #app { | ||||||
|  |     display: grid; | ||||||
|  |     grid-template-columns: 1fr 1fr; | ||||||
|  |     padding: 0 2rem; | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										44
									
								
								frontend/src/components/HelloWorld.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								frontend/src/components/HelloWorld.vue
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,44 @@ | |||||||
|  | <script setup> | ||||||
|  | defineProps({ | ||||||
|  |   msg: { | ||||||
|  |     type: String, | ||||||
|  |     required: true | ||||||
|  |   } | ||||||
|  | }) | ||||||
|  | </script> | ||||||
|  |  | ||||||
|  | <template> | ||||||
|  |   <div class="greetings"> | ||||||
|  |     <h1 class="green">{{ msg }}</h1> | ||||||
|  |     <h3> | ||||||
|  |       You’ve successfully created a project with | ||||||
|  |       <a href="https://vitejs.dev/" target="_blank" rel="noopener">Vite</a> + | ||||||
|  |       <a href="https://vuejs.org/" target="_blank" rel="noopener">Vue 3</a>. | ||||||
|  |     </h3> | ||||||
|  |   </div> | ||||||
|  | </template> | ||||||
|  |  | ||||||
|  | <style scoped> | ||||||
|  | h1 { | ||||||
|  |   font-weight: 500; | ||||||
|  |   font-size: 2.6rem; | ||||||
|  |   position: relative; | ||||||
|  |   top: -10px; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | h3 { | ||||||
|  |   font-size: 1.2rem; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .greetings h1, | ||||||
|  | .greetings h3 { | ||||||
|  |   text-align: center; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @media (min-width: 1024px) { | ||||||
|  |   .greetings h1, | ||||||
|  |   .greetings h3 { | ||||||
|  |     text-align: left; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | </style> | ||||||
							
								
								
									
										88
									
								
								frontend/src/components/TheWelcome.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								frontend/src/components/TheWelcome.vue
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,88 @@ | |||||||
|  | <script setup> | ||||||
|  | import WelcomeItem from './WelcomeItem.vue' | ||||||
|  | import DocumentationIcon from './icons/IconDocumentation.vue' | ||||||
|  | import ToolingIcon from './icons/IconTooling.vue' | ||||||
|  | import EcosystemIcon from './icons/IconEcosystem.vue' | ||||||
|  | import CommunityIcon from './icons/IconCommunity.vue' | ||||||
|  | import SupportIcon from './icons/IconSupport.vue' | ||||||
|  | </script> | ||||||
|  |  | ||||||
|  | <template> | ||||||
|  |   <WelcomeItem> | ||||||
|  |     <template #icon> | ||||||
|  |       <DocumentationIcon /> | ||||||
|  |     </template> | ||||||
|  |     <template #heading>Documentation</template> | ||||||
|  |  | ||||||
|  |     Vue’s | ||||||
|  |     <a href="https://vuejs.org/" target="_blank" rel="noopener">official documentation</a> | ||||||
|  |     provides you with all information you need to get started. | ||||||
|  |   </WelcomeItem> | ||||||
|  |  | ||||||
|  |   <WelcomeItem> | ||||||
|  |     <template #icon> | ||||||
|  |       <ToolingIcon /> | ||||||
|  |     </template> | ||||||
|  |     <template #heading>Tooling</template> | ||||||
|  |  | ||||||
|  |     This project is served and bundled with | ||||||
|  |     <a href="https://vitejs.dev/guide/features.html" target="_blank" rel="noopener">Vite</a>. The | ||||||
|  |     recommended IDE setup is | ||||||
|  |     <a href="https://code.visualstudio.com/" target="_blank" rel="noopener">VSCode</a> + | ||||||
|  |     <a href="https://github.com/johnsoncodehk/volar" target="_blank" rel="noopener">Volar</a>. If | ||||||
|  |     you need to test your components and web pages, check out | ||||||
|  |     <a href="https://www.cypress.io/" target="_blank" rel="noopener">Cypress</a> and | ||||||
|  |     <a href="https://on.cypress.io/component" target="_blank" rel="noopener" | ||||||
|  |       >Cypress Component Testing</a | ||||||
|  |     >. | ||||||
|  |  | ||||||
|  |     <br /> | ||||||
|  |  | ||||||
|  |     More instructions are available in <code>README.md</code>. | ||||||
|  |   </WelcomeItem> | ||||||
|  |  | ||||||
|  |   <WelcomeItem> | ||||||
|  |     <template #icon> | ||||||
|  |       <EcosystemIcon /> | ||||||
|  |     </template> | ||||||
|  |     <template #heading>Ecosystem</template> | ||||||
|  |  | ||||||
|  |     Get official tools and libraries for your project: | ||||||
|  |     <a href="https://pinia.vuejs.org/" target="_blank" rel="noopener">Pinia</a>, | ||||||
|  |     <a href="https://router.vuejs.org/" target="_blank" rel="noopener">Vue Router</a>, | ||||||
|  |     <a href="https://test-utils.vuejs.org/" target="_blank" rel="noopener">Vue Test Utils</a>, and | ||||||
|  |     <a href="https://github.com/vuejs/devtools" target="_blank" rel="noopener">Vue Dev Tools</a>. If | ||||||
|  |     you need more resources, we suggest paying | ||||||
|  |     <a href="https://github.com/vuejs/awesome-vue" target="_blank" rel="noopener">Awesome Vue</a> | ||||||
|  |     a visit. | ||||||
|  |   </WelcomeItem> | ||||||
|  |  | ||||||
|  |   <WelcomeItem> | ||||||
|  |     <template #icon> | ||||||
|  |       <CommunityIcon /> | ||||||
|  |     </template> | ||||||
|  |     <template #heading>Community</template> | ||||||
|  |  | ||||||
|  |     Got stuck? Ask your question on | ||||||
|  |     <a href="https://chat.vuejs.org" target="_blank" rel="noopener">Vue Land</a>, our official | ||||||
|  |     Discord server, or | ||||||
|  |     <a href="https://stackoverflow.com/questions/tagged/vue.js" target="_blank" rel="noopener" | ||||||
|  |       >StackOverflow</a | ||||||
|  |     >. You should also subscribe to | ||||||
|  |     <a href="https://news.vuejs.org" target="_blank" rel="noopener">our mailing list</a> and follow | ||||||
|  |     the official | ||||||
|  |     <a href="https://twitter.com/vuejs" target="_blank" rel="noopener">@vuejs</a> | ||||||
|  |     twitter account for latest news in the Vue world. | ||||||
|  |   </WelcomeItem> | ||||||
|  |  | ||||||
|  |   <WelcomeItem> | ||||||
|  |     <template #icon> | ||||||
|  |       <SupportIcon /> | ||||||
|  |     </template> | ||||||
|  |     <template #heading>Support Vue</template> | ||||||
|  |  | ||||||
|  |     As an independent project, Vue relies on community backing for its sustainability. You can help | ||||||
|  |     us by | ||||||
|  |     <a href="https://vuejs.org/sponsor/" target="_blank" rel="noopener">becoming a sponsor</a>. | ||||||
|  |   </WelcomeItem> | ||||||
|  | </template> | ||||||
							
								
								
									
										87
									
								
								frontend/src/components/WelcomeItem.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								frontend/src/components/WelcomeItem.vue
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,87 @@ | |||||||
|  | <template> | ||||||
|  |   <div class="item"> | ||||||
|  |     <i> | ||||||
|  |       <slot name="icon"></slot> | ||||||
|  |     </i> | ||||||
|  |     <div class="details"> | ||||||
|  |       <h3> | ||||||
|  |         <slot name="heading"></slot> | ||||||
|  |       </h3> | ||||||
|  |       <slot></slot> | ||||||
|  |     </div> | ||||||
|  |   </div> | ||||||
|  | </template> | ||||||
|  |  | ||||||
|  | <style scoped> | ||||||
|  | .item { | ||||||
|  |   margin-top: 2rem; | ||||||
|  |   display: flex; | ||||||
|  |   position: relative; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .details { | ||||||
|  |   flex: 1; | ||||||
|  |   margin-left: 1rem; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | i { | ||||||
|  |   display: flex; | ||||||
|  |   place-items: center; | ||||||
|  |   place-content: center; | ||||||
|  |   width: 32px; | ||||||
|  |   height: 32px; | ||||||
|  |  | ||||||
|  |   color: var(--color-text); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | h3 { | ||||||
|  |   font-size: 1.2rem; | ||||||
|  |   font-weight: 500; | ||||||
|  |   margin-bottom: 0.4rem; | ||||||
|  |   color: var(--color-heading); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @media (min-width: 1024px) { | ||||||
|  |   .item { | ||||||
|  |     margin-top: 0; | ||||||
|  |     padding: 0.4rem 0 1rem calc(var(--section-gap) / 2); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   i { | ||||||
|  |     top: calc(50% - 25px); | ||||||
|  |     left: -26px; | ||||||
|  |     position: absolute; | ||||||
|  |     border: 1px solid var(--color-border); | ||||||
|  |     background: var(--color-background); | ||||||
|  |     border-radius: 8px; | ||||||
|  |     width: 50px; | ||||||
|  |     height: 50px; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   .item:before { | ||||||
|  |     content: ' '; | ||||||
|  |     border-left: 1px solid var(--color-border); | ||||||
|  |     position: absolute; | ||||||
|  |     left: 0; | ||||||
|  |     bottom: calc(50% + 25px); | ||||||
|  |     height: calc(50% - 25px); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   .item:after { | ||||||
|  |     content: ' '; | ||||||
|  |     border-left: 1px solid var(--color-border); | ||||||
|  |     position: absolute; | ||||||
|  |     left: 0; | ||||||
|  |     top: calc(50% + 25px); | ||||||
|  |     height: calc(50% - 25px); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   .item:first-of-type:before { | ||||||
|  |     display: none; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   .item:last-of-type:after { | ||||||
|  |     display: none; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | </style> | ||||||
							
								
								
									
										11
									
								
								frontend/src/components/__tests__/HelloWorld.spec.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								frontend/src/components/__tests__/HelloWorld.spec.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,11 @@ | |||||||
|  | import { describe, it, expect } from 'vitest' | ||||||
|  |  | ||||||
|  | import { mount } from '@vue/test-utils' | ||||||
|  | import HelloWorld from '../HelloWorld.vue' | ||||||
|  |  | ||||||
|  | describe('HelloWorld', () => { | ||||||
|  |   it('renders properly', () => { | ||||||
|  |     const wrapper = mount(HelloWorld, { props: { msg: 'Hello Vitest' } }) | ||||||
|  |     expect(wrapper.text()).toContain('Hello Vitest') | ||||||
|  |   }) | ||||||
|  | }) | ||||||
							
								
								
									
										7
									
								
								frontend/src/components/icons/IconCommunity.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								frontend/src/components/icons/IconCommunity.vue
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | |||||||
|  | <template> | ||||||
|  |   <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="currentColor"> | ||||||
|  |     <path | ||||||
|  |       d="M15 4a1 1 0 1 0 0 2V4zm0 11v-1a1 1 0 0 0-1 1h1zm0 4l-.707.707A1 1 0 0 0 16 19h-1zm-4-4l.707-.707A1 1 0 0 0 11 14v1zm-4.707-1.293a1 1 0 0 0-1.414 1.414l1.414-1.414zm-.707.707l-.707-.707.707.707zM9 11v-1a1 1 0 0 0-.707.293L9 11zm-4 0h1a1 1 0 0 0-1-1v1zm0 4H4a1 1 0 0 0 1.707.707L5 15zm10-9h2V4h-2v2zm2 0a1 1 0 0 1 1 1h2a3 3 0 0 0-3-3v2zm1 1v6h2V7h-2zm0 6a1 1 0 0 1-1 1v2a3 3 0 0 0 3-3h-2zm-1 1h-2v2h2v-2zm-3 1v4h2v-4h-2zm1.707 3.293l-4-4-1.414 1.414 4 4 1.414-1.414zM11 14H7v2h4v-2zm-4 0c-.276 0-.525-.111-.707-.293l-1.414 1.414C5.42 15.663 6.172 16 7 16v-2zm-.707 1.121l3.414-3.414-1.414-1.414-3.414 3.414 1.414 1.414zM9 12h4v-2H9v2zm4 0a3 3 0 0 0 3-3h-2a1 1 0 0 1-1 1v2zm3-3V3h-2v6h2zm0-6a3 3 0 0 0-3-3v2a1 1 0 0 1 1 1h2zm-3-3H3v2h10V0zM3 0a3 3 0 0 0-3 3h2a1 1 0 0 1 1-1V0zM0 3v6h2V3H0zm0 6a3 3 0 0 0 3 3v-2a1 1 0 0 1-1-1H0zm3 3h2v-2H3v2zm1-1v4h2v-4H4zm1.707 4.707l.586-.586-1.414-1.414-.586.586 1.414 1.414z" | ||||||
|  |     /> | ||||||
|  |   </svg> | ||||||
|  | </template> | ||||||
							
								
								
									
										7
									
								
								frontend/src/components/icons/IconDocumentation.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								frontend/src/components/icons/IconDocumentation.vue
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | |||||||
|  | <template> | ||||||
|  |   <svg xmlns="http://www.w3.org/2000/svg" width="20" height="17" fill="currentColor"> | ||||||
|  |     <path | ||||||
|  |       d="M11 2.253a1 1 0 1 0-2 0h2zm-2 13a1 1 0 1 0 2 0H9zm.447-12.167a1 1 0 1 0 1.107-1.666L9.447 3.086zM1 2.253L.447 1.42A1 1 0 0 0 0 2.253h1zm0 13H0a1 1 0 0 0 1.553.833L1 15.253zm8.447.833a1 1 0 1 0 1.107-1.666l-1.107 1.666zm0-14.666a1 1 0 1 0 1.107 1.666L9.447 1.42zM19 2.253h1a1 1 0 0 0-.447-.833L19 2.253zm0 13l-.553.833A1 1 0 0 0 20 15.253h-1zm-9.553-.833a1 1 0 1 0 1.107 1.666L9.447 14.42zM9 2.253v13h2v-13H9zm1.553-.833C9.203.523 7.42 0 5.5 0v2c1.572 0 2.961.431 3.947 1.086l1.107-1.666zM5.5 0C3.58 0 1.797.523.447 1.42l1.107 1.666C2.539 2.431 3.928 2 5.5 2V0zM0 2.253v13h2v-13H0zm1.553 13.833C2.539 15.431 3.928 15 5.5 15v-2c-1.92 0-3.703.523-5.053 1.42l1.107 1.666zM5.5 15c1.572 0 2.961.431 3.947 1.086l1.107-1.666C9.203 13.523 7.42 13 5.5 13v2zm5.053-11.914C11.539 2.431 12.928 2 14.5 2V0c-1.92 0-3.703.523-5.053 1.42l1.107 1.666zM14.5 2c1.573 0 2.961.431 3.947 1.086l1.107-1.666C18.203.523 16.421 0 14.5 0v2zm3.5.253v13h2v-13h-2zm1.553 12.167C18.203 13.523 16.421 13 14.5 13v2c1.573 0 2.961.431 3.947 1.086l1.107-1.666zM14.5 13c-1.92 0-3.703.523-5.053 1.42l1.107 1.666C11.539 15.431 12.928 15 14.5 15v-2z" | ||||||
|  |     /> | ||||||
|  |   </svg> | ||||||
|  | </template> | ||||||
							
								
								
									
										7
									
								
								frontend/src/components/icons/IconEcosystem.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								frontend/src/components/icons/IconEcosystem.vue
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | |||||||
|  | <template> | ||||||
|  |   <svg xmlns="http://www.w3.org/2000/svg" width="18" height="20" fill="currentColor"> | ||||||
|  |     <path | ||||||
|  |       d="M11.447 8.894a1 1 0 1 0-.894-1.789l.894 1.789zm-2.894-.789a1 1 0 1 0 .894 1.789l-.894-1.789zm0 1.789a1 1 0 1 0 .894-1.789l-.894 1.789zM7.447 7.106a1 1 0 1 0-.894 1.789l.894-1.789zM10 9a1 1 0 1 0-2 0h2zm-2 2.5a1 1 0 1 0 2 0H8zm9.447-5.606a1 1 0 1 0-.894-1.789l.894 1.789zm-2.894-.789a1 1 0 1 0 .894 1.789l-.894-1.789zm2 .789a1 1 0 1 0 .894-1.789l-.894 1.789zm-1.106-2.789a1 1 0 1 0-.894 1.789l.894-1.789zM18 5a1 1 0 1 0-2 0h2zm-2 2.5a1 1 0 1 0 2 0h-2zm-5.447-4.606a1 1 0 1 0 .894-1.789l-.894 1.789zM9 1l.447-.894a1 1 0 0 0-.894 0L9 1zm-2.447.106a1 1 0 1 0 .894 1.789l-.894-1.789zm-6 3a1 1 0 1 0 .894 1.789L.553 4.106zm2.894.789a1 1 0 1 0-.894-1.789l.894 1.789zm-2-.789a1 1 0 1 0-.894 1.789l.894-1.789zm1.106 2.789a1 1 0 1 0 .894-1.789l-.894 1.789zM2 5a1 1 0 1 0-2 0h2zM0 7.5a1 1 0 1 0 2 0H0zm8.553 12.394a1 1 0 1 0 .894-1.789l-.894 1.789zm-1.106-2.789a1 1 0 1 0-.894 1.789l.894-1.789zm1.106 1a1 1 0 1 0 .894 1.789l-.894-1.789zm2.894.789a1 1 0 1 0-.894-1.789l.894 1.789zM8 19a1 1 0 1 0 2 0H8zm2-2.5a1 1 0 1 0-2 0h2zm-7.447.394a1 1 0 1 0 .894-1.789l-.894 1.789zM1 15H0a1 1 0 0 0 .553.894L1 15zm1-2.5a1 1 0 1 0-2 0h2zm12.553 2.606a1 1 0 1 0 .894 1.789l-.894-1.789zM17 15l.447.894A1 1 0 0 0 18 15h-1zm1-2.5a1 1 0 1 0-2 0h2zm-7.447-5.394l-2 1 .894 1.789 2-1-.894-1.789zm-1.106 1l-2-1-.894 1.789 2 1 .894-1.789zM8 9v2.5h2V9H8zm8.553-4.894l-2 1 .894 1.789 2-1-.894-1.789zm.894 0l-2-1-.894 1.789 2 1 .894-1.789zM16 5v2.5h2V5h-2zm-4.553-3.894l-2-1-.894 1.789 2 1 .894-1.789zm-2.894-1l-2 1 .894 1.789 2-1L8.553.106zM1.447 5.894l2-1-.894-1.789-2 1 .894 1.789zm-.894 0l2 1 .894-1.789-2-1-.894 1.789zM0 5v2.5h2V5H0zm9.447 13.106l-2-1-.894 1.789 2 1 .894-1.789zm0 1.789l2-1-.894-1.789-2 1 .894 1.789zM10 19v-2.5H8V19h2zm-6.553-3.894l-2-1-.894 1.789 2 1 .894-1.789zM2 15v-2.5H0V15h2zm13.447 1.894l2-1-.894-1.789-2 1 .894 1.789zM18 15v-2.5h-2V15h2z" | ||||||
|  |     /> | ||||||
|  |   </svg> | ||||||
|  | </template> | ||||||
							
								
								
									
										7
									
								
								frontend/src/components/icons/IconSupport.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								frontend/src/components/icons/IconSupport.vue
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | |||||||
|  | <template> | ||||||
|  |   <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="currentColor"> | ||||||
|  |     <path | ||||||
|  |       d="M10 3.22l-.61-.6a5.5 5.5 0 0 0-7.666.105 5.5 5.5 0 0 0-.114 7.665L10 18.78l8.39-8.4a5.5 5.5 0 0 0-.114-7.665 5.5 5.5 0 0 0-7.666-.105l-.61.61z" | ||||||
|  |     /> | ||||||
|  |   </svg> | ||||||
|  | </template> | ||||||
							
								
								
									
										19
									
								
								frontend/src/components/icons/IconTooling.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								frontend/src/components/icons/IconTooling.vue
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,19 @@ | |||||||
|  | <!-- This icon is from <https://github.com/Templarian/MaterialDesign>, distributed under Apache 2.0 (https://www.apache.org/licenses/LICENSE-2.0) license--> | ||||||
|  | <template> | ||||||
|  |   <svg | ||||||
|  |     xmlns="http://www.w3.org/2000/svg" | ||||||
|  |     xmlns:xlink="http://www.w3.org/1999/xlink" | ||||||
|  |     aria-hidden="true" | ||||||
|  |     role="img" | ||||||
|  |     class="iconify iconify--mdi" | ||||||
|  |     width="24" | ||||||
|  |     height="24" | ||||||
|  |     preserveAspectRatio="xMidYMid meet" | ||||||
|  |     viewBox="0 0 24 24" | ||||||
|  |   > | ||||||
|  |     <path | ||||||
|  |       d="M20 18v-4h-3v1h-2v-1H9v1H7v-1H4v4h16M6.33 8l-1.74 4H7v-1h2v1h6v-1h2v1h2.41l-1.74-4H6.33M9 5v1h6V5H9m12.84 7.61c.1.22.16.48.16.8V18c0 .53-.21 1-.6 1.41c-.4.4-.85.59-1.4.59H4c-.55 0-1-.19-1.4-.59C2.21 19 2 18.53 2 18v-4.59c0-.32.06-.58.16-.8L4.5 7.22C4.84 6.41 5.45 6 6.33 6H7V5c0-.55.18-1 .57-1.41C7.96 3.2 8.44 3 9 3h6c.56 0 1.04.2 1.43.59c.39.41.57.86.57 1.41v1h.67c.88 0 1.49.41 1.83 1.22l2.34 5.39z" | ||||||
|  |       fill="currentColor" | ||||||
|  |     ></path> | ||||||
|  |   </svg> | ||||||
|  | </template> | ||||||
							
								
								
									
										6
									
								
								frontend/src/main.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								frontend/src/main.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,6 @@ | |||||||
|  | import './assets/main.css' | ||||||
|  |  | ||||||
|  | import { createApp } from 'vue' | ||||||
|  | import App from './App.vue' | ||||||
|  |  | ||||||
|  | createApp(App).mount('#app') | ||||||
							
								
								
									
										16
									
								
								frontend/vite.config.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								frontend/vite.config.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,16 @@ | |||||||
|  | import { fileURLToPath, URL } from 'node:url' | ||||||
|  |  | ||||||
|  | import { defineConfig } from 'vite' | ||||||
|  | import vue from '@vitejs/plugin-vue' | ||||||
|  |  | ||||||
|  | // https://vitejs.dev/config/ | ||||||
|  | export default defineConfig({ | ||||||
|  |   plugins: [ | ||||||
|  |     vue(), | ||||||
|  |   ], | ||||||
|  |   resolve: { | ||||||
|  |     alias: { | ||||||
|  |       '@': fileURLToPath(new URL('./src', import.meta.url)) | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | }) | ||||||
							
								
								
									
										14
									
								
								frontend/vitest.config.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								frontend/vitest.config.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,14 @@ | |||||||
|  | import { fileURLToPath } from 'node:url' | ||||||
|  | import { mergeConfig, defineConfig, configDefaults } from 'vitest/config' | ||||||
|  | import viteConfig from './vite.config' | ||||||
|  |  | ||||||
|  | export default mergeConfig( | ||||||
|  |   viteConfig, | ||||||
|  |   defineConfig({ | ||||||
|  |     test: { | ||||||
|  |       environment: 'jsdom', | ||||||
|  |       exclude: [...configDefaults.exclude, 'e2e/*'], | ||||||
|  |       root: fileURLToPath(new URL('./', import.meta.url)) | ||||||
|  |     } | ||||||
|  |   }) | ||||||
|  | ) | ||||||
		Reference in New Issue
	
	Block a user