diff --git a/docs/swagger.yml b/docs/swagger.yml new file mode 100644 index 0000000..8cf9b36 --- /dev/null +++ b/docs/swagger.yml @@ -0,0 +1,232 @@ +openapi: 3.0.0 +info: + title: Chrly + version: v5 + +servers: + - url: http://skinsystem.ely.by + description: Ely.by's production server + +components: + securitySchemes: + BearerAuth: + type: http + scheme: bearer + bearerFormat: JWT + + responses: + UnauthorizedError: + description: Access token is missing or invalid + content: + application/json: + schema: + type: object + properties: + error: + type: string + example: the token doesn't have the scope to perform the action + +paths: + /api/profiles: + post: + operationId: upsertProfile + summary: Upsert player's profile. + description: > + Creates a new user profile or updates an existing one. + The user is identified by their UUID. + If several users with different UUIDs try to occupy the same username, the last one wins. + tags: + - profiles + - api + security: + - BearerAuth: [profiles] + requestBody: + content: + application/x-www-form-urlencoded: + schema: + required: + - uuid + - username + properties: + uuid: + type: string + example: 8cd2c16e-7ef3-4fa1-87ea-6e602bffd7c7 + username: + type: string + example: ErickSkrauch + skinUrl: + type: string + example: https://example.com/skin.png + skinModel: + type: string + enum: + - steve + - slim + example: slim + capeUrl: + type: string + example: https://example.com/cape.png + mojangTextures: + type: string + example: eyJ0aW1lc3RhbXAiOjE0ODYzMzcyNTQ4NzIsInByb2ZpbGVJZCI6ImM0ZjFlNTZmNjFkMTQwYTc4YzMyOGQ5MTY2ZWVmOWU3IiwicHJvZmlsZU5hbWUiOiJXaHlZb3VSZWFkVGhpcyIsInRleHR1cmVzIjp7IlNLSU4iOnsidXJsIjoiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS83Mzk1NmE4ZTY0ZWU2ZDhlYzY1NmFkYmI0NDA0ZjhlYmZmMzQxMWIwY2I5MGIzMWNiNDc2ZWNiOTk2ZDNiOCJ9fX0 + mojangSignature: + description: Required when the `mojangTextures` parameter is present in the request. + type: string + example: QH+1rlQJYk8tW+8WlSJnzxZZUL5RIkeOO33dq84cgNoxwCkzL95Zy5pbPMFhoiMXXablqXeqyNRZDQa+OewgDBSZxm0BmkNmwdTLzCPHgnlNYhwbO4sirg3hKjCZ82ORZ2q7VP2NQIwNvc3befiCakhDlMWUuhjxe7p/HKNtmKA7a/JjzmzwW7BWMv8b88ZaQaMaAc7puFQcu2E54G2Zk2kyv3T1Bm7bV4m7ymbL8McOmQc6Ph7C95/EyqIK1a5gRBUHPEFIEj0I06YKTHsCRFU1U/hJpk98xXHzHuULJobpajqYXuVJ8QEVgF8k8dn9VkS8BMbXcjzfbb6JJ36v7YIV6Rlt75wwTk2wr3C3P0ij55y0iXth1HjwcEKsg54n83d9w8yQbkUCiTpMbOqxTEOOS7G2O0ZDBJDXAKQ4n5qCiCXKZ4febv4+dWVQtgfZHnpGJUD3KdduDKslMePnECOXMjGSAOQou//yze2EkL2rBpJtAAiOtvBlm/aWnDZpij5cQk+pWmeHWZIf0LSSlsYRUWRDk/VKBvUTEAO9fqOxWqmSgQRUY2Ea56u0ZsBb4vEa1UY6mlJj3+PNZaWu5aP2E9Unh0DIawV96eW8eFQgenlNXHMmXd4aOra4sz2eeOnY53JnJP+eVE4cB1hlq8RA2mnwTtcy3lahzZonOWc= + responses: + 201: + description: The profiles has been successfully upserted. + 400: + description: Some fields doesn't pass the validation. + content: + application/json: + schema: + type: object + properties: + errors: + type: object + properties: + body: + type: array + items: + type: string + enum: + - The body of the request must be a valid url-encoded string + username: + type: array + items: + type: string + enum: + - Username is a required field + - Username must be a valid username + - Username must be a maximum of 21 in length + uuid: + type: array + items: + type: string + enum: + - Uuid is a required field + - Uuid must be a valid UUID + skinUrl: + type: array + items: + type: string + enum: + - SkinUrl must be a valid URL + skinModel: + type: array + items: + type: string + enum: + - SkinModel must be a maximum of 20 in length + capeUrl: + type: array + items: + type: string + enum: + - CapeUrl must be a valid URL + mojangTextures: + type: array + items: + type: string + enum: + - MojangTextures must be a valid Base64 string + mojangSignature: + type: array + items: + type: string + enum: + - MojangSignature is a required field + - MojangSignature must be a valid Base64 string + 401: + $ref: "#/components/responses/UnauthorizedError" + + /api/profiles/{uuid}: + delete: + operationId: deleteProfile + summary: Deletes a player's profile by its UUID. + description: Returns a successful response even if the profile did not previously exist. + tags: + - profiles + - api + parameters: + - name: uuid + in: query + required: true + description: The UUID can be passed with or without dashes, upper or lower cased. + example: 8cd2c16e-7ef3-4fa1-87ea-6e602bffd7c7 + schema: + type: string + minimum: 500 + security: + - BearerAuth: [ profiles ] + responses: + 204: + description: The profiles has been successfully deleted. + 401: + $ref: "#/components/responses/UnauthorizedError" + + /api/signer: + post: + operationId: signData + summary: Signs the sent data. + tags: + - signer + - api + security: + - BearerAuth: [ sign ] + requestBody: + content: + "*": + schema: + description: Accepts data in any format and generates a signature for it. + type: string + responses: + 200: + description: Successfully signed data. + content: + application/octet-stream+base64: + schema: + description: A base64 encoded signature for the passed data. + type: string + 401: + $ref: "#/components/responses/UnauthorizedError" + + /api/signer/public-key.pem: + get: + operationId: signerPublicKeyPem + summary: Get signer's public key in PEM format. + tags: + - signer + - api + security: + - BearerAuth: [ sign ] + responses: + 200: + description: The public file in PEM format. + content: + application/x-pem-file: + schema: + type: string + 401: + $ref: "#/components/responses/UnauthorizedError" + + /api/signer/public-key.der: + get: + operationId: signerPublicKeyPem + summary: Get signer's public key in DER format. + tags: + - signer + - api + security: + - BearerAuth: [ sign ] + responses: + 200: + description: The public file in PEM format. + content: + application/octet-stream: + schema: + type: string + format: binary + 401: + $ref: "#/components/responses/UnauthorizedError"