// Code generated by sqlc. DO NOT EDIT. // versions: // sqlc v1.30.0 package database import ( "database/sql/driver" "fmt" "net/netip" "github.com/jackc/pgx/v5/pgtype" ) // Статусы жизненного цикла жалобы type ComplaintStatus string const ( ComplaintStatusPending ComplaintStatus = "pending" ComplaintStatusInReview ComplaintStatus = "in_review" ComplaintStatusResolved ComplaintStatus = "resolved" ComplaintStatusRejected ComplaintStatus = "rejected" ) func (e *ComplaintStatus) Scan(src interface{}) error { switch s := src.(type) { case []byte: *e = ComplaintStatus(s) case string: *e = ComplaintStatus(s) default: return fmt.Errorf("unsupported scan type for ComplaintStatus: %T", src) } return nil } type NullComplaintStatus struct { ComplaintStatus ComplaintStatus `json:"complaint_status"` Valid bool `json:"valid"` // Valid is true if ComplaintStatus is not NULL } // Scan implements the Scanner interface. func (ns *NullComplaintStatus) Scan(value interface{}) error { if value == nil { ns.ComplaintStatus, ns.Valid = "", false return nil } ns.Valid = true return ns.ComplaintStatus.Scan(value) } // Value implements the driver Valuer interface. func (ns NullComplaintStatus) Value() (driver.Value, error) { if !ns.Valid { return nil, nil } return string(ns.ComplaintStatus), nil } func AllComplaintStatusValues() []ComplaintStatus { return []ComplaintStatus{ ComplaintStatusPending, ComplaintStatusInReview, ComplaintStatusResolved, ComplaintStatusRejected, } } // Типы жалоб на пользователей type ComplaintType string const ( ComplaintTypeInappropriateBehavior ComplaintType = "inappropriate_behavior" ComplaintTypeNoShow ComplaintType = "no_show" ComplaintTypeFraud ComplaintType = "fraud" ComplaintTypeSpam ComplaintType = "spam" ComplaintTypeOther ComplaintType = "other" ) func (e *ComplaintType) Scan(src interface{}) error { switch s := src.(type) { case []byte: *e = ComplaintType(s) case string: *e = ComplaintType(s) default: return fmt.Errorf("unsupported scan type for ComplaintType: %T", src) } return nil } type NullComplaintType struct { ComplaintType ComplaintType `json:"complaint_type"` Valid bool `json:"valid"` // Valid is true if ComplaintType is not NULL } // Scan implements the Scanner interface. func (ns *NullComplaintType) Scan(value interface{}) error { if value == nil { ns.ComplaintType, ns.Valid = "", false return nil } ns.Valid = true return ns.ComplaintType.Scan(value) } // Value implements the driver Valuer interface. func (ns NullComplaintType) Value() (driver.Value, error) { if !ns.Valid { return nil, nil } return string(ns.ComplaintType), nil } func AllComplaintTypeValues() []ComplaintType { return []ComplaintType{ ComplaintTypeInappropriateBehavior, ComplaintTypeNoShow, ComplaintTypeFraud, ComplaintTypeSpam, ComplaintTypeOther, } } // Типы действий модераторов для аудита type ModeratorActionType string const ( ModeratorActionTypeApproveRequest ModeratorActionType = "approve_request" ModeratorActionTypeRejectRequest ModeratorActionType = "reject_request" ModeratorActionTypeBlockUser ModeratorActionType = "block_user" ModeratorActionTypeUnblockUser ModeratorActionType = "unblock_user" ModeratorActionTypeResolveComplaint ModeratorActionType = "resolve_complaint" ModeratorActionTypeRejectComplaint ModeratorActionType = "reject_complaint" ModeratorActionTypeEditRequest ModeratorActionType = "edit_request" ModeratorActionTypeDeleteRequest ModeratorActionType = "delete_request" ) func (e *ModeratorActionType) Scan(src interface{}) error { switch s := src.(type) { case []byte: *e = ModeratorActionType(s) case string: *e = ModeratorActionType(s) default: return fmt.Errorf("unsupported scan type for ModeratorActionType: %T", src) } return nil } type NullModeratorActionType struct { ModeratorActionType ModeratorActionType `json:"moderator_action_type"` Valid bool `json:"valid"` // Valid is true if ModeratorActionType is not NULL } // Scan implements the Scanner interface. func (ns *NullModeratorActionType) Scan(value interface{}) error { if value == nil { ns.ModeratorActionType, ns.Valid = "", false return nil } ns.Valid = true return ns.ModeratorActionType.Scan(value) } // Value implements the driver Valuer interface. func (ns NullModeratorActionType) Value() (driver.Value, error) { if !ns.Valid { return nil, nil } return string(ns.ModeratorActionType), nil } func AllModeratorActionTypeValues() []ModeratorActionType { return []ModeratorActionType{ ModeratorActionTypeApproveRequest, ModeratorActionTypeRejectRequest, ModeratorActionTypeBlockUser, ModeratorActionTypeUnblockUser, ModeratorActionTypeResolveComplaint, ModeratorActionTypeRejectComplaint, ModeratorActionTypeEditRequest, ModeratorActionTypeDeleteRequest, } } // Статусы жизненного цикла заявки на помощь type RequestStatus string const ( RequestStatusPendingModeration RequestStatus = "pending_moderation" RequestStatusApproved RequestStatus = "approved" RequestStatusInProgress RequestStatus = "in_progress" RequestStatusCompleted RequestStatus = "completed" RequestStatusCancelled RequestStatus = "cancelled" RequestStatusRejected RequestStatus = "rejected" ) func (e *RequestStatus) Scan(src interface{}) error { switch s := src.(type) { case []byte: *e = RequestStatus(s) case string: *e = RequestStatus(s) default: return fmt.Errorf("unsupported scan type for RequestStatus: %T", src) } return nil } type NullRequestStatus struct { RequestStatus RequestStatus `json:"request_status"` Valid bool `json:"valid"` // Valid is true if RequestStatus is not NULL } // Scan implements the Scanner interface. func (ns *NullRequestStatus) Scan(value interface{}) error { if value == nil { ns.RequestStatus, ns.Valid = "", false return nil } ns.Valid = true return ns.RequestStatus.Scan(value) } // Value implements the driver Valuer interface. func (ns NullRequestStatus) Value() (driver.Value, error) { if !ns.Valid { return nil, nil } return string(ns.RequestStatus), nil } func AllRequestStatusValues() []RequestStatus { return []RequestStatus{ RequestStatusPendingModeration, RequestStatusApproved, RequestStatusInProgress, RequestStatusCompleted, RequestStatusCancelled, RequestStatusRejected, } } // Статусы отклика волонтёра на заявку type ResponseStatus string const ( ResponseStatusPending ResponseStatus = "pending" ResponseStatusAccepted ResponseStatus = "accepted" ResponseStatusRejected ResponseStatus = "rejected" ResponseStatusCancelled ResponseStatus = "cancelled" ) func (e *ResponseStatus) Scan(src interface{}) error { switch s := src.(type) { case []byte: *e = ResponseStatus(s) case string: *e = ResponseStatus(s) default: return fmt.Errorf("unsupported scan type for ResponseStatus: %T", src) } return nil } type NullResponseStatus struct { ResponseStatus ResponseStatus `json:"response_status"` Valid bool `json:"valid"` // Valid is true if ResponseStatus is not NULL } // Scan implements the Scanner interface. func (ns *NullResponseStatus) Scan(value interface{}) error { if value == nil { ns.ResponseStatus, ns.Valid = "", false return nil } ns.Valid = true return ns.ResponseStatus.Scan(value) } // Value implements the driver Valuer interface. func (ns NullResponseStatus) Value() (driver.Value, error) { if !ns.Valid { return nil, nil } return string(ns.ResponseStatus), nil } func AllResponseStatusValues() []ResponseStatus { return []ResponseStatus{ ResponseStatusPending, ResponseStatusAccepted, ResponseStatusRejected, ResponseStatusCancelled, } } // Жалобы пользователей друг на друга type Complaint struct { ID int64 `json:"id"` // Пользователь, подающий жалобу ComplainantID int64 `json:"complainant_id"` // Пользователь, на которого жалуются DefendantID int64 `json:"defendant_id"` RequestID pgtype.Int8 `json:"request_id"` Type ComplaintType `json:"type"` Title string `json:"title"` Description string `json:"description"` Status NullComplaintStatus `json:"status"` ModeratorID pgtype.Int8 `json:"moderator_id"` ModeratorComment pgtype.Text `json:"moderator_comment"` ResolvedAt pgtype.Timestamptz `json:"resolved_at"` CreatedAt pgtype.Timestamptz `json:"created_at"` UpdatedAt pgtype.Timestamptz `json:"updated_at"` } // Полный аудит всех действий модераторов в системе type ModeratorAction struct { ID int64 `json:"id"` ModeratorID int64 `json:"moderator_id"` ActionType ModeratorActionType `json:"action_type"` TargetUserID pgtype.Int8 `json:"target_user_id"` TargetRequestID pgtype.Int8 `json:"target_request_id"` TargetComplaintID pgtype.Int8 `json:"target_complaint_id"` Comment pgtype.Text `json:"comment"` // Дополнительные данные в JSON (изменённые поля, причины и т.д.) Metadata []byte `json:"metadata"` CreatedAt pgtype.Timestamptz `json:"created_at"` } // Справочник разрешений для RBAC системы type Permission struct { ID int64 `json:"id"` Name string `json:"name"` // Ресурс: request, user, complaint и т.д. Resource string `json:"resource"` // Действие: create, read, update, delete, moderate Action string `json:"action"` Description pgtype.Text `json:"description"` CreatedAt pgtype.Timestamptz `json:"created_at"` } // Рейтинги волонтёров за выполненную помощь type Rating struct { ID int64 `json:"id"` // Связь с откликом (один рейтинг на один отклик) VolunteerResponseID int64 `json:"volunteer_response_id"` // Денормализация для быстрого доступа VolunteerID int64 `json:"volunteer_id"` // Кто оставил рейтинг RequesterID int64 `json:"requester_id"` RequestID int64 `json:"request_id"` // Оценка от 1 до 5 звёзд Rating int32 `json:"rating"` Comment pgtype.Text `json:"comment"` CreatedAt pgtype.Timestamptz `json:"created_at"` UpdatedAt pgtype.Timestamptz `json:"updated_at"` } // Refresh токены для JWT аутентификации type RefreshToken struct { ID int64 `json:"id"` UserID int64 `json:"user_id"` // Хеш refresh токена Token string `json:"token"` ExpiresAt pgtype.Timestamptz `json:"expires_at"` UserAgent pgtype.Text `json:"user_agent"` IpAddress *netip.Addr `json:"ip_address"` // Токен отозван (для принудительного логаута) Revoked pgtype.Bool `json:"revoked"` RevokedAt pgtype.Timestamptz `json:"revoked_at"` CreatedAt pgtype.Timestamptz `json:"created_at"` } // Заявки на помощь от маломобильных граждан type Request struct { ID int64 `json:"id"` RequesterID int64 `json:"requester_id"` RequestTypeID int64 `json:"request_type_id"` // Волонтёр, который взял заявку в работу AssignedVolunteerID pgtype.Int8 `json:"assigned_volunteer_id"` Title string `json:"title"` Description string `json:"description"` // Координаты места, где нужна помощь (WGS84, SRID 4326) Location interface{} `json:"location"` Address string `json:"address"` City pgtype.Text `json:"city"` DesiredCompletionDate pgtype.Timestamptz `json:"desired_completion_date"` // Срочность: low, medium, high, urgent Urgency pgtype.Text `json:"urgency"` Status NullRequestStatus `json:"status"` ModerationComment pgtype.Text `json:"moderation_comment"` ModeratedBy pgtype.Int8 `json:"moderated_by"` ModeratedAt pgtype.Timestamptz `json:"moderated_at"` ContactPhone pgtype.Text `json:"contact_phone"` // Дополнительная информация: код домофона, этаж и т.д. ContactNotes pgtype.Text `json:"contact_notes"` CreatedAt pgtype.Timestamptz `json:"created_at"` UpdatedAt pgtype.Timestamptz `json:"updated_at"` CompletedAt pgtype.Timestamptz `json:"completed_at"` // Soft delete - дата удаления заявки DeletedAt pgtype.Timestamptz `json:"deleted_at"` } // Полная история изменения статусов заявок для аудита type RequestStatusHistory struct { ID int64 `json:"id"` RequestID int64 `json:"request_id"` // Предыдущий статус (NULL при создании) FromStatus NullRequestStatus `json:"from_status"` ToStatus RequestStatus `json:"to_status"` ChangedBy int64 `json:"changed_by"` Comment pgtype.Text `json:"comment"` CreatedAt pgtype.Timestamptz `json:"created_at"` } // Справочник типов помощи (продукты, медикаменты, техника) type RequestType struct { ID int64 `json:"id"` Name string `json:"name"` Description pgtype.Text `json:"description"` // Название иконки для UI Icon pgtype.Text `json:"icon"` // Активность типа (для скрытия без удаления) IsActive pgtype.Bool `json:"is_active"` CreatedAt pgtype.Timestamptz `json:"created_at"` } // Справочник ролей для RBAC системы type Role struct { ID int64 `json:"id"` // Уникальное название роли Name string `json:"name"` Description pgtype.Text `json:"description"` CreatedAt pgtype.Timestamptz `json:"created_at"` } // Связь ролей и разрешений (Many-to-Many) для гибкой системы RBAC type RolePermission struct { ID int64 `json:"id"` RoleID int64 `json:"role_id"` PermissionID int64 `json:"permission_id"` CreatedAt pgtype.Timestamptz `json:"created_at"` } // Пользователи системы: маломобильные граждане, волонтёры, модераторы type User struct { ID int64 `json:"id"` Email string `json:"email"` Phone pgtype.Text `json:"phone"` PasswordHash string `json:"password_hash"` FirstName string `json:"first_name"` LastName string `json:"last_name"` AvatarUrl pgtype.Text `json:"avatar_url"` // Координаты домашнего адреса в формате WGS84 (SRID 4326) Location interface{} `json:"location"` Address pgtype.Text `json:"address"` City pgtype.Text `json:"city"` // Средний рейтинг волонтёра (0-5), обновляется триггером VolunteerRating pgtype.Numeric `json:"volunteer_rating"` // Количество выполненных заявок, обновляется триггером CompletedRequestsCount pgtype.Int4 `json:"completed_requests_count"` IsVerified pgtype.Bool `json:"is_verified"` IsBlocked pgtype.Bool `json:"is_blocked"` EmailVerified pgtype.Bool `json:"email_verified"` CreatedAt pgtype.Timestamptz `json:"created_at"` UpdatedAt pgtype.Timestamptz `json:"updated_at"` LastLoginAt pgtype.Timestamptz `json:"last_login_at"` // Soft delete - дата удаления пользователя DeletedAt pgtype.Timestamptz `json:"deleted_at"` } // Блокировки пользователей модераторами type UserBlock struct { ID int64 `json:"id"` UserID int64 `json:"user_id"` BlockedBy int64 `json:"blocked_by"` ComplaintID pgtype.Int8 `json:"complaint_id"` Reason string `json:"reason"` // Дата окончания блокировки (NULL = бессрочная) BlockedUntil pgtype.Timestamptz `json:"blocked_until"` // Активна ли блокировка в данный момент IsActive pgtype.Bool `json:"is_active"` CreatedAt pgtype.Timestamptz `json:"created_at"` UnblockedAt pgtype.Timestamptz `json:"unblocked_at"` UnblockedBy pgtype.Int8 `json:"unblocked_by"` } // Связь пользователей и ролей (Many-to-Many). Один пользователь может иметь несколько ролей type UserRole struct { ID int64 `json:"id"` UserID int64 `json:"user_id"` RoleID int64 `json:"role_id"` AssignedAt pgtype.Timestamptz `json:"assigned_at"` // Кто назначил роль (для аудита) AssignedBy pgtype.Int8 `json:"assigned_by"` } // Активные сессии пользователей для отслеживания активности type UserSession struct { ID int64 `json:"id"` UserID int64 `json:"user_id"` SessionToken string `json:"session_token"` RefreshTokenID pgtype.Int8 `json:"refresh_token_id"` ExpiresAt pgtype.Timestamptz `json:"expires_at"` // Последняя активность пользователя в сессии LastActivityAt pgtype.Timestamptz `json:"last_activity_at"` UserAgent pgtype.Text `json:"user_agent"` IpAddress *netip.Addr `json:"ip_address"` // Информация об устройстве: ОС, браузер, версия и т.д. DeviceInfo []byte `json:"device_info"` CreatedAt pgtype.Timestamptz `json:"created_at"` } // Отклики волонтёров на заявки помощи type VolunteerResponse struct { ID int64 `json:"id"` RequestID int64 `json:"request_id"` VolunteerID int64 `json:"volunteer_id"` Status NullResponseStatus `json:"status"` // Сообщение волонтёра при отклике (опционально) Message pgtype.Text `json:"message"` // Время создания отклика RespondedAt pgtype.Timestamptz `json:"responded_at"` AcceptedAt pgtype.Timestamptz `json:"accepted_at"` RejectedAt pgtype.Timestamptz `json:"rejected_at"` CreatedAt pgtype.Timestamptz `json:"created_at"` UpdatedAt pgtype.Timestamptz `json:"updated_at"` }