1031 lines
31 KiB
Go
1031 lines
31 KiB
Go
// Code generated by sqlc. DO NOT EDIT.
|
|
// versions:
|
|
// sqlc v1.30.0
|
|
// source: requests.sql
|
|
|
|
package database
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/jackc/pgx/v5/pgtype"
|
|
)
|
|
|
|
const ApproveRequest = `-- name: ApproveRequest :exec
|
|
UPDATE requests SET
|
|
status = 'approved',
|
|
moderated_by = $2,
|
|
moderated_at = CURRENT_TIMESTAMP,
|
|
moderation_comment = $3,
|
|
updated_at = CURRENT_TIMESTAMP
|
|
WHERE id = $1
|
|
AND status = 'pending_moderation'
|
|
AND deleted_at IS NULL
|
|
`
|
|
|
|
type ApproveRequestParams struct {
|
|
ID int64 `json:"id"`
|
|
ModeratedBy pgtype.Int8 `json:"moderated_by"`
|
|
ModerationComment pgtype.Text `json:"moderation_comment"`
|
|
}
|
|
|
|
func (q *Queries) ApproveRequest(ctx context.Context, arg ApproveRequestParams) error {
|
|
_, err := q.db.Exec(ctx, ApproveRequest, arg.ID, arg.ModeratedBy, arg.ModerationComment)
|
|
return err
|
|
}
|
|
|
|
const AssignVolunteerToRequest = `-- name: AssignVolunteerToRequest :exec
|
|
UPDATE requests SET
|
|
assigned_volunteer_id = $2,
|
|
status = 'in_progress',
|
|
updated_at = CURRENT_TIMESTAMP
|
|
WHERE id = $1
|
|
AND deleted_at IS NULL
|
|
`
|
|
|
|
type AssignVolunteerToRequestParams struct {
|
|
ID int64 `json:"id"`
|
|
AssignedVolunteerID pgtype.Int8 `json:"assigned_volunteer_id"`
|
|
}
|
|
|
|
func (q *Queries) AssignVolunteerToRequest(ctx context.Context, arg AssignVolunteerToRequestParams) error {
|
|
_, err := q.db.Exec(ctx, AssignVolunteerToRequest, arg.ID, arg.AssignedVolunteerID)
|
|
return err
|
|
}
|
|
|
|
const CancelRequest = `-- name: CancelRequest :exec
|
|
UPDATE requests SET
|
|
status = 'cancelled',
|
|
updated_at = CURRENT_TIMESTAMP
|
|
WHERE id = $1
|
|
AND deleted_at IS NULL
|
|
`
|
|
|
|
func (q *Queries) CancelRequest(ctx context.Context, id int64) error {
|
|
_, err := q.db.Exec(ctx, CancelRequest, id)
|
|
return err
|
|
}
|
|
|
|
const CompleteRequest = `-- name: CompleteRequest :exec
|
|
UPDATE requests SET
|
|
status = 'completed',
|
|
completed_at = CURRENT_TIMESTAMP,
|
|
updated_at = CURRENT_TIMESTAMP
|
|
WHERE id = $1
|
|
AND deleted_at IS NULL
|
|
`
|
|
|
|
func (q *Queries) CompleteRequest(ctx context.Context, id int64) error {
|
|
_, err := q.db.Exec(ctx, CompleteRequest, id)
|
|
return err
|
|
}
|
|
|
|
const CountRequestsByRequester = `-- name: CountRequestsByRequester :one
|
|
|
|
SELECT COUNT(*) FROM requests
|
|
WHERE requester_id = $1
|
|
AND deleted_at IS NULL
|
|
`
|
|
|
|
// ============================================================================
|
|
// Статистика
|
|
// ============================================================================
|
|
func (q *Queries) CountRequestsByRequester(ctx context.Context, requesterID int64) (int64, error) {
|
|
row := q.db.QueryRow(ctx, CountRequestsByRequester, requesterID)
|
|
var count int64
|
|
err := row.Scan(&count)
|
|
return count, err
|
|
}
|
|
|
|
const CountRequestsByStatus = `-- name: CountRequestsByStatus :one
|
|
SELECT COUNT(*) FROM requests
|
|
WHERE status = $1
|
|
AND deleted_at IS NULL
|
|
`
|
|
|
|
func (q *Queries) CountRequestsByStatus(ctx context.Context, status NullRequestStatus) (int64, error) {
|
|
row := q.db.QueryRow(ctx, CountRequestsByStatus, status)
|
|
var count int64
|
|
err := row.Scan(&count)
|
|
return count, err
|
|
}
|
|
|
|
const CreateRequest = `-- name: CreateRequest :one
|
|
|
|
|
|
INSERT INTO requests (
|
|
requester_id,
|
|
request_type_id,
|
|
title,
|
|
description,
|
|
location,
|
|
address,
|
|
city,
|
|
desired_completion_date,
|
|
urgency,
|
|
contact_phone,
|
|
contact_notes
|
|
) VALUES (
|
|
$1,
|
|
$2,
|
|
$3,
|
|
$4,
|
|
ST_SetSRID(ST_MakePoint($5, $6), 4326)::geography,
|
|
$7,
|
|
$8,
|
|
$9,
|
|
$10,
|
|
$11,
|
|
$12
|
|
) RETURNING
|
|
id,
|
|
requester_id,
|
|
request_type_id,
|
|
title,
|
|
description,
|
|
ST_Y(location::geometry) as latitude,
|
|
ST_X(location::geometry) as longitude,
|
|
address,
|
|
city,
|
|
desired_completion_date,
|
|
urgency,
|
|
contact_phone,
|
|
contact_notes,
|
|
status,
|
|
assigned_volunteer_id,
|
|
created_at,
|
|
updated_at,
|
|
deleted_at
|
|
`
|
|
|
|
type CreateRequestParams struct {
|
|
RequesterID int64 `json:"requester_id"`
|
|
RequestTypeID int64 `json:"request_type_id"`
|
|
Title string `json:"title"`
|
|
Description string `json:"description"`
|
|
StMakepoint interface{} `json:"st_makepoint"`
|
|
StMakepoint_2 interface{} `json:"st_makepoint_2"`
|
|
Address string `json:"address"`
|
|
City pgtype.Text `json:"city"`
|
|
DesiredCompletionDate pgtype.Timestamptz `json:"desired_completion_date"`
|
|
Urgency pgtype.Text `json:"urgency"`
|
|
ContactPhone pgtype.Text `json:"contact_phone"`
|
|
ContactNotes pgtype.Text `json:"contact_notes"`
|
|
}
|
|
|
|
type CreateRequestRow struct {
|
|
ID int64 `json:"id"`
|
|
RequesterID int64 `json:"requester_id"`
|
|
RequestTypeID int64 `json:"request_type_id"`
|
|
Title string `json:"title"`
|
|
Description string `json:"description"`
|
|
Latitude interface{} `json:"latitude"`
|
|
Longitude interface{} `json:"longitude"`
|
|
Address string `json:"address"`
|
|
City pgtype.Text `json:"city"`
|
|
DesiredCompletionDate pgtype.Timestamptz `json:"desired_completion_date"`
|
|
Urgency pgtype.Text `json:"urgency"`
|
|
ContactPhone pgtype.Text `json:"contact_phone"`
|
|
ContactNotes pgtype.Text `json:"contact_notes"`
|
|
Status NullRequestStatus `json:"status"`
|
|
AssignedVolunteerID pgtype.Int8 `json:"assigned_volunteer_id"`
|
|
CreatedAt pgtype.Timestamptz `json:"created_at"`
|
|
UpdatedAt pgtype.Timestamptz `json:"updated_at"`
|
|
DeletedAt pgtype.Timestamptz `json:"deleted_at"`
|
|
}
|
|
|
|
// Фаза 2A: Управление заявками (ВЫСОКИЙ ПРИОРИТЕТ)
|
|
// CRUD операции для заявок на помощь
|
|
// ============================================================================
|
|
// Создание и получение заявок
|
|
// ============================================================================
|
|
func (q *Queries) CreateRequest(ctx context.Context, arg CreateRequestParams) (CreateRequestRow, error) {
|
|
row := q.db.QueryRow(ctx, CreateRequest,
|
|
arg.RequesterID,
|
|
arg.RequestTypeID,
|
|
arg.Title,
|
|
arg.Description,
|
|
arg.StMakepoint,
|
|
arg.StMakepoint_2,
|
|
arg.Address,
|
|
arg.City,
|
|
arg.DesiredCompletionDate,
|
|
arg.Urgency,
|
|
arg.ContactPhone,
|
|
arg.ContactNotes,
|
|
)
|
|
var i CreateRequestRow
|
|
err := row.Scan(
|
|
&i.ID,
|
|
&i.RequesterID,
|
|
&i.RequestTypeID,
|
|
&i.Title,
|
|
&i.Description,
|
|
&i.Latitude,
|
|
&i.Longitude,
|
|
&i.Address,
|
|
&i.City,
|
|
&i.DesiredCompletionDate,
|
|
&i.Urgency,
|
|
&i.ContactPhone,
|
|
&i.ContactNotes,
|
|
&i.Status,
|
|
&i.AssignedVolunteerID,
|
|
&i.CreatedAt,
|
|
&i.UpdatedAt,
|
|
&i.DeletedAt,
|
|
)
|
|
return i, err
|
|
}
|
|
|
|
const DeleteRequest = `-- name: DeleteRequest :exec
|
|
|
|
UPDATE requests SET
|
|
deleted_at = CURRENT_TIMESTAMP,
|
|
updated_at = CURRENT_TIMESTAMP
|
|
WHERE id = $1
|
|
AND requester_id = $2
|
|
AND deleted_at IS NULL
|
|
`
|
|
|
|
type DeleteRequestParams struct {
|
|
ID int64 `json:"id"`
|
|
RequesterID int64 `json:"requester_id"`
|
|
}
|
|
|
|
// ============================================================================
|
|
// Удаление заявок
|
|
// ============================================================================
|
|
func (q *Queries) DeleteRequest(ctx context.Context, arg DeleteRequestParams) error {
|
|
_, err := q.db.Exec(ctx, DeleteRequest, arg.ID, arg.RequesterID)
|
|
return err
|
|
}
|
|
|
|
const GetModeratedRequests = `-- name: GetModeratedRequests :many
|
|
SELECT
|
|
r.id,
|
|
r.requester_id,
|
|
r.request_type_id,
|
|
r.title,
|
|
r.description,
|
|
ST_Y(r.location::geometry) as latitude,
|
|
ST_X(r.location::geometry) as longitude,
|
|
r.address,
|
|
r.status,
|
|
r.moderated_by,
|
|
r.moderated_at,
|
|
r.moderation_comment,
|
|
r.created_at,
|
|
rt.name as request_type_name,
|
|
(u.first_name || ' ' || u.last_name) as requester_name,
|
|
(m.first_name || ' ' || m.last_name) as moderator_name
|
|
FROM requests r
|
|
JOIN request_types rt ON rt.id = r.request_type_id
|
|
JOIN users u ON u.id = r.requester_id
|
|
LEFT JOIN users m ON m.id = r.moderated_by
|
|
WHERE r.moderated_by = $1
|
|
AND r.deleted_at IS NULL
|
|
ORDER BY r.moderated_at DESC
|
|
LIMIT $2 OFFSET $3
|
|
`
|
|
|
|
type GetModeratedRequestsParams struct {
|
|
ModeratedBy pgtype.Int8 `json:"moderated_by"`
|
|
Limit int32 `json:"limit"`
|
|
Offset int32 `json:"offset"`
|
|
}
|
|
|
|
type GetModeratedRequestsRow struct {
|
|
ID int64 `json:"id"`
|
|
RequesterID int64 `json:"requester_id"`
|
|
RequestTypeID int64 `json:"request_type_id"`
|
|
Title string `json:"title"`
|
|
Description string `json:"description"`
|
|
Latitude interface{} `json:"latitude"`
|
|
Longitude interface{} `json:"longitude"`
|
|
Address string `json:"address"`
|
|
Status NullRequestStatus `json:"status"`
|
|
ModeratedBy pgtype.Int8 `json:"moderated_by"`
|
|
ModeratedAt pgtype.Timestamptz `json:"moderated_at"`
|
|
ModerationComment pgtype.Text `json:"moderation_comment"`
|
|
CreatedAt pgtype.Timestamptz `json:"created_at"`
|
|
RequestTypeName string `json:"request_type_name"`
|
|
RequesterName interface{} `json:"requester_name"`
|
|
ModeratorName interface{} `json:"moderator_name"`
|
|
}
|
|
|
|
func (q *Queries) GetModeratedRequests(ctx context.Context, arg GetModeratedRequestsParams) ([]GetModeratedRequestsRow, error) {
|
|
rows, err := q.db.Query(ctx, GetModeratedRequests, arg.ModeratedBy, arg.Limit, arg.Offset)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
items := []GetModeratedRequestsRow{}
|
|
for rows.Next() {
|
|
var i GetModeratedRequestsRow
|
|
if err := rows.Scan(
|
|
&i.ID,
|
|
&i.RequesterID,
|
|
&i.RequestTypeID,
|
|
&i.Title,
|
|
&i.Description,
|
|
&i.Latitude,
|
|
&i.Longitude,
|
|
&i.Address,
|
|
&i.Status,
|
|
&i.ModeratedBy,
|
|
&i.ModeratedAt,
|
|
&i.ModerationComment,
|
|
&i.CreatedAt,
|
|
&i.RequestTypeName,
|
|
&i.RequesterName,
|
|
&i.ModeratorName,
|
|
); err != nil {
|
|
return nil, err
|
|
}
|
|
items = append(items, i)
|
|
}
|
|
if err := rows.Err(); err != nil {
|
|
return nil, err
|
|
}
|
|
return items, nil
|
|
}
|
|
|
|
const GetModeratorActionsByModerator = `-- name: GetModeratorActionsByModerator :many
|
|
SELECT
|
|
ma.id, ma.moderator_id, ma.action_type, ma.target_user_id, ma.target_request_id, ma.target_complaint_id, ma.comment, ma.metadata, ma.created_at,
|
|
r.title as request_title,
|
|
r.status as request_status
|
|
FROM moderator_actions ma
|
|
LEFT JOIN requests r ON r.id = ma.target_request_id
|
|
WHERE ma.moderator_id = $1
|
|
ORDER BY ma.created_at DESC
|
|
LIMIT $2 OFFSET $3
|
|
`
|
|
|
|
type GetModeratorActionsByModeratorParams struct {
|
|
ModeratorID int64 `json:"moderator_id"`
|
|
Limit int32 `json:"limit"`
|
|
Offset int32 `json:"offset"`
|
|
}
|
|
|
|
type GetModeratorActionsByModeratorRow 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"`
|
|
Metadata []byte `json:"metadata"`
|
|
CreatedAt pgtype.Timestamptz `json:"created_at"`
|
|
RequestTitle pgtype.Text `json:"request_title"`
|
|
RequestStatus NullRequestStatus `json:"request_status"`
|
|
}
|
|
|
|
func (q *Queries) GetModeratorActionsByModerator(ctx context.Context, arg GetModeratorActionsByModeratorParams) ([]GetModeratorActionsByModeratorRow, error) {
|
|
rows, err := q.db.Query(ctx, GetModeratorActionsByModerator, arg.ModeratorID, arg.Limit, arg.Offset)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
items := []GetModeratorActionsByModeratorRow{}
|
|
for rows.Next() {
|
|
var i GetModeratorActionsByModeratorRow
|
|
if err := rows.Scan(
|
|
&i.ID,
|
|
&i.ModeratorID,
|
|
&i.ActionType,
|
|
&i.TargetUserID,
|
|
&i.TargetRequestID,
|
|
&i.TargetComplaintID,
|
|
&i.Comment,
|
|
&i.Metadata,
|
|
&i.CreatedAt,
|
|
&i.RequestTitle,
|
|
&i.RequestStatus,
|
|
); err != nil {
|
|
return nil, err
|
|
}
|
|
items = append(items, i)
|
|
}
|
|
if err := rows.Err(); err != nil {
|
|
return nil, err
|
|
}
|
|
return items, nil
|
|
}
|
|
|
|
const GetModeratorActionsByRequest = `-- name: GetModeratorActionsByRequest :many
|
|
|
|
SELECT
|
|
ma.id, ma.moderator_id, ma.action_type, ma.target_user_id, ma.target_request_id, ma.target_complaint_id, ma.comment, ma.metadata, ma.created_at,
|
|
(u.first_name || ' ' || u.last_name) as moderator_name,
|
|
u.email as moderator_email
|
|
FROM moderator_actions ma
|
|
JOIN users u ON u.id = ma.moderator_id
|
|
WHERE ma.target_request_id = $1
|
|
ORDER BY ma.created_at DESC
|
|
`
|
|
|
|
type GetModeratorActionsByRequestRow 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"`
|
|
Metadata []byte `json:"metadata"`
|
|
CreatedAt pgtype.Timestamptz `json:"created_at"`
|
|
ModeratorName interface{} `json:"moderator_name"`
|
|
ModeratorEmail string `json:"moderator_email"`
|
|
}
|
|
|
|
// ============================================================================
|
|
// Аудит действий модераторов
|
|
// ============================================================================
|
|
func (q *Queries) GetModeratorActionsByRequest(ctx context.Context, targetRequestID pgtype.Int8) ([]GetModeratorActionsByRequestRow, error) {
|
|
rows, err := q.db.Query(ctx, GetModeratorActionsByRequest, targetRequestID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
items := []GetModeratorActionsByRequestRow{}
|
|
for rows.Next() {
|
|
var i GetModeratorActionsByRequestRow
|
|
if err := rows.Scan(
|
|
&i.ID,
|
|
&i.ModeratorID,
|
|
&i.ActionType,
|
|
&i.TargetUserID,
|
|
&i.TargetRequestID,
|
|
&i.TargetComplaintID,
|
|
&i.Comment,
|
|
&i.Metadata,
|
|
&i.CreatedAt,
|
|
&i.ModeratorName,
|
|
&i.ModeratorEmail,
|
|
); err != nil {
|
|
return nil, err
|
|
}
|
|
items = append(items, i)
|
|
}
|
|
if err := rows.Err(); err != nil {
|
|
return nil, err
|
|
}
|
|
return items, nil
|
|
}
|
|
|
|
const GetPendingModerationRequests = `-- name: GetPendingModerationRequests :many
|
|
|
|
SELECT
|
|
r.id,
|
|
r.requester_id,
|
|
r.request_type_id,
|
|
r.title,
|
|
r.description,
|
|
ST_Y(r.location::geometry) as latitude,
|
|
ST_X(r.location::geometry) as longitude,
|
|
r.address,
|
|
r.city,
|
|
r.desired_completion_date,
|
|
r.urgency,
|
|
r.contact_phone,
|
|
r.contact_notes,
|
|
r.status,
|
|
r.created_at,
|
|
r.updated_at,
|
|
rt.name as request_type_name,
|
|
rt.icon as request_type_icon,
|
|
(u.first_name || ' ' || u.last_name) as requester_name,
|
|
u.email as requester_email,
|
|
u.phone as requester_phone
|
|
FROM requests r
|
|
JOIN request_types rt ON rt.id = r.request_type_id
|
|
JOIN users u ON u.id = r.requester_id
|
|
WHERE r.status = 'pending_moderation'
|
|
AND r.deleted_at IS NULL
|
|
ORDER BY r.created_at ASC
|
|
LIMIT $1 OFFSET $2
|
|
`
|
|
|
|
type GetPendingModerationRequestsParams struct {
|
|
Limit int32 `json:"limit"`
|
|
Offset int32 `json:"offset"`
|
|
}
|
|
|
|
type GetPendingModerationRequestsRow struct {
|
|
ID int64 `json:"id"`
|
|
RequesterID int64 `json:"requester_id"`
|
|
RequestTypeID int64 `json:"request_type_id"`
|
|
Title string `json:"title"`
|
|
Description string `json:"description"`
|
|
Latitude interface{} `json:"latitude"`
|
|
Longitude interface{} `json:"longitude"`
|
|
Address string `json:"address"`
|
|
City pgtype.Text `json:"city"`
|
|
DesiredCompletionDate pgtype.Timestamptz `json:"desired_completion_date"`
|
|
Urgency pgtype.Text `json:"urgency"`
|
|
ContactPhone pgtype.Text `json:"contact_phone"`
|
|
ContactNotes pgtype.Text `json:"contact_notes"`
|
|
Status NullRequestStatus `json:"status"`
|
|
CreatedAt pgtype.Timestamptz `json:"created_at"`
|
|
UpdatedAt pgtype.Timestamptz `json:"updated_at"`
|
|
RequestTypeName string `json:"request_type_name"`
|
|
RequestTypeIcon pgtype.Text `json:"request_type_icon"`
|
|
RequesterName interface{} `json:"requester_name"`
|
|
RequesterEmail string `json:"requester_email"`
|
|
RequesterPhone pgtype.Text `json:"requester_phone"`
|
|
}
|
|
|
|
// ============================================================================
|
|
// Модерация заявок
|
|
// ============================================================================
|
|
func (q *Queries) GetPendingModerationRequests(ctx context.Context, arg GetPendingModerationRequestsParams) ([]GetPendingModerationRequestsRow, error) {
|
|
rows, err := q.db.Query(ctx, GetPendingModerationRequests, arg.Limit, arg.Offset)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
items := []GetPendingModerationRequestsRow{}
|
|
for rows.Next() {
|
|
var i GetPendingModerationRequestsRow
|
|
if err := rows.Scan(
|
|
&i.ID,
|
|
&i.RequesterID,
|
|
&i.RequestTypeID,
|
|
&i.Title,
|
|
&i.Description,
|
|
&i.Latitude,
|
|
&i.Longitude,
|
|
&i.Address,
|
|
&i.City,
|
|
&i.DesiredCompletionDate,
|
|
&i.Urgency,
|
|
&i.ContactPhone,
|
|
&i.ContactNotes,
|
|
&i.Status,
|
|
&i.CreatedAt,
|
|
&i.UpdatedAt,
|
|
&i.RequestTypeName,
|
|
&i.RequestTypeIcon,
|
|
&i.RequesterName,
|
|
&i.RequesterEmail,
|
|
&i.RequesterPhone,
|
|
); err != nil {
|
|
return nil, err
|
|
}
|
|
items = append(items, i)
|
|
}
|
|
if err := rows.Err(); err != nil {
|
|
return nil, err
|
|
}
|
|
return items, nil
|
|
}
|
|
|
|
const GetRequestByID = `-- name: GetRequestByID :one
|
|
SELECT
|
|
r.id,
|
|
r.requester_id,
|
|
r.request_type_id,
|
|
r.title,
|
|
r.description,
|
|
ST_Y(r.location::geometry) as latitude,
|
|
ST_X(r.location::geometry) as longitude,
|
|
r.address,
|
|
r.city,
|
|
r.desired_completion_date,
|
|
r.urgency,
|
|
r.contact_phone,
|
|
r.contact_notes,
|
|
r.status,
|
|
r.assigned_volunteer_id,
|
|
r.created_at,
|
|
r.updated_at,
|
|
r.deleted_at,
|
|
r.completed_at,
|
|
rt.name as request_type_name,
|
|
rt.icon as request_type_icon,
|
|
(u.first_name || ' ' || u.last_name) as requester_name,
|
|
u.phone as requester_phone,
|
|
u.email as requester_email,
|
|
(av.first_name || ' ' || av.last_name) as assigned_volunteer_name,
|
|
av.phone as assigned_volunteer_phone
|
|
FROM requests r
|
|
JOIN request_types rt ON rt.id = r.request_type_id
|
|
JOIN users u ON u.id = r.requester_id
|
|
LEFT JOIN users av ON av.id = r.assigned_volunteer_id
|
|
WHERE r.id = $1 AND r.deleted_at IS NULL
|
|
`
|
|
|
|
type GetRequestByIDRow struct {
|
|
ID int64 `json:"id"`
|
|
RequesterID int64 `json:"requester_id"`
|
|
RequestTypeID int64 `json:"request_type_id"`
|
|
Title string `json:"title"`
|
|
Description string `json:"description"`
|
|
Latitude interface{} `json:"latitude"`
|
|
Longitude interface{} `json:"longitude"`
|
|
Address string `json:"address"`
|
|
City pgtype.Text `json:"city"`
|
|
DesiredCompletionDate pgtype.Timestamptz `json:"desired_completion_date"`
|
|
Urgency pgtype.Text `json:"urgency"`
|
|
ContactPhone pgtype.Text `json:"contact_phone"`
|
|
ContactNotes pgtype.Text `json:"contact_notes"`
|
|
Status NullRequestStatus `json:"status"`
|
|
AssignedVolunteerID pgtype.Int8 `json:"assigned_volunteer_id"`
|
|
CreatedAt pgtype.Timestamptz `json:"created_at"`
|
|
UpdatedAt pgtype.Timestamptz `json:"updated_at"`
|
|
DeletedAt pgtype.Timestamptz `json:"deleted_at"`
|
|
CompletedAt pgtype.Timestamptz `json:"completed_at"`
|
|
RequestTypeName string `json:"request_type_name"`
|
|
RequestTypeIcon pgtype.Text `json:"request_type_icon"`
|
|
RequesterName interface{} `json:"requester_name"`
|
|
RequesterPhone pgtype.Text `json:"requester_phone"`
|
|
RequesterEmail string `json:"requester_email"`
|
|
AssignedVolunteerName interface{} `json:"assigned_volunteer_name"`
|
|
AssignedVolunteerPhone pgtype.Text `json:"assigned_volunteer_phone"`
|
|
}
|
|
|
|
func (q *Queries) GetRequestByID(ctx context.Context, id int64) (GetRequestByIDRow, error) {
|
|
row := q.db.QueryRow(ctx, GetRequestByID, id)
|
|
var i GetRequestByIDRow
|
|
err := row.Scan(
|
|
&i.ID,
|
|
&i.RequesterID,
|
|
&i.RequestTypeID,
|
|
&i.Title,
|
|
&i.Description,
|
|
&i.Latitude,
|
|
&i.Longitude,
|
|
&i.Address,
|
|
&i.City,
|
|
&i.DesiredCompletionDate,
|
|
&i.Urgency,
|
|
&i.ContactPhone,
|
|
&i.ContactNotes,
|
|
&i.Status,
|
|
&i.AssignedVolunteerID,
|
|
&i.CreatedAt,
|
|
&i.UpdatedAt,
|
|
&i.DeletedAt,
|
|
&i.CompletedAt,
|
|
&i.RequestTypeName,
|
|
&i.RequestTypeIcon,
|
|
&i.RequesterName,
|
|
&i.RequesterPhone,
|
|
&i.RequesterEmail,
|
|
&i.AssignedVolunteerName,
|
|
&i.AssignedVolunteerPhone,
|
|
)
|
|
return i, err
|
|
}
|
|
|
|
const GetRequestTypeByID = `-- name: GetRequestTypeByID :one
|
|
SELECT id, name, description, icon, is_active, created_at FROM request_types
|
|
WHERE id = $1
|
|
`
|
|
|
|
func (q *Queries) GetRequestTypeByID(ctx context.Context, id int64) (RequestType, error) {
|
|
row := q.db.QueryRow(ctx, GetRequestTypeByID, id)
|
|
var i RequestType
|
|
err := row.Scan(
|
|
&i.ID,
|
|
&i.Name,
|
|
&i.Description,
|
|
&i.Icon,
|
|
&i.IsActive,
|
|
&i.CreatedAt,
|
|
)
|
|
return i, err
|
|
}
|
|
|
|
const GetRequestTypeByName = `-- name: GetRequestTypeByName :one
|
|
SELECT id, name, description, icon, is_active, created_at FROM request_types
|
|
WHERE name = $1
|
|
`
|
|
|
|
func (q *Queries) GetRequestTypeByName(ctx context.Context, name string) (RequestType, error) {
|
|
row := q.db.QueryRow(ctx, GetRequestTypeByName, name)
|
|
var i RequestType
|
|
err := row.Scan(
|
|
&i.ID,
|
|
&i.Name,
|
|
&i.Description,
|
|
&i.Icon,
|
|
&i.IsActive,
|
|
&i.CreatedAt,
|
|
)
|
|
return i, err
|
|
}
|
|
|
|
const GetRequestsByRequester = `-- name: GetRequestsByRequester :many
|
|
SELECT
|
|
r.id,
|
|
r.requester_id,
|
|
r.request_type_id,
|
|
r.title,
|
|
r.description,
|
|
ST_Y(r.location::geometry) as latitude,
|
|
ST_X(r.location::geometry) as longitude,
|
|
r.address,
|
|
r.city,
|
|
r.desired_completion_date,
|
|
r.urgency,
|
|
r.contact_phone,
|
|
r.contact_notes,
|
|
r.status,
|
|
r.assigned_volunteer_id,
|
|
r.created_at,
|
|
r.updated_at,
|
|
r.deleted_at,
|
|
rt.name as request_type_name,
|
|
rt.icon as request_type_icon
|
|
FROM requests r
|
|
JOIN request_types rt ON rt.id = r.request_type_id
|
|
WHERE r.requester_id = $1
|
|
AND r.deleted_at IS NULL
|
|
ORDER BY r.created_at DESC
|
|
LIMIT $2 OFFSET $3
|
|
`
|
|
|
|
type GetRequestsByRequesterParams struct {
|
|
RequesterID int64 `json:"requester_id"`
|
|
Limit int32 `json:"limit"`
|
|
Offset int32 `json:"offset"`
|
|
}
|
|
|
|
type GetRequestsByRequesterRow struct {
|
|
ID int64 `json:"id"`
|
|
RequesterID int64 `json:"requester_id"`
|
|
RequestTypeID int64 `json:"request_type_id"`
|
|
Title string `json:"title"`
|
|
Description string `json:"description"`
|
|
Latitude interface{} `json:"latitude"`
|
|
Longitude interface{} `json:"longitude"`
|
|
Address string `json:"address"`
|
|
City pgtype.Text `json:"city"`
|
|
DesiredCompletionDate pgtype.Timestamptz `json:"desired_completion_date"`
|
|
Urgency pgtype.Text `json:"urgency"`
|
|
ContactPhone pgtype.Text `json:"contact_phone"`
|
|
ContactNotes pgtype.Text `json:"contact_notes"`
|
|
Status NullRequestStatus `json:"status"`
|
|
AssignedVolunteerID pgtype.Int8 `json:"assigned_volunteer_id"`
|
|
CreatedAt pgtype.Timestamptz `json:"created_at"`
|
|
UpdatedAt pgtype.Timestamptz `json:"updated_at"`
|
|
DeletedAt pgtype.Timestamptz `json:"deleted_at"`
|
|
RequestTypeName string `json:"request_type_name"`
|
|
RequestTypeIcon pgtype.Text `json:"request_type_icon"`
|
|
}
|
|
|
|
func (q *Queries) GetRequestsByRequester(ctx context.Context, arg GetRequestsByRequesterParams) ([]GetRequestsByRequesterRow, error) {
|
|
rows, err := q.db.Query(ctx, GetRequestsByRequester, arg.RequesterID, arg.Limit, arg.Offset)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
items := []GetRequestsByRequesterRow{}
|
|
for rows.Next() {
|
|
var i GetRequestsByRequesterRow
|
|
if err := rows.Scan(
|
|
&i.ID,
|
|
&i.RequesterID,
|
|
&i.RequestTypeID,
|
|
&i.Title,
|
|
&i.Description,
|
|
&i.Latitude,
|
|
&i.Longitude,
|
|
&i.Address,
|
|
&i.City,
|
|
&i.DesiredCompletionDate,
|
|
&i.Urgency,
|
|
&i.ContactPhone,
|
|
&i.ContactNotes,
|
|
&i.Status,
|
|
&i.AssignedVolunteerID,
|
|
&i.CreatedAt,
|
|
&i.UpdatedAt,
|
|
&i.DeletedAt,
|
|
&i.RequestTypeName,
|
|
&i.RequestTypeIcon,
|
|
); err != nil {
|
|
return nil, err
|
|
}
|
|
items = append(items, i)
|
|
}
|
|
if err := rows.Err(); err != nil {
|
|
return nil, err
|
|
}
|
|
return items, nil
|
|
}
|
|
|
|
const GetRequestsByStatus = `-- name: GetRequestsByStatus :many
|
|
SELECT
|
|
r.id,
|
|
r.requester_id,
|
|
r.request_type_id,
|
|
r.title,
|
|
r.description,
|
|
ST_Y(r.location::geometry) as latitude,
|
|
ST_X(r.location::geometry) as longitude,
|
|
r.address,
|
|
r.city,
|
|
r.desired_completion_date,
|
|
r.urgency,
|
|
r.contact_phone,
|
|
r.contact_notes,
|
|
r.status,
|
|
r.assigned_volunteer_id,
|
|
r.created_at,
|
|
r.updated_at,
|
|
r.deleted_at,
|
|
rt.name as request_type_name,
|
|
(u.first_name || ' ' || u.last_name) as requester_name
|
|
FROM requests r
|
|
JOIN request_types rt ON rt.id = r.request_type_id
|
|
JOIN users u ON u.id = r.requester_id
|
|
WHERE r.status = $1
|
|
AND r.deleted_at IS NULL
|
|
ORDER BY r.created_at DESC
|
|
LIMIT $2 OFFSET $3
|
|
`
|
|
|
|
type GetRequestsByStatusParams struct {
|
|
Status NullRequestStatus `json:"status"`
|
|
Limit int32 `json:"limit"`
|
|
Offset int32 `json:"offset"`
|
|
}
|
|
|
|
type GetRequestsByStatusRow struct {
|
|
ID int64 `json:"id"`
|
|
RequesterID int64 `json:"requester_id"`
|
|
RequestTypeID int64 `json:"request_type_id"`
|
|
Title string `json:"title"`
|
|
Description string `json:"description"`
|
|
Latitude interface{} `json:"latitude"`
|
|
Longitude interface{} `json:"longitude"`
|
|
Address string `json:"address"`
|
|
City pgtype.Text `json:"city"`
|
|
DesiredCompletionDate pgtype.Timestamptz `json:"desired_completion_date"`
|
|
Urgency pgtype.Text `json:"urgency"`
|
|
ContactPhone pgtype.Text `json:"contact_phone"`
|
|
ContactNotes pgtype.Text `json:"contact_notes"`
|
|
Status NullRequestStatus `json:"status"`
|
|
AssignedVolunteerID pgtype.Int8 `json:"assigned_volunteer_id"`
|
|
CreatedAt pgtype.Timestamptz `json:"created_at"`
|
|
UpdatedAt pgtype.Timestamptz `json:"updated_at"`
|
|
DeletedAt pgtype.Timestamptz `json:"deleted_at"`
|
|
RequestTypeName string `json:"request_type_name"`
|
|
RequesterName interface{} `json:"requester_name"`
|
|
}
|
|
|
|
func (q *Queries) GetRequestsByStatus(ctx context.Context, arg GetRequestsByStatusParams) ([]GetRequestsByStatusRow, error) {
|
|
rows, err := q.db.Query(ctx, GetRequestsByStatus, arg.Status, arg.Limit, arg.Offset)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
items := []GetRequestsByStatusRow{}
|
|
for rows.Next() {
|
|
var i GetRequestsByStatusRow
|
|
if err := rows.Scan(
|
|
&i.ID,
|
|
&i.RequesterID,
|
|
&i.RequestTypeID,
|
|
&i.Title,
|
|
&i.Description,
|
|
&i.Latitude,
|
|
&i.Longitude,
|
|
&i.Address,
|
|
&i.City,
|
|
&i.DesiredCompletionDate,
|
|
&i.Urgency,
|
|
&i.ContactPhone,
|
|
&i.ContactNotes,
|
|
&i.Status,
|
|
&i.AssignedVolunteerID,
|
|
&i.CreatedAt,
|
|
&i.UpdatedAt,
|
|
&i.DeletedAt,
|
|
&i.RequestTypeName,
|
|
&i.RequesterName,
|
|
); err != nil {
|
|
return nil, err
|
|
}
|
|
items = append(items, i)
|
|
}
|
|
if err := rows.Err(); err != nil {
|
|
return nil, err
|
|
}
|
|
return items, nil
|
|
}
|
|
|
|
const ListRequestTypes = `-- name: ListRequestTypes :many
|
|
|
|
SELECT id, name, description, icon, is_active, created_at FROM request_types
|
|
WHERE is_active = TRUE
|
|
ORDER BY name
|
|
`
|
|
|
|
// ============================================================================
|
|
// Типы заявок
|
|
// ============================================================================
|
|
func (q *Queries) ListRequestTypes(ctx context.Context) ([]RequestType, error) {
|
|
rows, err := q.db.Query(ctx, ListRequestTypes)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
items := []RequestType{}
|
|
for rows.Next() {
|
|
var i RequestType
|
|
if err := rows.Scan(
|
|
&i.ID,
|
|
&i.Name,
|
|
&i.Description,
|
|
&i.Icon,
|
|
&i.IsActive,
|
|
&i.CreatedAt,
|
|
); err != nil {
|
|
return nil, err
|
|
}
|
|
items = append(items, i)
|
|
}
|
|
if err := rows.Err(); err != nil {
|
|
return nil, err
|
|
}
|
|
return items, nil
|
|
}
|
|
|
|
const ModerateRequest = `-- name: ModerateRequest :exec
|
|
UPDATE requests SET
|
|
status = $2,
|
|
moderated_by = $3,
|
|
moderated_at = CURRENT_TIMESTAMP,
|
|
moderation_comment = $4,
|
|
updated_at = CURRENT_TIMESTAMP
|
|
WHERE id = $1
|
|
`
|
|
|
|
type ModerateRequestParams struct {
|
|
ID int64 `json:"id"`
|
|
Status NullRequestStatus `json:"status"`
|
|
ModeratedBy pgtype.Int8 `json:"moderated_by"`
|
|
ModerationComment pgtype.Text `json:"moderation_comment"`
|
|
}
|
|
|
|
func (q *Queries) ModerateRequest(ctx context.Context, arg ModerateRequestParams) error {
|
|
_, err := q.db.Exec(ctx, ModerateRequest,
|
|
arg.ID,
|
|
arg.Status,
|
|
arg.ModeratedBy,
|
|
arg.ModerationComment,
|
|
)
|
|
return err
|
|
}
|
|
|
|
const RejectRequest = `-- name: RejectRequest :exec
|
|
UPDATE requests SET
|
|
status = 'rejected',
|
|
moderated_by = $2,
|
|
moderated_at = CURRENT_TIMESTAMP,
|
|
moderation_comment = $3,
|
|
updated_at = CURRENT_TIMESTAMP
|
|
WHERE id = $1
|
|
AND status = 'pending_moderation'
|
|
AND deleted_at IS NULL
|
|
`
|
|
|
|
type RejectRequestParams struct {
|
|
ID int64 `json:"id"`
|
|
ModeratedBy pgtype.Int8 `json:"moderated_by"`
|
|
ModerationComment pgtype.Text `json:"moderation_comment"`
|
|
}
|
|
|
|
func (q *Queries) RejectRequest(ctx context.Context, arg RejectRequestParams) error {
|
|
_, err := q.db.Exec(ctx, RejectRequest, arg.ID, arg.ModeratedBy, arg.ModerationComment)
|
|
return err
|
|
}
|
|
|
|
const UpdateRequestStatus = `-- name: UpdateRequestStatus :exec
|
|
|
|
UPDATE requests SET
|
|
status = $2,
|
|
updated_at = CURRENT_TIMESTAMP
|
|
WHERE id = $1
|
|
AND deleted_at IS NULL
|
|
`
|
|
|
|
type UpdateRequestStatusParams struct {
|
|
ID int64 `json:"id"`
|
|
Status NullRequestStatus `json:"status"`
|
|
}
|
|
|
|
// ============================================================================
|
|
// Обновление заявок
|
|
// ============================================================================
|
|
func (q *Queries) UpdateRequestStatus(ctx context.Context, arg UpdateRequestStatusParams) error {
|
|
_, err := q.db.Exec(ctx, UpdateRequestStatus, arg.ID, arg.Status)
|
|
return err
|
|
}
|