Description


This API describes the different resources that are available in the PetOwner API. This API is consumed by the MyPets backend.


Authentication


All calls to the API require that a basic authentication string is present in the request with a username/password combination for a user that has the role FUGAPETOWNER. Currently the MYPETS user fulfills this role.


Besides authentication we also use an X-Application-Key header for auditing. The acceptable keys can be found in the fuga.properties file under the petOwnerApi key.


Endpoints


The base URL for the API is: https://(test2.)sonetas.eu/fuga/rest/petowner


AgendaResource


createAppointment


POST /appointments/{practiceId}/{clientUsername}


With URL request params:

  • practiceId -> integer value of the practice to which the user belongs
  • clientUsername -> myPetsUsername of the user


With request body:


{
    "date": string (yyyy-MM-dd),
    "beginTime": string (HH:mm),
    "endTime": string (HH:mm),
    "patientId": int
    "description": string,
    "vetId": int,
    "consultationRoomId": int,
    "sendReminder": string (EWrittenContactMediumPreference.class) - optional
}


Has response:

  • HTTP 200 with data:

{
    "id": int
}


With potential errors:

  • HTTP 400 if the request body has validation/parsing errors
  • HTTP 409 if the selected slot is no longer available
  • HTTP 500 for any other internal error


deleteAppointment


DELETE /appointments/{practiceId}/{clientUsername}/{personId}/{appointmentId}


With URL request params:

  • practiceId -> integer value of the practice to which the user belongs
  • clientUsername -> myPetsUsername of the user
  • personId -> integer value of the id of the associated Person record in Fuga
  • appointmentId -> integer value of the appointment to delete


Has response:

  • HTTP 200 without data


With potentials errors:

  • HTTP 404 if the appointment with appointmentId cannot be found
  • HTTP 500 for any other internal error


getAgendaSlotsBetweenDates


GET /agendaPublicSlots/{practiceId}


With URL request params:

  • practiceId -> integer value of the practiceId to which the user belongs


With URL query params:

  • clientUsername -> myPetsUsername of the user
  • personId -> integer value of the id of the associated Person record in Fuga
  • startDate -> string value of the start date in format yyyy-MM-dd
  • endDate -> string value of the end date in format yyyy-MM-dd


Has response:

  • HTTP 200 with data:

{
    "slots": [
        {
            "type": {
                "id": int,
                "nameTDutch": string,
                "nameTFrench": string,
                "nameTEnglish": string,
                "duration": int,
                "species": string (ESpecies.class) - optional
            },
            "data": [
                {
                    "date": string (yyyy-MM-dd),
                    "beginTime": string (HH:mm),
                    "endTime": string (HH:mm),
                    "state": string (EAgendaPublicSlotState.class),
                    "vet": string,
                    "vetId": int,
                    "consultationRoomId": int,
                    "publicLocationId": int
                }
            ]
        }
    ]
}


With potential errors:

  • HTTP 400 in case startDate or endDate is NULL
  • HTTP 500 for any other internal error

getAppointments


GET /appointments/{practiceId}/{clientUsername}/{personId}


With URL request params:

  • practiceId -> integer value of the practiceId to which the user belongs
  • clientUsername -> myPetsUsername of the user
  • personId -> integer value of the id of the associated Person record in Fuga


With URL query params:

  • startDate -> string value of the start date in format yyyy-MM-dd
  • endDate -> string value of the end date in format yyyy-MM-dd


Has response:

  • HTTP 200 with data:

{
    "appointments": [
        {
            "id": int,
            "date": string (yyyy-MM-dd),
            "beginTime": string (HH:mm),
            "endTime": string (HH:mm),
            "type": string (EBciType.class),
            "state": string (EAgendaPublicSlotState.class),
            "description": string - optional,
            "vet": string,
            "vetId": int,
            "patientId": int - optional,
            "patientName": string - optional,
            "locationName": string,
            "locationId": int,
            "consultationRoomId": int,
            "consultationRoom": string,
            "registrationDate": string (yyyy-MM-dd) - optional,
            "registrationTime": string (HH:mm) - optional
        }
    ]
}


