openapi: 3.0.1 info: title: Project API description: | Latihan Project API - CRUD Project - Platform Relationship - Auth - Membership & Ownership - Rights & Paging - Bug - Maintenance version: 7.0.0 servers: - url: http://localhost:8080/api/v1 tags: - name: projects description: everything project - name: platforms description: everything platform - name: users description: everything user - name: bugs description: everything bug - name: comments description: everything comment - name: maintenance description: everything maintenance paths: /projects: get: tags: - projects summary: find all project description: return all project operationId: getProject parameters: - $ref: '#/components/parameters/page' - $ref: '#/components/parameters/limit' - name: sort in: query description: sort direction (default 'project_id, desc') schema: type: string responses: 200: $ref: '#/components/responses/getArrayProject' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/UnauthorizedError' security: - testAuth: [] post: tags: - projects summary: Add new Project description: Add new Project operationId: addProject requestBody: $ref: '#/components/requestBodies/Project' responses: 201: $ref: '#/components/responses/successAddProject' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/UnauthorizedError' 409: $ref: '#/components/responses/409' 413: $ref: '#/components/responses/413' security: - testAuth: [] /projects/{projectId}: get: tags: - projects summary: find project by ID description: return project operationId: getProjectById parameters: - $ref: '#/components/parameters/projectPath' responses: 200: $ref: '#/components/responses/getSingleProject' 401: $ref: '#/components/responses/UnauthorizedError' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' security: - testAuth: [] put: tags: - projects summary: update existing project by ID description: update project operationId: updateProjectById parameters: - $ref: '#/components/parameters/projectPath' requestBody: $ref: '#/components/requestBodies/Project' responses: 200: $ref: '#/components/responses/getSingleProject' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/UnauthorizedError' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 409: $ref: '#/components/responses/409' 413: $ref: '#/components/responses/413' security: - testAuth: [] delete: tags: - projects summary: Deletes a project description: delete a project operationId: deleteProject parameters: - $ref: '#/components/parameters/projectPath' responses: 200: description: successful operation 205: description: Unable to delete. Data is used. 401: $ref: '#/components/responses/UnauthorizedError' 403: $ref: '#/components/responses/403' security: - testAuth: [] /projects/{projectId}/member: get: tags: - projects summary: find all member by project description: return all member by project operationId: getMemberByProject parameters: - $ref: '#/components/parameters/projectPath' - $ref: '#/components/parameters/roleQuery' - $ref: '#/components/parameters/page' - $ref: '#/components/parameters/limit' - $ref: '#/components/parameters/sortQuery' responses: 200: $ref: '#/components/responses/getArrayMember' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/UnauthorizedError' security: - testAuth: [] post: tags: - projects summary: add project member description: add project member operationId: addProjectMember parameters: - $ref: '#/components/parameters/projectPath' requestBody: $ref: '#/components/requestBodies/ProjectMember' responses: 201: $ref: '#/components/responses/successAddMember' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/UnauthorizedError' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 409: $ref: '#/components/responses/409' security: - testAuth: [] /projects/member/{memberId}: get: tags: - projects summary: find member by ID description: return member by ID operationId: getMemberProject parameters: - $ref: '#/components/parameters/memberPath' responses: 200: $ref: '#/components/responses/getSingleMember' 401: $ref: '#/components/responses/UnauthorizedError' security: - testAuth: [] delete: tags: - projects summary: delete project member description: delete project member operationId: deleteProjectMember parameters: - $ref: '#/components/parameters/memberPath' responses: 200: description: successful operation 401: $ref: '#/components/responses/UnauthorizedError' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' security: - testAuth: [] /projects/{projectId}/bug: get: tags: - projects summary: find all bugs of a project description: return all bugs of a project operationId: getBugByProjectId parameters: - $ref: '#/components/parameters/projectPath' - $ref: '#/components/parameters/page' - $ref: '#/components/parameters/limit' - name: sort in: query description: sort direction (default 'bug_id, desc') schema: type: string responses: 200: $ref: '#/components/responses/getArrayBug' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/UnauthorizedError' security: - testAuth: [] /platforms: get: tags: - platforms summary: find all platform of a project description: return all platform of a project operationId: getPlatformByProjectId parameters: - $ref: '#/components/parameters/projectQuery' - $ref: '#/components/parameters/page' - $ref: '#/components/parameters/limit' - name: sort in: query description: sort direction (default 'platform_id, desc') schema: type: string responses: 200: $ref: '#/components/responses/getArrayPlatform' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/UnauthorizedError' security: - testAuth: [] post: tags: - platforms summary: Add new platform for a project description: add new platform for a project operationId: addPlatformByProjectId requestBody: $ref: '#/components/requestBodies/Platform' responses: 201: $ref: '#/components/responses/successAddPlatform' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/UnauthorizedError' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 409: $ref: '#/components/responses/409' 413: $ref: '#/components/responses/413' security: - testAuth: [] /platforms/{platformId}: get: tags: - platforms summary: find platform by ID description: return platform by ID operationId: getPlatformById parameters: - $ref: '#/components/parameters/platformPath' responses: 200: $ref: '#/components/responses/getSinglePlatform' 401: $ref: '#/components/responses/UnauthorizedError' 404: $ref: '#/components/responses/404' security: - testAuth: [] put: tags: - platforms summary: update existing platform by ID description: update platform operationId: updatePlatformById parameters: - $ref: '#/components/parameters/platformPath' requestBody: $ref: '#/components/requestBodies/Platform' responses: 200: $ref: '#/components/responses/getSinglePlatform' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/UnauthorizedError' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 409: $ref: '#/components/responses/409' 413: $ref: '#/components/responses/413' security: - testAuth: [] delete: tags: - platforms summary: deletes a platform by ID description: delete a platform by ID operationId: deletePlatformById parameters: - $ref: '#/components/parameters/platformPath' responses: 200: description: successful operation 205: description: Unable to delete. Data is used. 401: $ref: '#/components/responses/UnauthorizedError' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' security: - testAuth: [] /platforms/{platformId}/bug: get: tags: - platforms summary: find all bugs of a platform description: return all bugs of a platform operationId: getBugByPlatformId parameters: - $ref: '#/components/parameters/platformPath' - $ref: '#/components/parameters/page' - $ref: '#/components/parameters/limit' - $ref: '#/components/parameters/sortQuery' responses: 200: $ref: '#/components/responses/getArrayBug' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/UnauthorizedError' security: - testAuth: [] /users: get: tags: - users summary: find all user description: return all user operationId: getUser parameters: - $ref: '#/components/parameters/page' - $ref: '#/components/parameters/limit' - $ref: '#/components/parameters/sortQuery' responses: 200: $ref: '#/components/responses/getArrayUser' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/UnauthorizedError' security: - testAuth: [] post: tags: - users summary: add user description: add new user operationId: AddUser requestBody: $ref: '#/components/requestBodies/User' responses: 201: $ref: '#/components/responses/successAddUser' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/UnauthorizedError' 409: $ref: '#/components/responses/409' 413: $ref: '#/components/responses/413' security: - testAuth: [] /users/{userId}: get: tags: - users summary: find user by userId description: return user by userId operationId: getUserById parameters: - $ref: '#/components/parameters/UserPath' responses: 200: $ref: '#/components/responses/getSingleUser' 401: $ref: '#/components/responses/UnauthorizedError' 404: $ref: '#/components/responses/404' security: - testAuth: [] put: tags: - users summary: update existing user except password description: update user operationId: updateUserById parameters: - $ref: '#/components/parameters/UserPath' requestBody: description: User object required: true content: application/json: schema: type: object properties: username: type: string example: abi name: type: string example: abidzar responses: 200: $ref: '#/components/responses/getSingleUser' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/UnauthorizedError' 404: $ref: '#/components/responses/404' 409: $ref: '#/components/responses/409' 413: $ref: '#/components/responses/413' security: - testAuth: [] delete: tags: - users summary: deletes a user by ID description: delete a user by ID operationId: deleteUserById parameters: - $ref: '#/components/parameters/UserPath' responses: 200: description: successful operation 205: description: Unable to delete. Data is used. 401: $ref: '#/components/responses/UnauthorizedError' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' security: - testAuth: [] /users/{userId}/password: put: tags: - users summary: change password description: update user password operationId: updatePassword parameters: - $ref: '#/components/parameters/UserPath' requestBody: description: User object required: true content: application/json: schema: type: object properties: oldPassword: type: string example: abi123 newPassword: type: string example: abi456 responses: 200: $ref: '#/components/responses/getSingleUser' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/UnauthorizedError' 403: description: wrong old password 404: $ref: '#/components/responses/404' security: - testAuth: [] /bugs: get: tags: - bugs summary: find all bugs description: return all bugs operationId: getBug parameters: - $ref: '#/components/parameters/page' - $ref: '#/components/parameters/limit' - $ref: '#/components/parameters/sortQuery' responses: 200: $ref: '#/components/responses/getArrayBug' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/UnauthorizedError' security: - testAuth: [] post: tags: - bugs summary: add bug description: add new bug operationId: addBug requestBody: $ref: '#/components/requestBodies/Bug' responses: 201: $ref: '#/components/responses/successAddBug' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/UnauthorizedError' 404: $ref: '#/components/responses/404' 409: $ref: '#/components/responses/409' 413: $ref: '#/components/responses/413' security: - testAuth: [] /bugs/{bugId}: get: tags: - bugs summary: find bug by ID description: return bug operationId: getBugById parameters: - $ref: '#/components/parameters/bugPath' responses: 200: $ref: '#/components/responses/getSingleBug' 401: $ref: '#/components/responses/UnauthorizedError' 404: $ref: '#/components/responses/404' security: - testAuth: [] put: tags: - bugs summary: update existing bug description: update bug operationId: updateBugById parameters: - $ref: '#/components/parameters/bugPath' requestBody: description: Bug object | level (note, minor, major) status (onprogress, done, hold, cancel) dev_status (notstart, onprogress, done) required: true content: application/json: schema: type: object properties: description: example: bug browser qc: example: 23 dev: example: 24 platform: example: web goodday_url: example: goodday.com image_url: example: image.com level: example: MAJOR status: example: ONPROGRESS dev_status: example: NOTSTART responses: 200: $ref: '#/components/responses/getSingleBug' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/UnauthorizedError' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' 409: $ref: '#/components/responses/409' 413: $ref: '#/components/responses/413' security: - testAuth: [] delete: tags: - bugs summary: deletes a bug by ID description: delete a bug by ID operationId: deleteBugById parameters: - $ref: '#/components/parameters/bugPath' responses: 200: description: successful operation 205: description: Unable to delete. Data is used. 401: $ref: '#/components/responses/UnauthorizedError' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' security: - testAuth: [] /bugs/{bugId}/comment: get: tags: - bugs summary: find all comments by bug ID description: return all comments by bug ID operationId: getCommentByBug parameters: - $ref: '#/components/parameters/bugPath' - $ref: '#/components/parameters/page' - $ref: '#/components/parameters/limit' - name: sort in: query description: sort direction (default 'comment_id, desc') schema: type: string responses: 200: $ref: '#/components/responses/getArrayComment' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/UnauthorizedError' 404: $ref: '#/components/responses/404' security: - testAuth: [] post: tags: - bugs summary: add comment description: add new comment operationId: addComment parameters: - $ref: '#/components/parameters/bugPath' requestBody: $ref: '#/components/requestBodies/Comment' responses: 201: $ref: '#/components/responses/successAddComment' 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/UnauthorizedError' 404: $ref: '#/components/responses/404' 413: $ref: '#/components/responses/413' security: - testAuth: [] /comments/{commentId}: get: tags: - comments summary: find comment by ID description: return comment operationId: getCommentById parameters: - $ref: '#/components/parameters/commentPath' responses: 200: $ref: '#/components/responses/getSingleComment' 401: $ref: '#/components/responses/UnauthorizedError' 404: $ref: '#/components/responses/404' security: - testAuth: [] delete: tags: - comments summary: deletes a comment by ID description: delete a comment by ID operationId: deleteCommentById parameters: - $ref: '#/components/parameters/commentPath' responses: 200: description: successful operation 401: $ref: '#/components/responses/UnauthorizedError' 403: $ref: '#/components/responses/403' 404: $ref: '#/components/responses/404' security: - testAuth: [] /maintenance: get: tags: - maintenance summary: backup data description: export from table operationId: exportToCSV parameters: - name: tableName in: query description: table name (bug, comment, project, platform, project_member, user) (multi table gunakan ;) schema: type: string responses: 200: description: export success content: text/csv: example: string 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/UnauthorizedError' 403: $ref: '#/components/responses/403' security: - testAuth: [] post: tags: - maintenance summary: restore data description: import to table operationId: importFromCSV parameters: - name: tableName in: query description: table name (bug, comment, project, platform, project_member, user) (multi table gunakan ;) schema: type: string - name: overwrite in: query description: overwrite table value schema: type: boolean requestBody: description: file to import required: true content: multipart/form-data: schema: type: object properties: file: type: string format: binary responses: 200: description: import success content: text/csv: example: string 400: $ref: '#/components/responses/400' 401: $ref: '#/components/responses/UnauthorizedError' 403: $ref: '#/components/responses/403' security: - testAuth: [] components: schemas: Project: required: - id - name - owner type: object properties: id: type: integer uniqueItems: true example: 2 name: type: string uniqueItems: true maximum: 100 example: PI description: type: string maximum: 255 example: PropInspector owner: $ref: '#/components/schemas/User' Platform: type: object required: - id - name properties: id: type: integer uniqueItems: true example: 3 name: type: string uniqueItems: true maximum: 100 example: mobile project_id: $ref: '#/components/schemas/Project' User: type: object required: - id - username - password - name properties: id: type: integer uniqueItems: true example: 4 username: type: string uniqueItems: true maximum: 100 example: abi password: type: string maximum: 100 example: abi123 name: type: string maximum: 255 example: abidzar Project_member: type: object properties: id: type: integer uniqueItems: true project: $ref: '#/components/schemas/Project' user: $ref: '#/components/schemas/User' role: type: number enum: [0,1,2] description: role = 0.QC, 1.Programmer, 2.Admin required: - id - project - user - role Bug: type: object properties: id: type: integer uniqueItems: true created: type: string format: date-time description: type: string maximum: 500 qc: $ref: '#/components/schemas/User' dev: $ref: '#/components/schemas/User' platform: $ref: '#/components/schemas/Platform' goodday_url: type: string format: url image_url: type: string format: url level: type: number enum: [0,1,2] description: level = 0.Note, 1.Minor, 2.Major status: type: number enum: [0,1,2,3] description: status = 0.onProgress, 1.done, 2.hold, 3.cancel dev_status: type: number enum: [0,1,2] description: dev_status = 0.notStart, 1.onProgress, 2.done required: - id - created - description - qc - dev - platform - goodday_url - level - status - dev_status Comment: type: object properties: id: type: integer uniqueItems: true bug: $ref: '#/components/schemas/Bug' creator: $ref: '#/components/schemas/User' created: type: string format: date-time content: type: string maximum: 500 required: - id - bug - creator - created - content paginatedResult: type: object properties: totalPage: { type: number, example: 2 } currentPage: { type: number, example: 0 } totalRecord: { type: number, example: 4 } results: { type: array, items: {} } parameters: projectPath: name: projectId in: path description: Project ID required: true schema: type: integer platformPath: name: platformId in: path description: Platform ID required: true schema: type: integer UserPath: name: userId in: path description: User ID required: true schema: type: integer projectQuery: name: project in: query description: Project ID schema: type: integer memberPath: name: memberId in: path description: Project Member ID required: true schema: type: integer limit: name: limit in: query description: Number of records to return (default 3) schema: type: number minimum: 1 page: name: page in: query description: Number of page to return (default 0) schema: type: number minimum: 0 roleQuery: name: role in: query description: filter role (role = QC, Programmer, Admin) schema: type: string sortQuery: name: sort in: query description: sort direction (default 'id, desc') schema: type: string bugPath: name: bugId in: path description: Bug ID required: true schema: type: integer commentPath: name: commentId in: path description: Comment ID required: true schema: type: integer responses: getSingleComment: description: successful operation content: application/json: schema: properties: id: example: 8 bug: example: error mobile creator: example: irma created: example: 22-Nov-2023 11:23:22 content: example: qc error mobile done successAddComment: description: record succesfully added content: application/json: schema: properties: id: example: 15 bug: example: error web creator: example: arif created: example: 04-Jul-2023 11:23:22 content: example: error web mulai dikerjakan getArrayComment: description: successful operation content: application/json: schema: type: object allOf: - $ref: '#/components/schemas/paginatedResult' - type: object properties: results: type: array items: properties: id: example: 3 bug: example: bug web creator: example: dama created: example: 15-Ags-2023 11:23:22 content: example: web sudah done getSingleBug: description: successful operation content: application/json: schema: properties: id: example: 1 created: example: 01-Feb-2023 11:23:22 description: example: error button qc: example: irma dev: example: dama platform: example: mobile goodday_url: example: goodday.com image_url: example: image.com level: example: MINOR status: example: ONPROGRESS dev_status: example: DONE successAddBug: description: record succesfully added content: application/json: schema: properties: id: example: 2 created: example: 23-Mar-2023 11:23:22 description: example: bug browser qc: example: mita dev: example: agus platform: example: mobile goodday_url: example: goodday.com image_url: example: image.com level: example: MINOR status: example: ONPROGRESS dev_status: example: NOTSTART getArrayBug: description: successful operation content: application/json: schema: type: object allOf: - $ref: '#/components/schemas/paginatedResult' - type: object properties: results: type: array items: properties: id: type: integer example: 1 created: type: string example: 01-Jan-2023 11:23:22 description: example: error button qc: example: irma dev: example: dama platform: example: mobile goodday_url: example: goodday.com image_url: example: image.com level: example: MINOR status: example: ONPROGRESS dev_status: example: DONE getArrayProject: description: successful operation content: application/json: schema: type: object allOf: - $ref: '#/components/schemas/paginatedResult' - type: object properties: results: type: array items: properties: id: type: integer example: 1 name: type: string example: TM description: type: string example: TelMesengger owner: properties: id: type: integer example: 1 username: type: string example: abi name: type: string example: abidzar getSingleProject: description: successful operation content: application/json: schema: properties: id: type: integer example: 1 name: type: string example: TM description: type: string example: TelMesengger owner: properties: id: type: integer example: 1 username: type: string example: abi name: type: string example: abidzar successAddProject: description: record successfully added content: application/json: schema: properties: id: type: integer example: 1 name: type: string example: TM description: type: string example: TelMesengger owner: properties: id: type: integer example: 1 username: type: string example: abi name: type: string example: abidzar successAddMember: description: record successfully added content: application/json: schema: properties: id: type: integer example: 1 project: example: TelMessenger user: example: abidzar role: type: string example: QC getArrayPlatform: description: successful operation content: application/json: schema: type: object allOf: - $ref: '#/components/schemas/paginatedResult' - type: object properties: results: type: array items: properties: id: type: integer example: 1 name: type: string example: mobile project: example: TelMessenger successAddPlatform: description: record successfully added content: application/json: schema: properties: id: type: integer example: 1 name: type: string example: mobile project: example: TelMessenger getSinglePlatform: description: successful operation content: application/json: schema: properties: id: type: integer example: 1 name: type: string example: mobile project: example: TelMessenger getArrayUser: description: successful operation content: application/json: schema: type: object allOf: - $ref: '#/components/schemas/paginatedResult' - type: object properties: results: type: array items: properties: id: type: integer example: 1 username: type: string example: abi name: type: string example: abidzar successAddUser: description: record successfully added content: application/json: schema: properties: id: type: integer example: 1 username: type: string example: abi name: type: string example: abidzar getSingleUser: description: successful operation content: application/json: schema: properties: id: type: integer example: 1 username: type: string example: abi name: type: string example: abidzar getSingleMember: description: successful operation content: application/json: schema: properties: id: example: 1 project: example: TelMessenger user: example: abidzar role: example: QC getArrayMember: description: successful operation content: application/json: schema: type: object allOf: - $ref: '#/components/schemas/paginatedResult' - type: object properties: results: type: array items: properties: id: example: 1 project: example: TelMessenger user: example: abidzar role: example: QC 400: description: invalid data 403: description: do not have rights UnauthorizedError: description: Authentication information is missing or invalid 404: description: not found 409: description: duplicate data 413: description: content too large requestBodies: Project: description: Project object required: true content: application/json: schema: type: object properties: name: type: string example: TM description: type: string example: TelMesengger ProjectMember: description: project member object | role = QC, Programmer, Admin required: true content: application/json: schema: type: object properties: user_id: type: integer example: 1 role: type: string example: qc Platform: description: Platform object required: true content: application/json: schema: type: object properties: name: type: string example: web project_name: type: string example: TM User: description: User object required: true content: application/json: schema: type: object properties: username: type: string example: abi password: type: string example: abi123 name: type: string example: abidzar Bug: description: Bug object | level (note, minor, major) status (onprogress, done, hold, cancel) dev_status (notstart, onprogress, done) required: true content: application/json: schema: type: object properties: description: example: bug button qc: example: 33 dev: example: 34 platform: example: web goodday_url: example: goodday.com image_url: example: image.com level: example: NOTE status: example: ONPROGRESS dev_status: example: NOTSTART Comment: description: Comment object required: true content: application/json: schema: type: object properties: content: example: error web mulai dikerjakan securitySchemes: testAuth: type: http scheme: basic description: use `user`/`password` to login