git init
This commit is contained in:
811
examples/TOiR.api.dsl
Normal file
811
examples/TOiR.api.dsl
Normal file
@@ -0,0 +1,811 @@
|
||||
// ─────────────────────────────────────────────
|
||||
// DTO: Вид оборудования (EquipmentType)
|
||||
// ─────────────────────────────────────────────
|
||||
|
||||
dto DTO.EquipmentType {
|
||||
description "Вид оборудования — полный объект ответа";
|
||||
|
||||
attribute code {
|
||||
type string;
|
||||
description "Код вида оборудования";
|
||||
map EquipmentType.code;
|
||||
}
|
||||
|
||||
attribute name {
|
||||
type string;
|
||||
description "Наименование вида";
|
||||
map EquipmentType.name;
|
||||
}
|
||||
|
||||
attribute manufacturer {
|
||||
type string;
|
||||
description "Производитель";
|
||||
is nullable;
|
||||
map EquipmentType.manufacturer;
|
||||
}
|
||||
|
||||
attribute maintenanceIntervalHours {
|
||||
type integer;
|
||||
description "Периодичность ТО, моточасов";
|
||||
is nullable;
|
||||
map EquipmentType.maintenanceIntervalHours;
|
||||
}
|
||||
|
||||
attribute overhaulIntervalHours {
|
||||
type integer;
|
||||
description "Периодичность КР, моточасов";
|
||||
is nullable;
|
||||
map EquipmentType.overhaulIntervalHours;
|
||||
}
|
||||
}
|
||||
|
||||
dto DTO.EquipmentTypeCreate {
|
||||
description "Вид оборудования — тело запроса на создание";
|
||||
|
||||
attribute code {
|
||||
type string;
|
||||
description "Код вида оборудования";
|
||||
is required;
|
||||
map EquipmentType.code;
|
||||
}
|
||||
|
||||
attribute name {
|
||||
type string;
|
||||
description "Наименование вида";
|
||||
is required;
|
||||
map EquipmentType.name;
|
||||
}
|
||||
|
||||
attribute manufacturer {
|
||||
type string;
|
||||
description "Производитель";
|
||||
is nullable;
|
||||
map EquipmentType.manufacturer;
|
||||
}
|
||||
|
||||
attribute maintenanceIntervalHours {
|
||||
type integer;
|
||||
description "Периодичность ТО, моточасов";
|
||||
is nullable;
|
||||
map EquipmentType.maintenanceIntervalHours;
|
||||
}
|
||||
|
||||
attribute overhaulIntervalHours {
|
||||
type integer;
|
||||
description "Периодичность КР, моточасов";
|
||||
is nullable;
|
||||
map EquipmentType.overhaulIntervalHours;
|
||||
}
|
||||
}
|
||||
|
||||
dto DTO.EquipmentTypeUpdate {
|
||||
description "Вид оборудования — тело запроса на обновление (частичное)";
|
||||
|
||||
attribute code {
|
||||
type string;
|
||||
description "Код вида оборудования";
|
||||
is nullable;
|
||||
map EquipmentType.code;
|
||||
}
|
||||
|
||||
attribute name {
|
||||
type string;
|
||||
description "Наименование вида";
|
||||
is nullable;
|
||||
map EquipmentType.name;
|
||||
}
|
||||
|
||||
attribute manufacturer {
|
||||
type string;
|
||||
description "Производитель";
|
||||
is nullable;
|
||||
map EquipmentType.manufacturer;
|
||||
}
|
||||
|
||||
attribute maintenanceIntervalHours {
|
||||
type integer;
|
||||
description "Периодичность ТО, моточасов";
|
||||
is nullable;
|
||||
map EquipmentType.maintenanceIntervalHours;
|
||||
}
|
||||
|
||||
attribute overhaulIntervalHours {
|
||||
type integer;
|
||||
description "Периодичность КР, моточасов";
|
||||
is nullable;
|
||||
map EquipmentType.overhaulIntervalHours;
|
||||
}
|
||||
}
|
||||
|
||||
dto DTO.EquipmentTypeListResponse {
|
||||
description "Список видов оборудования (формат React Admin)";
|
||||
|
||||
attribute data {
|
||||
type DTO.EquipmentType[];
|
||||
}
|
||||
|
||||
attribute total {
|
||||
type integer;
|
||||
}
|
||||
}
|
||||
|
||||
// ─────────────────────────────────────────────
|
||||
// DTO: Оборудование (Equipment)
|
||||
// ─────────────────────────────────────────────
|
||||
|
||||
dto DTO.Equipment {
|
||||
description "Единица оборудования — полный объект ответа";
|
||||
|
||||
attribute id {
|
||||
type uuid;
|
||||
map Equipment.id;
|
||||
}
|
||||
|
||||
attribute inventoryNumber {
|
||||
type string;
|
||||
description "Инвентарный номер";
|
||||
map Equipment.inventoryNumber;
|
||||
}
|
||||
|
||||
attribute serialNumber {
|
||||
type string;
|
||||
description "Заводской (серийный) номер";
|
||||
is nullable;
|
||||
map Equipment.serialNumber;
|
||||
}
|
||||
|
||||
attribute name {
|
||||
type string;
|
||||
description "Наименование единицы оборудования";
|
||||
map Equipment.name;
|
||||
}
|
||||
|
||||
attribute equipmentTypeCode {
|
||||
type string;
|
||||
description "Код вида оборудования";
|
||||
map Equipment.equipmentTypeCode;
|
||||
}
|
||||
|
||||
attribute status {
|
||||
type EquipmentStatus;
|
||||
description "Текущий статус";
|
||||
map Equipment.status;
|
||||
}
|
||||
|
||||
attribute location {
|
||||
type string;
|
||||
description "Место эксплуатации / скважина / куст";
|
||||
is nullable;
|
||||
map Equipment.location;
|
||||
}
|
||||
|
||||
attribute commissionedAt {
|
||||
type date;
|
||||
description "Дата ввода в эксплуатацию";
|
||||
is nullable;
|
||||
map Equipment.commissionedAt;
|
||||
}
|
||||
|
||||
attribute totalEngineHours {
|
||||
type decimal;
|
||||
description "Общая наработка, моточасов";
|
||||
is nullable;
|
||||
map Equipment.totalEngineHours;
|
||||
}
|
||||
|
||||
attribute engineHoursSinceLastRepair {
|
||||
type decimal;
|
||||
description "Наработка с последнего ремонта, моточасов";
|
||||
is nullable;
|
||||
map Equipment.engineHoursSinceLastRepair;
|
||||
}
|
||||
|
||||
attribute lastRepairAt {
|
||||
type date;
|
||||
description "Дата последнего ремонта";
|
||||
is nullable;
|
||||
map Equipment.lastRepairAt;
|
||||
}
|
||||
|
||||
attribute notes {
|
||||
type text;
|
||||
description "Примечания";
|
||||
is nullable;
|
||||
map Equipment.notes;
|
||||
}
|
||||
}
|
||||
|
||||
dto DTO.EquipmentCreate {
|
||||
description "Единица оборудования — тело запроса на создание";
|
||||
|
||||
attribute inventoryNumber {
|
||||
type string;
|
||||
description "Инвентарный номер";
|
||||
is required;
|
||||
map Equipment.inventoryNumber;
|
||||
}
|
||||
|
||||
attribute serialNumber {
|
||||
type string;
|
||||
description "Заводской (серийный) номер";
|
||||
is nullable;
|
||||
map Equipment.serialNumber;
|
||||
}
|
||||
|
||||
attribute name {
|
||||
type string;
|
||||
description "Наименование единицы оборудования";
|
||||
is required;
|
||||
map Equipment.name;
|
||||
}
|
||||
|
||||
attribute equipmentTypeCode {
|
||||
type string;
|
||||
description "Код вида оборудования";
|
||||
is required;
|
||||
map Equipment.equipmentTypeCode;
|
||||
}
|
||||
|
||||
attribute status {
|
||||
type EquipmentStatus;
|
||||
description "Текущий статус";
|
||||
is nullable;
|
||||
map Equipment.status;
|
||||
}
|
||||
|
||||
attribute location {
|
||||
type string;
|
||||
description "Место эксплуатации / скважина / куст";
|
||||
is nullable;
|
||||
map Equipment.location;
|
||||
}
|
||||
|
||||
attribute commissionedAt {
|
||||
type date;
|
||||
description "Дата ввода в эксплуатацию";
|
||||
is nullable;
|
||||
map Equipment.commissionedAt;
|
||||
}
|
||||
|
||||
attribute totalEngineHours {
|
||||
type decimal;
|
||||
description "Общая наработка, моточасов";
|
||||
is nullable;
|
||||
map Equipment.totalEngineHours;
|
||||
}
|
||||
|
||||
attribute engineHoursSinceLastRepair {
|
||||
type decimal;
|
||||
description "Наработка с последнего ремонта, моточасов";
|
||||
is nullable;
|
||||
map Equipment.engineHoursSinceLastRepair;
|
||||
}
|
||||
|
||||
attribute lastRepairAt {
|
||||
type date;
|
||||
description "Дата последнего ремонта";
|
||||
is nullable;
|
||||
map Equipment.lastRepairAt;
|
||||
}
|
||||
|
||||
attribute notes {
|
||||
type text;
|
||||
description "Примечания";
|
||||
is nullable;
|
||||
map Equipment.notes;
|
||||
}
|
||||
}
|
||||
|
||||
dto DTO.EquipmentUpdate {
|
||||
description "Единица оборудования — тело запроса на обновление (частичное)";
|
||||
|
||||
attribute inventoryNumber {
|
||||
type string;
|
||||
description "Инвентарный номер";
|
||||
is nullable;
|
||||
map Equipment.inventoryNumber;
|
||||
}
|
||||
|
||||
attribute serialNumber {
|
||||
type string;
|
||||
description "Заводской (серийный) номер";
|
||||
is nullable;
|
||||
map Equipment.serialNumber;
|
||||
}
|
||||
|
||||
attribute name {
|
||||
type string;
|
||||
description "Наименование единицы оборудования";
|
||||
is nullable;
|
||||
map Equipment.name;
|
||||
}
|
||||
|
||||
attribute equipmentTypeCode {
|
||||
type string;
|
||||
description "Код вида оборудования";
|
||||
is nullable;
|
||||
map Equipment.equipmentTypeCode;
|
||||
}
|
||||
|
||||
attribute status {
|
||||
type EquipmentStatus;
|
||||
description "Текущий статус";
|
||||
is nullable;
|
||||
map Equipment.status;
|
||||
}
|
||||
|
||||
attribute location {
|
||||
type string;
|
||||
description "Место эксплуатации / скважина / куст";
|
||||
is nullable;
|
||||
map Equipment.location;
|
||||
}
|
||||
|
||||
attribute commissionedAt {
|
||||
type date;
|
||||
description "Дата ввода в эксплуатацию";
|
||||
is nullable;
|
||||
map Equipment.commissionedAt;
|
||||
}
|
||||
|
||||
attribute totalEngineHours {
|
||||
type decimal;
|
||||
description "Общая наработка, моточасов";
|
||||
is nullable;
|
||||
map Equipment.totalEngineHours;
|
||||
}
|
||||
|
||||
attribute engineHoursSinceLastRepair {
|
||||
type decimal;
|
||||
description "Наработка с последнего ремонта, моточасов";
|
||||
is nullable;
|
||||
map Equipment.engineHoursSinceLastRepair;
|
||||
}
|
||||
|
||||
attribute lastRepairAt {
|
||||
type date;
|
||||
description "Дата последнего ремонта";
|
||||
is nullable;
|
||||
map Equipment.lastRepairAt;
|
||||
}
|
||||
|
||||
attribute notes {
|
||||
type text;
|
||||
description "Примечания";
|
||||
is nullable;
|
||||
map Equipment.notes;
|
||||
}
|
||||
}
|
||||
|
||||
dto DTO.EquipmentListResponse {
|
||||
description "Список оборудования (формат React Admin)";
|
||||
|
||||
attribute data {
|
||||
type DTO.Equipment[];
|
||||
}
|
||||
|
||||
attribute total {
|
||||
type integer;
|
||||
}
|
||||
}
|
||||
|
||||
// ─────────────────────────────────────────────
|
||||
// DTO: Заявка на ремонт (RepairOrder)
|
||||
// ─────────────────────────────────────────────
|
||||
|
||||
dto DTO.RepairOrder {
|
||||
description "Заявка на ремонт — полный объект ответа";
|
||||
|
||||
attribute id {
|
||||
type uuid;
|
||||
map RepairOrder.id;
|
||||
}
|
||||
|
||||
attribute number {
|
||||
type string;
|
||||
description "Номер заявки";
|
||||
map RepairOrder.number;
|
||||
}
|
||||
|
||||
attribute equipmentId {
|
||||
type uuid;
|
||||
description "Идентификатор единицы оборудования";
|
||||
map RepairOrder.equipmentId;
|
||||
}
|
||||
|
||||
attribute repairKind {
|
||||
type RepairKind;
|
||||
description "Вид ремонта";
|
||||
map RepairOrder.repairKind;
|
||||
}
|
||||
|
||||
attribute status {
|
||||
type RepairOrderStatus;
|
||||
description "Статус заявки";
|
||||
map RepairOrder.status;
|
||||
}
|
||||
|
||||
attribute plannedAt {
|
||||
type date;
|
||||
description "Плановая дата начала";
|
||||
map RepairOrder.plannedAt;
|
||||
}
|
||||
|
||||
attribute startedAt {
|
||||
type date;
|
||||
description "Фактическая дата начала";
|
||||
is nullable;
|
||||
map RepairOrder.startedAt;
|
||||
}
|
||||
|
||||
attribute completedAt {
|
||||
type date;
|
||||
description "Фактическая дата завершения";
|
||||
is nullable;
|
||||
map RepairOrder.completedAt;
|
||||
}
|
||||
|
||||
attribute contractor {
|
||||
type string;
|
||||
description "Подрядная организация (если внешний ремонт)";
|
||||
is nullable;
|
||||
map RepairOrder.contractor;
|
||||
}
|
||||
|
||||
attribute engineHoursAtRepair {
|
||||
type decimal;
|
||||
description "Наработка на момент ремонта, моточасов";
|
||||
is nullable;
|
||||
map RepairOrder.engineHoursAtRepair;
|
||||
}
|
||||
|
||||
attribute description {
|
||||
type text;
|
||||
description "Описание работ / дефекта";
|
||||
is nullable;
|
||||
map RepairOrder.description;
|
||||
}
|
||||
|
||||
attribute notes {
|
||||
type text;
|
||||
description "Примечания";
|
||||
is nullable;
|
||||
map RepairOrder.notes;
|
||||
}
|
||||
}
|
||||
|
||||
dto DTO.RepairOrderCreate {
|
||||
description "Заявка на ремонт — тело запроса на создание";
|
||||
|
||||
attribute number {
|
||||
type string;
|
||||
description "Номер заявки";
|
||||
is required;
|
||||
map RepairOrder.number;
|
||||
}
|
||||
|
||||
attribute equipmentId {
|
||||
type uuid;
|
||||
description "Идентификатор единицы оборудования";
|
||||
is required;
|
||||
map RepairOrder.equipmentId;
|
||||
}
|
||||
|
||||
attribute repairKind {
|
||||
type RepairKind;
|
||||
description "Вид ремонта";
|
||||
is required;
|
||||
map RepairOrder.repairKind;
|
||||
}
|
||||
|
||||
attribute status {
|
||||
type RepairOrderStatus;
|
||||
description "Статус заявки";
|
||||
is nullable;
|
||||
map RepairOrder.status;
|
||||
}
|
||||
|
||||
attribute plannedAt {
|
||||
type date;
|
||||
description "Плановая дата начала";
|
||||
is required;
|
||||
map RepairOrder.plannedAt;
|
||||
}
|
||||
|
||||
attribute startedAt {
|
||||
type date;
|
||||
description "Фактическая дата начала";
|
||||
is nullable;
|
||||
map RepairOrder.startedAt;
|
||||
}
|
||||
|
||||
attribute completedAt {
|
||||
type date;
|
||||
description "Фактическая дата завершения";
|
||||
is nullable;
|
||||
map RepairOrder.completedAt;
|
||||
}
|
||||
|
||||
attribute contractor {
|
||||
type string;
|
||||
description "Подрядная организация (если внешний ремонт)";
|
||||
is nullable;
|
||||
map RepairOrder.contractor;
|
||||
}
|
||||
|
||||
attribute engineHoursAtRepair {
|
||||
type decimal;
|
||||
description "Наработка на момент ремонта, моточасов";
|
||||
is nullable;
|
||||
map RepairOrder.engineHoursAtRepair;
|
||||
}
|
||||
|
||||
attribute description {
|
||||
type text;
|
||||
description "Описание работ / дефекта";
|
||||
is nullable;
|
||||
map RepairOrder.description;
|
||||
}
|
||||
|
||||
attribute notes {
|
||||
type text;
|
||||
description "Примечания";
|
||||
is nullable;
|
||||
map RepairOrder.notes;
|
||||
}
|
||||
}
|
||||
|
||||
dto DTO.RepairOrderUpdate {
|
||||
description "Заявка на ремонт — тело запроса на обновление (частичное)";
|
||||
|
||||
attribute number {
|
||||
type string;
|
||||
description "Номер заявки";
|
||||
is nullable;
|
||||
map RepairOrder.number;
|
||||
}
|
||||
|
||||
attribute equipmentId {
|
||||
type uuid;
|
||||
description "Идентификатор единицы оборудования";
|
||||
is nullable;
|
||||
map RepairOrder.equipmentId;
|
||||
}
|
||||
|
||||
attribute repairKind {
|
||||
type RepairKind;
|
||||
description "Вид ремонта";
|
||||
is nullable;
|
||||
map RepairOrder.repairKind;
|
||||
}
|
||||
|
||||
attribute status {
|
||||
type RepairOrderStatus;
|
||||
description "Статус заявки";
|
||||
is nullable;
|
||||
map RepairOrder.status;
|
||||
}
|
||||
|
||||
attribute plannedAt {
|
||||
type date;
|
||||
description "Плановая дата начала";
|
||||
is nullable;
|
||||
map RepairOrder.plannedAt;
|
||||
}
|
||||
|
||||
attribute startedAt {
|
||||
type date;
|
||||
description "Фактическая дата начала";
|
||||
is nullable;
|
||||
map RepairOrder.startedAt;
|
||||
}
|
||||
|
||||
attribute completedAt {
|
||||
type date;
|
||||
description "Фактическая дата завершения";
|
||||
is nullable;
|
||||
map RepairOrder.completedAt;
|
||||
}
|
||||
|
||||
attribute contractor {
|
||||
type string;
|
||||
description "Подрядная организация (если внешний ремонт)";
|
||||
is nullable;
|
||||
map RepairOrder.contractor;
|
||||
}
|
||||
|
||||
attribute engineHoursAtRepair {
|
||||
type decimal;
|
||||
description "Наработка на момент ремонта, моточасов";
|
||||
is nullable;
|
||||
map RepairOrder.engineHoursAtRepair;
|
||||
}
|
||||
|
||||
attribute description {
|
||||
type text;
|
||||
description "Описание работ / дефекта";
|
||||
is nullable;
|
||||
map RepairOrder.description;
|
||||
}
|
||||
|
||||
attribute notes {
|
||||
type text;
|
||||
description "Примечания";
|
||||
is nullable;
|
||||
map RepairOrder.notes;
|
||||
}
|
||||
}
|
||||
|
||||
dto DTO.RepairOrderListResponse {
|
||||
description "Список заявок на ремонт (формат React Admin)";
|
||||
|
||||
attribute data {
|
||||
type DTO.RepairOrder[];
|
||||
}
|
||||
|
||||
attribute total {
|
||||
type integer;
|
||||
}
|
||||
}
|
||||
|
||||
// ─────────────────────────────────────────────
|
||||
// API: Виды оборудования
|
||||
// ─────────────────────────────────────────────
|
||||
|
||||
api API.EquipmentTypes {
|
||||
description "API управления справочником видов оборудования";
|
||||
|
||||
endpoint listEquipmentTypes {
|
||||
label "GET /equipment-types";
|
||||
description "Список видов оборудования (фильтры и пагинация — query-параметры)";
|
||||
attribute response {
|
||||
type DTO.EquipmentTypeListResponse;
|
||||
}
|
||||
}
|
||||
|
||||
endpoint getEquipmentType {
|
||||
label "GET /equipment-types/{code}";
|
||||
description "Получить вид оборудования по коду";
|
||||
attribute code {
|
||||
type string;
|
||||
}
|
||||
attribute response {
|
||||
type DTO.EquipmentType;
|
||||
}
|
||||
}
|
||||
|
||||
endpoint createEquipmentType {
|
||||
label "POST /equipment-types";
|
||||
description "Создать вид оборудования";
|
||||
attribute request {
|
||||
type DTO.EquipmentTypeCreate;
|
||||
}
|
||||
}
|
||||
|
||||
endpoint updateEquipmentType {
|
||||
label "PATCH /equipment-types/{code}";
|
||||
description "Обновить вид оборудования";
|
||||
attribute code {
|
||||
type string;
|
||||
}
|
||||
attribute request {
|
||||
type DTO.EquipmentTypeUpdate;
|
||||
}
|
||||
}
|
||||
|
||||
endpoint deleteEquipmentType {
|
||||
label "DELETE /equipment-types/{code}";
|
||||
description "Удалить вид оборудования";
|
||||
attribute code {
|
||||
type string;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ─────────────────────────────────────────────
|
||||
// API: Оборудование
|
||||
// ─────────────────────────────────────────────
|
||||
|
||||
api API.Equipment {
|
||||
description "API управления оборудованием";
|
||||
|
||||
endpoint listEquipment {
|
||||
label "GET /equipment";
|
||||
description "Список оборудования (фильтры и пагинация — query-параметры)";
|
||||
attribute response {
|
||||
type DTO.EquipmentListResponse;
|
||||
}
|
||||
}
|
||||
|
||||
endpoint getEquipment {
|
||||
label "GET /equipment/{id}";
|
||||
description "Получить единицу оборудования по идентификатору";
|
||||
attribute id {
|
||||
type uuid;
|
||||
}
|
||||
attribute response {
|
||||
type DTO.Equipment;
|
||||
}
|
||||
}
|
||||
|
||||
endpoint createEquipment {
|
||||
label "POST /equipment";
|
||||
description "Создать единицу оборудования";
|
||||
attribute request {
|
||||
type DTO.EquipmentCreate;
|
||||
}
|
||||
}
|
||||
|
||||
endpoint updateEquipment {
|
||||
label "PATCH /equipment/{id}";
|
||||
description "Обновить единицу оборудования";
|
||||
attribute id {
|
||||
type uuid;
|
||||
}
|
||||
attribute request {
|
||||
type DTO.EquipmentUpdate;
|
||||
}
|
||||
}
|
||||
|
||||
endpoint deleteEquipment {
|
||||
label "DELETE /equipment/{id}";
|
||||
description "Удалить единицу оборудования";
|
||||
attribute id {
|
||||
type uuid;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ─────────────────────────────────────────────
|
||||
// API: Заявки на ремонт
|
||||
// ─────────────────────────────────────────────
|
||||
|
||||
api API.RepairOrders {
|
||||
description "API управления заявками на ремонт";
|
||||
|
||||
endpoint listRepairOrders {
|
||||
label "GET /repair-orders";
|
||||
description "Список заявок на ремонт (фильтры и пагинация — query-параметры)";
|
||||
attribute response {
|
||||
type DTO.RepairOrderListResponse;
|
||||
}
|
||||
}
|
||||
|
||||
endpoint getRepairOrder {
|
||||
label "GET /repair-orders/{id}";
|
||||
description "Получить заявку на ремонт по идентификатору";
|
||||
attribute id {
|
||||
type uuid;
|
||||
}
|
||||
attribute response {
|
||||
type DTO.RepairOrder;
|
||||
}
|
||||
}
|
||||
|
||||
endpoint createRepairOrder {
|
||||
label "POST /repair-orders";
|
||||
description "Создать заявку на ремонт";
|
||||
attribute request {
|
||||
type DTO.RepairOrderCreate;
|
||||
}
|
||||
}
|
||||
|
||||
endpoint updateRepairOrder {
|
||||
label "PATCH /repair-orders/{id}";
|
||||
description "Обновить заявку на ремонт";
|
||||
attribute id {
|
||||
type uuid;
|
||||
}
|
||||
attribute request {
|
||||
type DTO.RepairOrderUpdate;
|
||||
}
|
||||
}
|
||||
|
||||
endpoint deleteRepairOrder {
|
||||
label "DELETE /repair-orders/{id}";
|
||||
description "Удалить заявку на ремонт";
|
||||
attribute id {
|
||||
type uuid;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user