With potential errors:

  • HTTP 500 for any internal error


ClientsResource


addDeviceToken


POST /clients/deviceToken/{practiceId}/{clientUsername}


With URL request params:

  • practiceId -> integer value of the practice the user belongs to
  • clientUsername -> myPetsUsername of the user


With request body:


{
    "type": string (EDeviceTokenType.class),
    "identifier": string
}


Has response:

  • HTTP 200 without data


With potential errors:

  • HTTP 400 if the request body has validation/parsing errors
  • HTTP 500 for any other internal error


getClient


GET /clients/{practiceId}/{clientUsername}


With URL request params:

  • practiceId -> integer value of the practice the user belongs to
  • clientUsername -> myPetsUsername of the user


Has response:

  • HTTP 200 with profile of the user (no example shown because it's very long and many things are optional)


With potential errors:

  • HTTP 500 for any other internal error


getMessages


GET /messages/{practiceId}/{clientUsername}/{personId}


With URL request params:

  • practiceId -> integer value of the practice the user belongs to
  • clientUsername -> myPetsUsername of the user
  • personId -> integer value of the id of the associated Person record in Fuga


Has response:

  • HTTP 200 with data:

{
    "messages": [
        {
            "id": int,
            "source": string,
            "sourceType": string (EMyPetsMessageSource.class),
            "messageType": string (EMyPetsMessageType.class),
            "source": string,
            "modifiedDateTime": string (yyyy-MM-dd'T'HH:mm:ss),
            "read": boolean,
            "title": string,
            "contentHtml": string,
            "marketing": boolean
        }
    ]
}


With potential errors:

  • HTTP 500 for any other internal error


login


POST /clients/login


With request body:


{
    "username": string,
    "password": string,
    "practiceIds": string[]
}


Has response:

  • HTTP 200 without data


With potential errors:

  • HTTP 401 if there is no username/password combination that matches for any of the provided practiceIds


messageRead


PUT /clients/{practiceId}/{clientUsername}/{personId}/{messageId}


With URL request params:

  • practiceId -> integer value of the practice the user belongs to
  • clientUsername -> myPetsUsername of the user
  • personId -> integer value of the id of the associated Person record in Fuga
  • messageId -> integer value of the id of the message you wish to mark as read


Has response:

  • HTTP 200 without data


With potential error:

  • HTTP 500 for any other internal error


register


POST /clients/{practiceId}


With URL request params:

  • practiceId -> integer value of the practice for which the registration should be completed


With URL query params:

  • returnFullProfile -> whether or not to return the full profile (default: false)


With request body:


{
    "email": string,
    "password": string,
    "title": string (EPersonTitle.class),
    "firstName": string,
    "lastName": string,
    "language": string (ELanguage.class),
    "streetAndNumber": string,
    "city": string,
    "zipCode": string,
    "country": string (ECountry.class),
    "phone": string,
    "gsm": string,
    "alreadyClient": boolean
}


Has response:

  • HTTP 200 with either full profile or simply the personId if returnFullProfile was false.


With potential errors:

  • HTTP 400 if the request body has validation/parsing errors
  • HTTP 406 if the password is not considered secure enough
  • HTTP 409 if there already exists a user with that email address
  • HTTP 500 for any other internal error


updateClient


PUT /clients/{practiceId}/{clientUsername}/{personId}


With URL request params:

  • practiceId -> integer value of the practice the user belongs to
  • clientUsername -> myPetsUsername of the user
  • personId -> integer value of the id of the associated Person record in Fuga


With URL query params:

  • returnFullProfile -> whether or not to return the full profile (default: false)


With request body:


{
    "title": string (EPersonTitle.class),
    "firstName": string,
    "lastName": string,
    "language": string (ELanguage.class),
    "streetAndNumber": string,
    "city": string,
    "zipCode": string,
    "country": string (ECountry.class),
    "dateOfBirth": string (yyyy-MM-dd),
    "language": string (ELanguage.class),
    "showOnlyNormalAnimals": boolean,
    "contactMedia": [
        {
            "type": string (EContactMedium.class),
            "identifier": string
        }
    ],
    "sendMailing": string (EWrittenContactMediumPreference.class),
    "sendFinancialDocs": string (EWrittenContactMediumPreference.class),
    "sendTreatmentReminder": string (EWrittenContactMediumPreference.class),
    "sendConsultationAppointmentConfirmation":string (EWrittenContactMediumPreference.class),
    "sendConsultationAppointmentReminder": string (EWrittenContactMediumPreference.class),
    "sendMyPetsMessageNotification": string (EWrittenContactMediumPreference.class),
    "allowMarketingMessages": boolean,
    "allowStatsToThirdParties": boolean,
    "newClientUsername": string
}


Has response:

  • HTTP 200 with either full profile or simply the personId if returnFullProfile was false.


With potential errors:

  • HTTP 304 if the practice does not allow a client with outstanding payments to update their details
  • HTTP 400 in case the newUsername is already in use
  • HTTP 400 if the request body has validation/parsing errors
  • HTTP 500 for any other internal error


updateOrCreateAnimal


PUT /animals/{practiceId}/{clientUsername}/{personId}/{animalId}

With URL request params:

  • practiceId -> integer value of the practice the user belongs to
  • clientUsername -> myPetsUsername of the user
  • personId -> integer value of the id of the associated Person record in Fuga
  • animalId -> integer value of the id of the animal you wish to edit (0 if adding a new animal)


With URL query params:

  • returnFullProfile -> whether or not to return the full profile (default: false)


With request body:


{
    "name": string,
    "dateOfBirth": string (yyyy-MM-dd) - optional,
    "species": string (ESpecies.class) - optional,
    "breedId": int (0 is unset) - optional,
    "sex": string (ESex.class) - optional,
    "sterilized": string (ESterilized.class) - optional,
    "register": string - optional,
    "passport": string - optional,
    "pictureFilename": string - optional,
    "pictureData": string (base64 encoded) - optional
}


Has response:

  • HTTP 200 with either full profile or simply the personId if returnFullProfile was false.


With potential errors:

  • HTTP 400 if the request body has validation/parsing errors
  • HTTP 500 for any other internal error


PracticeResource


getCommonInfo


GET /practices/commonInfo


Has response:

  • HTTP 200 with data:

{
    "animalClasses": [
        {
            "class": string (EAnimalClass.class),
            "species": [
                string (ESpecies.class)
            ]
        }
    ]
}


With potential errors:

  • HTTP 500 for any other internal error


getPractice


GET /practices/{practiceId}


With URL request params:

  • practiceId -> integer value of the practice


Has response:

  • HTTP 200 with practice profile data (see eu.sonetas.fuga.rs.server.petowner.PracticesResource#appendJson for full list of returned properties)


With potential errors:

  • HTTP 500 for any other internal error


getPractices


GET /practices

Has response:

  • HTTP 200 with list of practices (see eu.sonetas.fuga.rs.server.petowner.PracticesResource#appendJson for full list of returned properties)


With potential errors:

  • HTTP 500 for any other internal error


ShopResource


createOrder


POST /orders/{practiceId}/{clientUsername}


With URL request params:

  • practiceId -> integer value of the practice the user belongs to
  • clientUsername -> myPetsUsername of the user


With request body:


{
    "orders": [
        {
            "productId": int,
            "patientId": int,
            "nbr": int,
            "listPrice": double,
            "description": string
        }
    ]
}


Has response:

  • HTTP 200 with data:

{
     "ids": [
         int
     ]
}


With potential errors:

  • HTTP 400 if the request body has validation/parsing errors
  • HTTP 500 if there is an error sending the confirmation mail
  • HTTP 500 for any other internal error