# Добро пожаловать!

Здесь описана документация для API Завгара


# Zavgar API Reference

API представляет собой GraphQL-сервер по адресу <https://zavgar.parking24.online/api/zavgar/graphql>.

Все запросы к эндпоинту должны быть **POST** с хедером **content-type: application/json; charset=utf-8**.

Для [авторизации](/reference/zavgar-api-reference/rest/auth) нужны **email** и **пароль** пользователя и **clientId** и **clientSecret** приложения. **clientId** и **clientSecret** можно узнать у разработчиков.&#x20;

Для выполнения авторизированных запросов передайте хедер **authorization: Bearer <ПОЛУЧЕННЫЙ\_ТОКЕН>**.


# REST

Используется для авторизации пользователя.&#x20;

Все адреса запросов указаны относительно [`https://zavgar.parking24.online/api/zavgar`](https://zavgar.parking24.online/api/zavgar)


# /auth

Авторизировать пользователя

```phpdoc
POST /auth
```

### Параметры запроса

* **login** - логин. Пока в качестве логина используется **email**
* **password** - пароль
* **clientId** - ID клиента
* **clientSecret** - Secret  клиента

### Ответ

* [**UserApplicationToken**](/reference/zavgar-api-reference/graphql/types/userapplicationtoken) - токен

{% hint style="info" %}
**clientId** и **clientSecret** можно узнать у разработчиков.
{% endhint %}


# GraphQL

Для ознакомления с GraphQL: <https://graphql.org/learn/>.


# Queries


# freePlacesByInterval

Получить список свободных мест объекта на определенном интервале времени

```graphql
freePlacesByInterval(
  objectId: Int!, 
  since: Long!, 
  until: Long!
): [Place!]!
```

### Параметры

* [**filters**](/reference/zavgar-api-reference/graphql/inputs/placefiltersinput) - фильтр по местам
* **since** - дата начала интервала
* **until** - дата окончания интервала

### Ответ

* **\[**[**Place**](/reference/zavgar-api-reference/graphql/types/place)**!]!** - список мест


# objects

Получить список объектов

```graphql
objects(
  filters: ObjectFiltersInput!
): ObjectList!
```

### Параметры

* [**filters**](/reference/zavgar-api-reference/graphql/inputs/objectfiltersinput) - фильтр по объектам

### Ответ

* [**ObjectList**](/reference/zavgar-api-reference/graphql/types/objectlist) - список объектов


# orders

Получить список заказов

```graphql
orders(
  rentFilters: OrderFiltersInput
): OrderList!
```

### Параметры

* [**rentFilters**](/reference/zavgar-api-reference/graphql/inputs/orderfiltersinput) - фильтр по заказам аренды

### Ответ

* [**OrderList**](/reference/zavgar-api-reference/graphql/types/orderlist) - список заказов


# places

Получить список мест

```graphql
# Get places
places(
  filters: PlaceFiltersInput!
): PlaceList!
```

### Параметры

* [**filters**](/reference/zavgar-api-reference/graphql/inputs/placefiltersinput) - фильтр по местам

### Ответ

* [**PlaceList**](/reference/zavgar-api-reference/graphql/types/placelist) - список мест со статусом


# placeStatusAtTime

Получить статус места в определенное время

```graphql
placeStatusAtTime(
  filters: PlaceFiltersInput!
  datetime: Int!
): PlaceStatusAtTimeList!
```

### Параметры

* [**filters**](/reference/zavgar-api-reference/graphql/inputs/placefiltersinput) - фильтр по местам
* **datetime** - время

{% hint style="info" %}
**datetime** указывается в формате **timestamp (millis)**
{% endhint %}

### Ответ

* [**PlaceStatusAtTimeList**](/reference/zavgar-api-reference/graphql/types/placestatusattimelist) - список мест со статусом


# Mutations


# createPass

Создание пропуска

```graphql
createPass(
 input: PassCreateInput!
): Pass!
```

### Параметры

* [**input**](/reference/zavgar-api-reference/graphql/inputs/passcreateinput) - данные пропуска&#x20;

### Ответ

* [**Pass**](/reference/zavgar-api-reference/graphql/types/pass) **-** данные пропуска


# Types


# Object

```graphql
type Object {
  # ID
  id: Int!

  # Name
  name: String!
}

```


# ObjectList

```graphql
type ObjectList {

  # Current item count
  current: Int!

  # Object list
  items: [Object!]!

  # Total item count without limit and offset
  total: Long!
}

```


# Contact

```graphql
type Contact {
  id: Int!
  
  # Contact first name
  firstName: String

  # Contact middle name
  middleName: String

  # Contact phone
  phone: String

  # Contact second name
  secondName: String

  # Get contact fio. Example: "Bazarov Evgeny Vasilyevich"
  fio: String

  # Get contact short fio. Example: "Bazarov E. V."
  fioShort: String

  # Get one vehicle
  vehicle: Vehicle!

  # Get contact's vehicles
  vehicles: [Vehicle!]!
}
```


# Order

```graphql
type Order {
  # Date pay
  datePay: Long

  # Order ID
  id: String!

  # Order status
  status: String!

  # Order total
  total: Float!

  # Get contact
  contact: Contact

  # Get pretty dateStart
  datePayPretty: String!

  # Rent order info
  rentOrder: RentOrder
}

```


# OrderList

```graphql
type OrderList {
  # All orders price
  amount: Float!

  # Current item count
  current: Int!

  # Order list
  items: [Order!]!

  # Total item count without limit and offset
  total: Long!
}
```


# Place

```graphql
type Place {

  # ID
  id: Int!
  
  # Number
  number: Int!
  
  # Name
  name: String!
  
  # Zone ID
  zoneId: Int!

  # Get zone
  zone: Zone!
}
```


# PlaceStatusAtTime

```graphql
type PlaceStatusAtTime {

  # Place ID
  placeId: Int!
  
  # Status
  status: PlaceStatus!

  # Get place
  place: Place!
}
```


# PlaceStatusAtTimeList

```graphql
type PlaceStatusAtTimeList {
  total: Long!
  current: Int!
  items: [PlaceStatusAtTime!]!
}
```


# PlaceList

```graphql
type PlaceList {
  total: Long!
  current: Int!
  items: [Place!]!
}
```


# Place

```graphql
type Place {
  # ID
  id: Int!
  
  # Name
  name: String!
  
  # Number
  number: Int!
  
  # Zone ID
  zoneId: Int!
  
  # Get place status at time in millis. Use null for current time
  status(at: Long, until: Long): PlaceStatus!
  
  # Get zone
  zone: Zone!
}

```


# Pass

```graphql
type Pass {
  # ID
  id: Int!
  
  # Assignee ID
  assigneeId: Int!
  
  # Assignee
  assignee: Contact!
  
  # Date start
  dateStart: Long!
  
  # Date finish
  dateFinish: Long!
  
  # Floor ID
  floorId: Int!
  
  # Organization ID
  organizationId: Int!
  
  # Status
  status: PassStatus!
}
```


# RentOrder

```graphql
type RentOrder {
  # Rent order's duration type have been created with
  durationType: DurationType

  # Rent ID
  rentId: Int!

  # Get rent
  rent: Rent!
}

```


# Rent

```graphql
type Rent {
  # Contact ID
  contactId: Int!

  # ID
  id: Int!

  # Place ID
  placeId: Int!

  # Get contact
  contact: Contact!

  # Get place
  place: Place!
}

```


# UserApplicationToken

Authorization token

To make authorized requests add header "Authorization: Bearer \<TOKEN\_VALUE>" to request

```graphql
type UserApplicationToken {
  token: String!
}

```


# Vehicle

```graphql
type Vehicle {
  id: Int!

  # Vehicle number plate
  number: String!
}
```


# Zone

```graphql
type Zone {

  # ID
  id: Int!

  # Number
  number: Int!

  # Name
  name: String

  # Object ID
  objectId: Int!
}
```


# Inputs


# ObjectFiltersInput

```graphql
input ObjectFiltersInput {

  # Limit
  limit: Int

  # Offset
  offset: Long
}
```

### Параметры

* **limit** - количество
* **offset** - сдвиг относительно начала списка


# PlaceFiltersInput

```graphql
input PlaceFiltersInput {
  
  # Object ID
  objectId: Int
  
  # Limit
  limit: Int
  
  # Offset
  offset: Long
}
```

### Параметры

* **objectId** - ID объекта
* **limit** - количество
* **offset** - сдвиг относительно начала списка


# VehicleCreateInput

```graphql
input VehicleCreateInput {
  # Brand
  brand: String
  
  # Country
  country: String!
  
  # Number
  number: String!
}
```


# ContactCreateInput

```graphql
input ContactCreateInput {
  # City
  city: String!
  
  # Email
  email: String
  
  # SecondName
  secondName: String
  
  # FirstName
  firstName: String
  
  # MiddleName
  middleName: String
  
  # Phone
  phone: String!
  
  # Vehicle
  vehicle: VehicleCreateInput!
}

```

### Параметры

* [**vehicle**](/reference/zavgar-api-reference/graphql/inputs/vehiclecreateinput) - автомобиль пользователя


# OrderFiltersInput

```graphql
input OrderFiltersInput {
  # Limit
  limit: Int!

  # Object
  objectId: Int

  # Offset
  offset: Long

  # Since some date (milliseconds)
  since: Long

  # Until some date (milliseconds)
  until: Long
}

```

### Параметры

* **limit** - количество
* **offset** - сдвиг относительно начала списка
* **objectId** - ID объекта
* **since** - с какой даты&#x20;
* **until** - до какой даты &#x20;

{% hint style="info" %}
**since** и **until** указываются в формате **timestamp (millis)**
{% endhint %}


# PassCreateInput

```graphql
type PassCreateInput {
  # Assignee contact
  assignee: ContactCreateInput
  
  # Company INN
  companyInn: String
  
  # Date start (milliseconds)
  dateStart: Long!
  
  # Floor ID
  floorId: Int!
}
```

### Параметры

* [**assignee**](/reference/zavgar-api-reference/graphql/inputs/contactcreateinput) - пользователь
* **companyInn** - ИНН компании
* **dateStart** - дата начала пропуска&#x20;
* **floorId** - ID этажа &#x20;

{% hint style="info" %}
Созданный пропуск действует весь день (с 00:00:00 по 23:59:59)
{% endhint %}

{% hint style="info" %}
**dateStart** указывается в формате **timestamp (millis)**
{% endhint %}


# Enums


# PlaceStatus

Стстус места

```graphql
enum PlaceStatus {
  UNAVAILABLE
  FREE
  CONTACT
  SYSTEM
}
```

* UNAVAILABLE - недоступно
* FREE - свободно
* CONTACT - занято
* SYSTEM - зарезервировано системой (пока не используется)


# DurationType

```graphql
enum DurationType {
  HOUR
  DAY
  MONTH
}
```

* HOUR - почасовая оплата
* DAY - посуточная оплата
* MONTH - помесячная оплата


# PassStatus

```graphql
enum PassStatus {
  NEW
  ACTIVE
  EXPIRED
}
```

* NEW - новый пропуск
* ACTIVE - пропуск был использован хотя бы 1 раз
* EXPIRED - пропуск закончился


