Files
EventHubBack/include/records.hrl

236 lines
8.5 KiB
Erlang

%% ===================================================================
%% EventHub Records Definition
%% ===================================================================
%% ------------------- Пользователи и аутентификация -------------------
-record(user, {
id :: binary(),
email :: binary(),
password_hash :: binary(),
role :: user | bot,
status :: active | frozen | deleted,
reason :: binary() | undefined,
nickname :: binary() | undefined,
avatar_url :: binary() | undefined,
timezone :: binary() | undefined,
language :: binary() | undefined,
social_links :: [binary()] | undefined,
phone :: binary() | undefined,
preferences :: map() | undefined,
created_at :: calendar:datetime(),
updated_at :: calendar:datetime()
}).
-record(session, {
token :: binary(), % JWT или refresh токен
user_id :: binary(),
expires_at :: calendar:datetime(),
type :: access | refresh
}).
%% ------------------- АДМИНИСТРАТОРЫ ------------------------------------
-record(admin, {
id :: binary(),
email :: binary(),
password_hash :: binary(),
role :: superadmin | admin | moderator | support,
status :: active | blocked,
nickname :: binary() | undefined,
avatar_url :: binary() | undefined,
timezone :: binary() | undefined,
language :: binary() | undefined,
phone :: binary() | undefined,
preferences :: map() | undefined,
created_at :: calendar:datetime(),
updated_at :: calendar:datetime()
}).
%% ------------------- СЕССИИ АДМИНИСТРАТОРОВ ---------------------------
-record(admin_session, {
token :: binary(),
admin_id :: binary(),
expires_at :: calendar:datetime(),
type :: refresh
}).
%% ------------------- Календари ---------------------------------------
-record(calendar, {
id :: binary(),
owner_id :: binary(),
title :: binary(),
description :: binary(),
short_name :: binary() | undefined,
category :: binary() | undefined,
color :: binary() | undefined,
image_url :: binary() | undefined,
settings :: map() | undefined,
tags :: [binary()],
type :: personal | commercial,
confirmation :: auto | manual | {timeout, integer()}, % секунд
rating_avg :: float(),
rating_count :: non_neg_integer(),
status :: active | frozen | deleted,
reason :: binary() | undefined,
created_at :: calendar:datetime(),
updated_at :: calendar:datetime()
}).
-record(calendar_share, {
calendar_id :: binary(),
user_id :: binary(),
rights :: read | write | admin
}).
%% ------------------- Специалисты календаря ---------------------------
-record(calendar_specialist, {
calendar_id :: binary(),
user_id :: binary(), % id пользователя-специалиста
name :: binary(), % отображаемое имя в этом календаре
specialization :: [binary()] | undefined, % список специализаций (услуг)
status :: active | inactive,
added_at :: calendar:datetime(),
updated_at :: calendar:datetime()
}).
-record(location, {
address :: binary(),
lat :: float(),
lon :: float()
}).
%% ------------------- События (включая повторяющиеся) ----------------
-record(event, {
id :: binary(),
calendar_id :: binary(),
title :: binary(),
description :: binary(),
event_type :: single | recurring,
start_time :: calendar:datetime(),
duration :: integer(), % минуты
recurrence_rule :: binary() | undefined,
master_id :: binary() | undefined,
is_instance :: boolean(),
specialist_id :: binary() | undefined,
location :: #location{} | undefined,
tags :: [binary()],
capacity :: integer() | undefined,
online_link :: binary() | undefined,
status :: active | cancelled | completed,
reason :: binary() | undefined,
rating_avg :: float(),
rating_count :: non_neg_integer(),
attachments :: [binary()] | undefined,
edit_history :: [map()] | undefined,
created_at :: calendar:datetime(),
updated_at :: calendar:datetime()
}).
-record(recurrence_exception, {
master_id :: binary(),
original_start :: calendar:datetime(),
action :: cancel | reschedule,
new_start :: calendar:datetime() | undefined
}).
%% ------------------- Бронирования ------------------------------------
-record(booking, {
id :: binary(),
event_id :: binary(), % ссылка на конкретный экземпляр события
user_id :: binary(),
status :: pending | confirmed | cancelled,
notes :: binary() | undefined,
reminder_sent :: boolean(),
confirmed_at :: calendar:datetime() | undefined,
created_at :: calendar:datetime(),
updated_at :: calendar:datetime()
}).
%% ------------------- Отзывы ------------------------------------------
-record(review, {
id :: binary(),
user_id :: binary(),
target_type :: calendar | event,
target_id :: binary(),
rating :: 1..5,
comment :: binary(),
status :: visible | hidden | deleted,
reason :: binary() | undefined,
likes :: non_neg_integer(),
dislikes :: non_neg_integer(),
created_at :: calendar:datetime(),
updated_at :: calendar:datetime()
}).
%% ------------------- Жалобы и модерация ------------------------------
-record(report, {
id :: binary(),
reporter_id :: binary(),
target_type :: calendar | event | review,
target_id :: binary(),
reason :: binary(),
status :: pending | reviewed | dismissed,
created_at :: calendar:datetime(),
resolved_at :: calendar:datetime() | undefined,
resolved_by :: binary() | undefined
}).
-record(banned_word, {
id :: binary(),
word :: binary(),
added_by :: binary() | undefined, % id администратора, добавившего слово
added_at :: calendar:datetime() | undefined
}).
%% ------------------- Баг-трекер --------------------------------------
-record(ticket, {
id :: binary(),
reporter_id :: binary(),
error_hash :: binary(),
error_message :: binary(),
stacktrace :: binary(),
context :: binary(), % ← новое поле (term_to_binary)
count :: non_neg_integer(),
first_seen :: calendar:datetime(),
last_seen :: calendar:datetime(),
status :: open | in_progress | resolved | closed,
assigned_to :: binary() | undefined,
resolution_note :: binary() | undefined
}).
%% ------------------- Подписки ----------------------------------------
-record(subscription, {
id :: binary(),
user_id :: binary(),
plan :: monthly | quarterly | biannual | annual,
status :: active | expired | cancelled,
trial_used :: boolean(),
started_at :: calendar:datetime(),
expires_at :: calendar:datetime(),
created_at :: calendar:datetime(),
updated_at :: calendar:datetime()
}).
%% ------------------- Аудит -------------------------------------------
-record(admin_audit, {
id :: binary(),
admin_id :: binary(),
email :: binary(),
role :: atom(),
action :: binary(),
entity_type :: binary(),
entity_id :: binary(),
timestamp :: calendar:datetime(),
ip :: binary(),
reason :: binary() | undefined
}).
%% ------------------- Уведомления (задача #12) ------------------------
-record(notification, {
id :: binary(),
user_id :: binary(),
type :: booking_confirmed | event_reminder | event_cancelled | custom,
title :: binary(),
body :: binary(),
is_read :: boolean(),
created_at :: calendar:datetime()
}).