%% =================================================================== %% 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() }). -record(stats, { id :: binary(), metric :: atom(), entity_id :: binary(), value :: integer() | {integer(), integer()}, timestamp :: calendar:datetime() }). -record(schema_migration, { version :: string(), applied_at :: calendar:datetime() }).