Ускоряем разработку новых фич: как я написал плагин кодогенерации для Protobuf10.10.2023 12:45
package notifications
import (
"github.com/pkg/errors"
"google.golang.org/protobuf/reflect/protoreflect"
)
type NotificationProto interface {
GetGeneral() *EventGeneral
ProtoReflect() protoreflect.Message
}
type NotificationNameShortPath struct {
Name string `json:"name"`
ShortPath string `json:"short_path"`
EventTypeId int32 `json:"event_type_id"`
}
// NotificationsTypeList — cписок всех уведомлений (название, сокращенный путь топика MQTT и номер типа события контроллера)
var NotificationsTypeList = []NotificationNameShortPath{{"Фото", "********", 0}, {"Пользователь рядом (BLE)", "********", 0}, {"Пользователь ушел (BLE)", "********", 0}, {"Авторизация началась", "********", 0}, {"Авторизация завершилась успешно", "********", 0}, {"Авторизация не удалась", "********", 0}, {"Ошибка авторизации", "********", 0}, {"Синхронизация пользователей началась", "********", 0}, {"Синхронизация доступов завершилась успешно", "********", 0}, {"Синхронизация доступов завершилась с ошибкой", "********", 0}, {"Добавлен пользователь", "********", 0}, {"Обновлён пользователь", "********", 0}, {"Удалён пользователь", "********", 0}, {"Дверь открыта", "********", 0}, {"Дверь закрыта", "********", 0}, {"Контроллер включился", "********", 0}, {"Контроллер подключился", "********", 0}, {"Контроллер отключился", "********", 0}, {"Изменены настройки", "********", 0}, {"Ошибка при изменении", "********", 0}, {"Изменение состояния закрытости замка", "********", 0}, {"Изменение состояния ригеля", "********", 0}, {"Изменение состояния язычка", "********", 0}, {"Изменение состояния ручки", "********", 0}, {"Изменение состояния цилиндра", "********", 0}, {"Ошибка замка", "********", 0}}
// NotificationsGroupList — cписок всех названий групп уведомлений
var NotificationsGroupList = []string{"Фото", "Пользователь рядом", "Авторизация", "Доступы", "Дверь", "Подключение", "Настройки контроллера", "Замок"}
// NotificationsShortPathList — cписок всех сокращенных путей топиков MQTT для уведомлений
var NotificationsShortPathList = []string{"********", "********", "********", "********", "********", "********", "********", "********", "********", "********", "********", "********", "********", "********", "********", "********", "********", "********", "********", "********", "********", "********", "********", "********", "********", "********"}
// NotificationsWithGroupMap — мапа с ключом в виде названия группы уведомлений, значением структуры (название события, сокращенный путь топика MQTT)
var NotificationsWithGroupMap = map[string][]NotificationNameShortPath{
"Авторизация": []NotificationNameShortPath{{"Авторизация началась", "********", 0}, {"Авторизация завершилась успешно", "********", 0}, {"Авторизация не удалась", "********", 0}, {"Ошибка авторизации", "********", 0}},
"Дверь": []NotificationNameShortPath{{"Дверь открыта", "********", 0}, {"Дверь закрыта", "********", 0}},
"Доступы": []NotificationNameShortPath{{"Синхронизация пользователей началась", "********", 0}, {"Синхронизация доступов завершилась успешно", "********", 0}, {"Синхронизация доступов завершилась с ошибкой", "********", 0}, {"Добавлен пользователь", "********", 0}, {"Обновлён пользователь", "********", 0}, {"Удалён пользователь", "********", 0}},
"Замок": []NotificationNameShortPath{{"Изменение состояния закрытости замка", "********", 0}, {"Изменение состояния ригеля", "********", 0}, {"Изменение состояния язычка", "********", 0}, {"Изменение состояния ручки", "********", 0}, {"Изменение состояния цилиндра", "********", 0}, {"Ошибка замка", "********", 0}},
"Настройки контроллера": []NotificationNameShortPath{{"Изменены настройки", "********", 0}, {"Ошибка при изменении", "********", 0}},
"Подключение": []NotificationNameShortPath{{"Контроллер включился", "********", 0}, {"Контроллер подключился", "********", 0}, {"Контроллер отключился", "********", 0}},
"Пользователь рядом": []NotificationNameShortPath{{"Пользователь рядом (BLE)", "********", 0}, {"Пользователь ушел (BLE)", "********", 0}},
"Фото": []NotificationNameShortPath{{"Фото", "********", 0}},
}
var (
UnknownNotificationPathErr = errors.New("unknown notification path")
)
// NewNotificationByPath — функция для получения protobuf типа структуры уведомления по теме MQTT
func NewNotificationByPath(notificationPath string) (notification NotificationProto, err error) {
switch notificationPath {
case "********":
notification = new(PhotoEvent)
return
case "********":
notification = new(BleDeviceNearEvent)
return
case "********":
notification = new(BleDeviceGoneEvent)
return
case "********":
notification = new(AcsAuthProcessingEvent)
return
case "********":
notification = new(AcsAuthSuccessEvent)
return
case "********":
notification = new(AcsAuthErrorEvent)
return
case "********":
notification = new(AcsAuthFailedEvent)
return
case "********":
notification = new(AcsUserSyncProcessingEvent)
return
case "********":
notification = new(AcsUserSyncSuccessEvent)
return
case "********":
notification = new(AcsUserSyncErrorEvent)
return
case "********":
notification = new(AcsUserCreateEvent)
return
case "********":
notification = new(AcsUserUpdateEvent)
return
case "********":
notification = new(AcsUserDeleteEvent)
return
case "********":
notification = new(DoorOpenedEvent)
return
case "********":
notification = new(DoorClosedEvent)
return
case "********":
notification = new(StateStartedEvent)
return
case "********":
notification = new(StateConnectedEvent)
return
case "********":
notification = new(StateDisconnectedEvent)
return
case "********":
notification = new(ConfigSuccessEvent)
return
case "********":
notification = new(ConfigErrorEvent)
return
case "********":
notification = new(ModuleLockClosed)
return
case "********":
notification = new(ModuleLockLock)
return
case "********":
notification = new(ModuleLockTrigger)
return
case "********":
notification = new(ModuleLockHandle)
return
case "********":
notification = new(ModuleLockCylinder)
return
case "********":
notification = new(ModuleLockError)
return
default:
err = UnknownNotificationPathErr
return
}
}
// NameAndGroupByShortPathMqtt — функция для получения названия, группы и описания уведомления по сокращенной теме MQTT
// Используется для отображения списка уведомлений контроллера в панели управления и генерации уведомлений в мессенджерах
func NameAndGroupAndDescriptionByShortPathMqtt(notificationPath string) (name string, group string, description string, err error) {
switch notificationPath {
case "********":
return "Фото", "Фото", "Фото, инициированное каким-то другим событием", nil
case "********":
return "Пользователь рядом (BLE)", "Пользователь рядом", "Событие обнаружения пользователя при помощи BLE", nil
case "********":
return "Пользователь ушел (BLE)", "Пользователь рядом", "Событие потери пользователя из области видимости при помощи BLE", nil
case "********":
return "Авторизация началась", "Авторизация", "Попытка авторизации", nil
case "********":
return "Авторизация завершилась успешно", "Авторизация", "Успешная попытка авторизации", nil
case "********":
return "Авторизация не удалась", "Авторизация", "Ошибка при попытке авторизации (авторизация может быть не завершена), уведомляет о любых ошибках в процессе авторизации", nil
case "********":
return "Ошибка авторизации", "Авторизация", "Авторизация провалена (завершена)", nil
case "********":
return "Синхронизация пользователей началась", "Доступы", "Начало процесса синхронизации доступов пользователей", nil
case "********":
return "Синхронизация доступов завершилась успешно", "Доступы", "Cобытие успешной синхронизации доступов пользователей", nil
case "********":
return "Синхронизация доступов завершилась с ошибкой", "Доступы", "Ошибка при синхронизации доступов пользователей", nil
case "********":
return "Добавлен пользователь", "Доступы", "Cобытие добавления доступа пользователя", nil
case "********":
return "Обновлён пользователь", "Доступы", "Cобытие обновления данных доступа пользователя", nil
case "********":
return "Удалён пользователь", "Доступы", "Событие удаления доступа пользователя", nil
case "********":
return "Дверь открыта", "Дверь", "Cобытие открытия двери (геркон разомкнулся)", nil
case "********":
return "Дверь закрыта", "Дверь", "Событие закрытия двери (геркон замкнулся)", nil
case "********":
return "Контроллер включился", "Подключение", "Событие включения контроллера", nil
case "********":
return "Контроллер подключился", "Подключение", "Событие подключения контроллера к серверу (в том числе и после разрыва соединения)", nil
case "********":
return "Контроллер отключился", "Подключение", "Событие разрыва соединения контроллера с сервером (не отправляется контроллером)", nil
case "********":
return "Изменены настройки", "Настройки контроллера", "Событие успешного изменения настроек", nil
case "********":
return "Ошибка при изменении", "Настройки контроллера", "Событие ошибки при изменении настроек", nil
case "********":
return "Изменение состояния закрытости замка", "Замок", "Изменение состояния замка (закрыт/не закрыт)", nil
case "********":
return "Изменение состояния ригеля", "Замок", "Изменение состояния ригеля (выдвинулся/не выдвинулся)", nil
case "********":
return "Изменение состояния язычка", "Замок", "Изменение состояния язычка (нажат/не нажат)", nil
case "********":
return "Изменение состояния ручки", "Замок", "Изменение состояния ручки (нажата/не нажата)", nil
case "********":
return "Изменение состояния цилиндра", "Замок", "Изменение состояния цилиндра", nil
case "********":
return "Ошибка замка", "Замок", "Любая ошибка модуля", nil
default:
err = UnknownNotificationPathErr
return
}
}
© Habrahabr.ru