714 lines
21 KiB
Go
714 lines
21 KiB
Go
// Code generated by sqlc. DO NOT EDIT.
|
|
// versions:
|
|
// sqlc v1.30.0
|
|
// source: responses.sql
|
|
|
|
package database
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/jackc/pgx/v5/pgtype"
|
|
)
|
|
|
|
const AcceptVolunteerResponse = `-- name: AcceptVolunteerResponse :exec
|
|
UPDATE volunteer_responses SET
|
|
status = 'accepted',
|
|
accepted_at = CURRENT_TIMESTAMP,
|
|
updated_at = CURRENT_TIMESTAMP
|
|
WHERE id = $1
|
|
`
|
|
|
|
func (q *Queries) AcceptVolunteerResponse(ctx context.Context, id int64) error {
|
|
_, err := q.db.Exec(ctx, AcceptVolunteerResponse, id)
|
|
return err
|
|
}
|
|
|
|
const CalculateVolunteerAverageRating = `-- name: CalculateVolunteerAverageRating :one
|
|
SELECT
|
|
COALESCE(AVG(rating), 0) as average_rating,
|
|
COUNT(*) as total_ratings
|
|
FROM ratings
|
|
WHERE volunteer_id = $1
|
|
`
|
|
|
|
type CalculateVolunteerAverageRatingRow struct {
|
|
AverageRating interface{} `json:"average_rating"`
|
|
TotalRatings int64 `json:"total_ratings"`
|
|
}
|
|
|
|
func (q *Queries) CalculateVolunteerAverageRating(ctx context.Context, volunteerID int64) (CalculateVolunteerAverageRatingRow, error) {
|
|
row := q.db.QueryRow(ctx, CalculateVolunteerAverageRating, volunteerID)
|
|
var i CalculateVolunteerAverageRatingRow
|
|
err := row.Scan(&i.AverageRating, &i.TotalRatings)
|
|
return i, err
|
|
}
|
|
|
|
const CallAcceptVolunteerResponse = `-- name: CallAcceptVolunteerResponse :one
|
|
|
|
SELECT
|
|
r.success::BOOLEAN,
|
|
r.message::TEXT,
|
|
r.out_request_id::BIGINT,
|
|
r.out_volunteer_id::BIGINT
|
|
FROM accept_volunteer_response($1, $2) AS r(success, message, out_request_id, out_volunteer_id)
|
|
`
|
|
|
|
type CallAcceptVolunteerResponseParams struct {
|
|
PResponseID int64 `json:"p_response_id"`
|
|
PRequesterID int64 `json:"p_requester_id"`
|
|
}
|
|
|
|
type CallAcceptVolunteerResponseRow struct {
|
|
Success bool `json:"r_success"`
|
|
Message string `json:"r_message"`
|
|
RequestID int64 `json:"r_out_request_id"`
|
|
VolunteerID int64 `json:"r_out_volunteer_id"`
|
|
}
|
|
|
|
// ============================================================================
|
|
// Хранимые процедуры
|
|
// ============================================================================
|
|
func (q *Queries) CallAcceptVolunteerResponse(ctx context.Context, arg CallAcceptVolunteerResponseParams) (CallAcceptVolunteerResponseRow, error) {
|
|
row := q.db.QueryRow(ctx, CallAcceptVolunteerResponse, arg.PResponseID, arg.PRequesterID)
|
|
var i CallAcceptVolunteerResponseRow
|
|
err := row.Scan(
|
|
&i.Success,
|
|
&i.Message,
|
|
&i.RequestID,
|
|
&i.VolunteerID,
|
|
)
|
|
return i, err
|
|
}
|
|
|
|
const CallCompleteRequestWithRating = `-- name: CallCompleteRequestWithRating :one
|
|
SELECT
|
|
r.success::BOOLEAN,
|
|
r.message::TEXT,
|
|
r.out_rating_id::BIGINT
|
|
FROM complete_request_with_rating($1, $2, $3, $4) AS r(success, message, out_rating_id)
|
|
`
|
|
|
|
type CallCompleteRequestWithRatingParams struct {
|
|
PRequestID int64 `json:"p_request_id"`
|
|
PRequesterID int64 `json:"p_requester_id"`
|
|
PRating int32 `json:"p_rating"`
|
|
Comment pgtype.Text `json:"comment"`
|
|
}
|
|
|
|
type CallCompleteRequestWithRatingRow struct {
|
|
Success bool `json:"r_success"`
|
|
Message string `json:"r_message"`
|
|
RatingID int64 `json:"r_out_rating_id"`
|
|
}
|
|
|
|
func (q *Queries) CallCompleteRequestWithRating(ctx context.Context, arg CallCompleteRequestWithRatingParams) (CallCompleteRequestWithRatingRow, error) {
|
|
row := q.db.QueryRow(ctx, CallCompleteRequestWithRating,
|
|
arg.PRequestID,
|
|
arg.PRequesterID,
|
|
arg.PRating,
|
|
arg.Comment,
|
|
)
|
|
var i CallCompleteRequestWithRatingRow
|
|
err := row.Scan(&i.Success, &i.Message, &i.RatingID)
|
|
return i, err
|
|
}
|
|
|
|
const CallModerateRequest = `-- name: CallModerateRequest :one
|
|
SELECT
|
|
r.success::BOOLEAN,
|
|
r.message::TEXT
|
|
FROM moderate_request($1, $2, $3, $4) AS r(success, message)
|
|
`
|
|
|
|
type CallModerateRequestParams struct {
|
|
PRequestID int64 `json:"p_request_id"`
|
|
PModeratorID int64 `json:"p_moderator_id"`
|
|
PAction string `json:"p_action"`
|
|
Comment pgtype.Text `json:"comment"`
|
|
}
|
|
|
|
type CallModerateRequestRow struct {
|
|
Success bool `json:"r_success"`
|
|
Message string `json:"r_message"`
|
|
}
|
|
|
|
func (q *Queries) CallModerateRequest(ctx context.Context, arg CallModerateRequestParams) (CallModerateRequestRow, error) {
|
|
row := q.db.QueryRow(ctx, CallModerateRequest,
|
|
arg.PRequestID,
|
|
arg.PModeratorID,
|
|
arg.PAction,
|
|
arg.Comment,
|
|
)
|
|
var i CallModerateRequestRow
|
|
err := row.Scan(&i.Success, &i.Message)
|
|
return i, err
|
|
}
|
|
|
|
const CountPendingResponsesByVolunteer = `-- name: CountPendingResponsesByVolunteer :one
|
|
SELECT COUNT(*) FROM volunteer_responses
|
|
WHERE volunteer_id = $1 AND status = 'pending'
|
|
`
|
|
|
|
func (q *Queries) CountPendingResponsesByVolunteer(ctx context.Context, volunteerID int64) (int64, error) {
|
|
row := q.db.QueryRow(ctx, CountPendingResponsesByVolunteer, volunteerID)
|
|
var count int64
|
|
err := row.Scan(&count)
|
|
return count, err
|
|
}
|
|
|
|
const CountResponsesByRequest = `-- name: CountResponsesByRequest :one
|
|
SELECT COUNT(*) FROM volunteer_responses
|
|
WHERE request_id = $1
|
|
`
|
|
|
|
func (q *Queries) CountResponsesByRequest(ctx context.Context, requestID int64) (int64, error) {
|
|
row := q.db.QueryRow(ctx, CountResponsesByRequest, requestID)
|
|
var count int64
|
|
err := row.Scan(&count)
|
|
return count, err
|
|
}
|
|
|
|
const CreateRating = `-- name: CreateRating :one
|
|
|
|
INSERT INTO ratings (
|
|
volunteer_response_id,
|
|
volunteer_id,
|
|
requester_id,
|
|
request_id,
|
|
rating,
|
|
comment
|
|
) VALUES (
|
|
$1,
|
|
$2,
|
|
$3,
|
|
$4,
|
|
$5,
|
|
$6
|
|
) RETURNING id, volunteer_response_id, volunteer_id, requester_id, request_id, rating, comment, created_at, updated_at
|
|
`
|
|
|
|
type CreateRatingParams struct {
|
|
VolunteerResponseID int64 `json:"volunteer_response_id"`
|
|
VolunteerID int64 `json:"volunteer_id"`
|
|
RequesterID int64 `json:"requester_id"`
|
|
RequestID int64 `json:"request_id"`
|
|
Rating int32 `json:"rating"`
|
|
Comment pgtype.Text `json:"comment"`
|
|
}
|
|
|
|
// ============================================================================
|
|
// Рейтинги
|
|
// ============================================================================
|
|
func (q *Queries) CreateRating(ctx context.Context, arg CreateRatingParams) (Rating, error) {
|
|
row := q.db.QueryRow(ctx, CreateRating,
|
|
arg.VolunteerResponseID,
|
|
arg.VolunteerID,
|
|
arg.RequesterID,
|
|
arg.RequestID,
|
|
arg.Rating,
|
|
arg.Comment,
|
|
)
|
|
var i Rating
|
|
err := row.Scan(
|
|
&i.ID,
|
|
&i.VolunteerResponseID,
|
|
&i.VolunteerID,
|
|
&i.RequesterID,
|
|
&i.RequestID,
|
|
&i.Rating,
|
|
&i.Comment,
|
|
&i.CreatedAt,
|
|
&i.UpdatedAt,
|
|
)
|
|
return i, err
|
|
}
|
|
|
|
const CreateStatusHistoryEntry = `-- name: CreateStatusHistoryEntry :one
|
|
|
|
INSERT INTO request_status_history (
|
|
request_id,
|
|
from_status,
|
|
to_status,
|
|
changed_by,
|
|
comment
|
|
) VALUES (
|
|
$1,
|
|
$2,
|
|
$3,
|
|
$4,
|
|
$5
|
|
) RETURNING id, request_id, from_status, to_status, changed_by, comment, created_at
|
|
`
|
|
|
|
type CreateStatusHistoryEntryParams struct {
|
|
RequestID int64 `json:"request_id"`
|
|
FromStatus NullRequestStatus `json:"from_status"`
|
|
ToStatus RequestStatus `json:"to_status"`
|
|
ChangedBy int64 `json:"changed_by"`
|
|
Comment pgtype.Text `json:"comment"`
|
|
}
|
|
|
|
// ============================================================================
|
|
// История изменения статусов заявок
|
|
// ============================================================================
|
|
func (q *Queries) CreateStatusHistoryEntry(ctx context.Context, arg CreateStatusHistoryEntryParams) (RequestStatusHistory, error) {
|
|
row := q.db.QueryRow(ctx, CreateStatusHistoryEntry,
|
|
arg.RequestID,
|
|
arg.FromStatus,
|
|
arg.ToStatus,
|
|
arg.ChangedBy,
|
|
arg.Comment,
|
|
)
|
|
var i RequestStatusHistory
|
|
err := row.Scan(
|
|
&i.ID,
|
|
&i.RequestID,
|
|
&i.FromStatus,
|
|
&i.ToStatus,
|
|
&i.ChangedBy,
|
|
&i.Comment,
|
|
&i.CreatedAt,
|
|
)
|
|
return i, err
|
|
}
|
|
|
|
const CreateVolunteerResponse = `-- name: CreateVolunteerResponse :one
|
|
|
|
|
|
INSERT INTO volunteer_responses (
|
|
request_id,
|
|
volunteer_id,
|
|
message
|
|
) VALUES (
|
|
$1,
|
|
$2,
|
|
$3
|
|
)
|
|
ON CONFLICT (request_id, volunteer_id) DO NOTHING
|
|
RETURNING id, request_id, volunteer_id, status, message, responded_at, accepted_at, rejected_at, created_at, updated_at
|
|
`
|
|
|
|
type CreateVolunteerResponseParams struct {
|
|
RequestID int64 `json:"request_id"`
|
|
VolunteerID int64 `json:"volunteer_id"`
|
|
Message pgtype.Text `json:"message"`
|
|
}
|
|
|
|
// Фаза 3: Отклики волонтеров и история статусов (СРЕДНИЙ ПРИОРИТЕТ)
|
|
// Запросы для управления откликами волонтеров и историей изменения статусов заявок
|
|
// ============================================================================
|
|
// Отклики волонтеров
|
|
// ============================================================================
|
|
func (q *Queries) CreateVolunteerResponse(ctx context.Context, arg CreateVolunteerResponseParams) (VolunteerResponse, error) {
|
|
row := q.db.QueryRow(ctx, CreateVolunteerResponse, arg.RequestID, arg.VolunteerID, arg.Message)
|
|
var i VolunteerResponse
|
|
err := row.Scan(
|
|
&i.ID,
|
|
&i.RequestID,
|
|
&i.VolunteerID,
|
|
&i.Status,
|
|
&i.Message,
|
|
&i.RespondedAt,
|
|
&i.AcceptedAt,
|
|
&i.RejectedAt,
|
|
&i.CreatedAt,
|
|
&i.UpdatedAt,
|
|
)
|
|
return i, err
|
|
}
|
|
|
|
const GetLatestStatusChange = `-- name: GetLatestStatusChange :one
|
|
SELECT
|
|
rsh.id, rsh.request_id, rsh.from_status, rsh.to_status, rsh.changed_by, rsh.comment, rsh.created_at,
|
|
(u.first_name || ' ' || u.last_name) as changed_by_name
|
|
FROM request_status_history rsh
|
|
JOIN users u ON u.id = rsh.changed_by
|
|
WHERE rsh.request_id = $1
|
|
ORDER BY rsh.created_at DESC
|
|
LIMIT 1
|
|
`
|
|
|
|
type GetLatestStatusChangeRow struct {
|
|
ID int64 `json:"id"`
|
|
RequestID int64 `json:"request_id"`
|
|
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"`
|
|
ChangedByName interface{} `json:"changed_by_name"`
|
|
}
|
|
|
|
func (q *Queries) GetLatestStatusChange(ctx context.Context, requestID int64) (GetLatestStatusChangeRow, error) {
|
|
row := q.db.QueryRow(ctx, GetLatestStatusChange, requestID)
|
|
var i GetLatestStatusChangeRow
|
|
err := row.Scan(
|
|
&i.ID,
|
|
&i.RequestID,
|
|
&i.FromStatus,
|
|
&i.ToStatus,
|
|
&i.ChangedBy,
|
|
&i.Comment,
|
|
&i.CreatedAt,
|
|
&i.ChangedByName,
|
|
)
|
|
return i, err
|
|
}
|
|
|
|
const GetRatingByResponseID = `-- name: GetRatingByResponseID :one
|
|
SELECT id, volunteer_response_id, volunteer_id, requester_id, request_id, rating, comment, created_at, updated_at FROM ratings
|
|
WHERE volunteer_response_id = $1
|
|
`
|
|
|
|
func (q *Queries) GetRatingByResponseID(ctx context.Context, volunteerResponseID int64) (Rating, error) {
|
|
row := q.db.QueryRow(ctx, GetRatingByResponseID, volunteerResponseID)
|
|
var i Rating
|
|
err := row.Scan(
|
|
&i.ID,
|
|
&i.VolunteerResponseID,
|
|
&i.VolunteerID,
|
|
&i.RequesterID,
|
|
&i.RequestID,
|
|
&i.Rating,
|
|
&i.Comment,
|
|
&i.CreatedAt,
|
|
&i.UpdatedAt,
|
|
)
|
|
return i, err
|
|
}
|
|
|
|
const GetRatingsByVolunteer = `-- name: GetRatingsByVolunteer :many
|
|
SELECT
|
|
r.id, r.volunteer_response_id, r.volunteer_id, r.requester_id, r.request_id, r.rating, r.comment, r.created_at, r.updated_at,
|
|
req.title as request_title,
|
|
(u.first_name || ' ' || u.last_name) as requester_name
|
|
FROM ratings r
|
|
JOIN requests req ON req.id = r.request_id
|
|
JOIN users u ON u.id = r.requester_id
|
|
WHERE r.volunteer_id = $1
|
|
ORDER BY r.created_at DESC
|
|
LIMIT $2 OFFSET $3
|
|
`
|
|
|
|
type GetRatingsByVolunteerParams struct {
|
|
VolunteerID int64 `json:"volunteer_id"`
|
|
Limit int32 `json:"limit"`
|
|
Offset int32 `json:"offset"`
|
|
}
|
|
|
|
type GetRatingsByVolunteerRow 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"`
|
|
Rating int32 `json:"rating"`
|
|
Comment pgtype.Text `json:"comment"`
|
|
CreatedAt pgtype.Timestamptz `json:"created_at"`
|
|
UpdatedAt pgtype.Timestamptz `json:"updated_at"`
|
|
RequestTitle string `json:"request_title"`
|
|
RequesterName interface{} `json:"requester_name"`
|
|
}
|
|
|
|
func (q *Queries) GetRatingsByVolunteer(ctx context.Context, arg GetRatingsByVolunteerParams) ([]GetRatingsByVolunteerRow, error) {
|
|
rows, err := q.db.Query(ctx, GetRatingsByVolunteer, arg.VolunteerID, arg.Limit, arg.Offset)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
items := []GetRatingsByVolunteerRow{}
|
|
for rows.Next() {
|
|
var i GetRatingsByVolunteerRow
|
|
if err := rows.Scan(
|
|
&i.ID,
|
|
&i.VolunteerResponseID,
|
|
&i.VolunteerID,
|
|
&i.RequesterID,
|
|
&i.RequestID,
|
|
&i.Rating,
|
|
&i.Comment,
|
|
&i.CreatedAt,
|
|
&i.UpdatedAt,
|
|
&i.RequestTitle,
|
|
&i.RequesterName,
|
|
); err != nil {
|
|
return nil, err
|
|
}
|
|
items = append(items, i)
|
|
}
|
|
if err := rows.Err(); err != nil {
|
|
return nil, err
|
|
}
|
|
return items, nil
|
|
}
|
|
|
|
const GetRequestStatusHistory = `-- name: GetRequestStatusHistory :many
|
|
SELECT
|
|
rsh.id, rsh.request_id, rsh.from_status, rsh.to_status, rsh.changed_by, rsh.comment, rsh.created_at,
|
|
(u.first_name || ' ' || u.last_name) as changed_by_name
|
|
FROM request_status_history rsh
|
|
JOIN users u ON u.id = rsh.changed_by
|
|
WHERE rsh.request_id = $1
|
|
ORDER BY rsh.created_at DESC
|
|
`
|
|
|
|
type GetRequestStatusHistoryRow struct {
|
|
ID int64 `json:"id"`
|
|
RequestID int64 `json:"request_id"`
|
|
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"`
|
|
ChangedByName interface{} `json:"changed_by_name"`
|
|
}
|
|
|
|
func (q *Queries) GetRequestStatusHistory(ctx context.Context, requestID int64) ([]GetRequestStatusHistoryRow, error) {
|
|
rows, err := q.db.Query(ctx, GetRequestStatusHistory, requestID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
items := []GetRequestStatusHistoryRow{}
|
|
for rows.Next() {
|
|
var i GetRequestStatusHistoryRow
|
|
if err := rows.Scan(
|
|
&i.ID,
|
|
&i.RequestID,
|
|
&i.FromStatus,
|
|
&i.ToStatus,
|
|
&i.ChangedBy,
|
|
&i.Comment,
|
|
&i.CreatedAt,
|
|
&i.ChangedByName,
|
|
); err != nil {
|
|
return nil, err
|
|
}
|
|
items = append(items, i)
|
|
}
|
|
if err := rows.Err(); err != nil {
|
|
return nil, err
|
|
}
|
|
return items, nil
|
|
}
|
|
|
|
const GetResponseByID = `-- name: GetResponseByID :one
|
|
SELECT
|
|
vr.id, vr.request_id, vr.volunteer_id, vr.status, vr.message, vr.responded_at, vr.accepted_at, vr.rejected_at, vr.created_at, vr.updated_at,
|
|
(u.first_name || ' ' || u.last_name) as volunteer_name,
|
|
r.title as request_title
|
|
FROM volunteer_responses vr
|
|
JOIN users u ON u.id = vr.volunteer_id
|
|
JOIN requests r ON r.id = vr.request_id
|
|
WHERE vr.id = $1
|
|
`
|
|
|
|
type GetResponseByIDRow 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"`
|
|
VolunteerName interface{} `json:"volunteer_name"`
|
|
RequestTitle string `json:"request_title"`
|
|
}
|
|
|
|
func (q *Queries) GetResponseByID(ctx context.Context, id int64) (GetResponseByIDRow, error) {
|
|
row := q.db.QueryRow(ctx, GetResponseByID, id)
|
|
var i GetResponseByIDRow
|
|
err := row.Scan(
|
|
&i.ID,
|
|
&i.RequestID,
|
|
&i.VolunteerID,
|
|
&i.Status,
|
|
&i.Message,
|
|
&i.RespondedAt,
|
|
&i.AcceptedAt,
|
|
&i.RejectedAt,
|
|
&i.CreatedAt,
|
|
&i.UpdatedAt,
|
|
&i.VolunteerName,
|
|
&i.RequestTitle,
|
|
)
|
|
return i, err
|
|
}
|
|
|
|
const GetResponsesByRequest = `-- name: GetResponsesByRequest :many
|
|
SELECT
|
|
vr.id, vr.request_id, vr.volunteer_id, vr.status, vr.message, vr.responded_at, vr.accepted_at, vr.rejected_at, vr.created_at, vr.updated_at,
|
|
(u.first_name || ' ' || u.last_name) as volunteer_name,
|
|
u.avatar_url as volunteer_avatar,
|
|
u.volunteer_rating,
|
|
u.completed_requests_count,
|
|
u.email as volunteer_email,
|
|
u.phone as volunteer_phone
|
|
FROM volunteer_responses vr
|
|
JOIN users u ON u.id = vr.volunteer_id
|
|
WHERE vr.request_id = $1
|
|
ORDER BY vr.created_at DESC
|
|
`
|
|
|
|
type GetResponsesByRequestRow 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"`
|
|
VolunteerName interface{} `json:"volunteer_name"`
|
|
VolunteerAvatar pgtype.Text `json:"volunteer_avatar"`
|
|
VolunteerRating pgtype.Numeric `json:"volunteer_rating"`
|
|
CompletedRequestsCount pgtype.Int4 `json:"completed_requests_count"`
|
|
VolunteerEmail string `json:"volunteer_email"`
|
|
VolunteerPhone pgtype.Text `json:"volunteer_phone"`
|
|
}
|
|
|
|
func (q *Queries) GetResponsesByRequest(ctx context.Context, requestID int64) ([]GetResponsesByRequestRow, error) {
|
|
rows, err := q.db.Query(ctx, GetResponsesByRequest, requestID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
items := []GetResponsesByRequestRow{}
|
|
for rows.Next() {
|
|
var i GetResponsesByRequestRow
|
|
if err := rows.Scan(
|
|
&i.ID,
|
|
&i.RequestID,
|
|
&i.VolunteerID,
|
|
&i.Status,
|
|
&i.Message,
|
|
&i.RespondedAt,
|
|
&i.AcceptedAt,
|
|
&i.RejectedAt,
|
|
&i.CreatedAt,
|
|
&i.UpdatedAt,
|
|
&i.VolunteerName,
|
|
&i.VolunteerAvatar,
|
|
&i.VolunteerRating,
|
|
&i.CompletedRequestsCount,
|
|
&i.VolunteerEmail,
|
|
&i.VolunteerPhone,
|
|
); err != nil {
|
|
return nil, err
|
|
}
|
|
items = append(items, i)
|
|
}
|
|
if err := rows.Err(); err != nil {
|
|
return nil, err
|
|
}
|
|
return items, nil
|
|
}
|
|
|
|
const GetResponsesByVolunteer = `-- name: GetResponsesByVolunteer :many
|
|
SELECT
|
|
vr.id, vr.request_id, vr.volunteer_id, vr.status, vr.message, vr.responded_at, vr.accepted_at, vr.rejected_at, vr.created_at, vr.updated_at,
|
|
r.title as request_title,
|
|
r.status as request_status,
|
|
(u.first_name || ' ' || u.last_name) as requester_name
|
|
FROM volunteer_responses vr
|
|
JOIN requests r ON r.id = vr.request_id
|
|
JOIN users u ON u.id = r.requester_id
|
|
WHERE vr.volunteer_id = $1
|
|
ORDER BY vr.created_at DESC
|
|
LIMIT $2 OFFSET $3
|
|
`
|
|
|
|
type GetResponsesByVolunteerParams struct {
|
|
VolunteerID int64 `json:"volunteer_id"`
|
|
Limit int32 `json:"limit"`
|
|
Offset int32 `json:"offset"`
|
|
}
|
|
|
|
type GetResponsesByVolunteerRow 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"`
|
|
RequestTitle string `json:"request_title"`
|
|
RequestStatus NullRequestStatus `json:"request_status"`
|
|
RequesterName interface{} `json:"requester_name"`
|
|
}
|
|
|
|
func (q *Queries) GetResponsesByVolunteer(ctx context.Context, arg GetResponsesByVolunteerParams) ([]GetResponsesByVolunteerRow, error) {
|
|
rows, err := q.db.Query(ctx, GetResponsesByVolunteer, arg.VolunteerID, arg.Limit, arg.Offset)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
items := []GetResponsesByVolunteerRow{}
|
|
for rows.Next() {
|
|
var i GetResponsesByVolunteerRow
|
|
if err := rows.Scan(
|
|
&i.ID,
|
|
&i.RequestID,
|
|
&i.VolunteerID,
|
|
&i.Status,
|
|
&i.Message,
|
|
&i.RespondedAt,
|
|
&i.AcceptedAt,
|
|
&i.RejectedAt,
|
|
&i.CreatedAt,
|
|
&i.UpdatedAt,
|
|
&i.RequestTitle,
|
|
&i.RequestStatus,
|
|
&i.RequesterName,
|
|
); err != nil {
|
|
return nil, err
|
|
}
|
|
items = append(items, i)
|
|
}
|
|
if err := rows.Err(); err != nil {
|
|
return nil, err
|
|
}
|
|
return items, nil
|
|
}
|
|
|
|
const RejectVolunteerResponse = `-- name: RejectVolunteerResponse :exec
|
|
UPDATE volunteer_responses SET
|
|
status = 'rejected',
|
|
rejected_at = CURRENT_TIMESTAMP,
|
|
updated_at = CURRENT_TIMESTAMP
|
|
WHERE id = $1
|
|
`
|
|
|
|
func (q *Queries) RejectVolunteerResponse(ctx context.Context, id int64) error {
|
|
_, err := q.db.Exec(ctx, RejectVolunteerResponse, id)
|
|
return err
|
|
}
|
|
|
|
const UpdateRating = `-- name: UpdateRating :exec
|
|
UPDATE ratings SET
|
|
rating = $2,
|
|
comment = $3,
|
|
updated_at = CURRENT_TIMESTAMP
|
|
WHERE id = $1
|
|
`
|
|
|
|
type UpdateRatingParams struct {
|
|
ID int64 `json:"id"`
|
|
Rating int32 `json:"rating"`
|
|
Comment pgtype.Text `json:"comment"`
|
|
}
|
|
|
|
func (q *Queries) UpdateRating(ctx context.Context, arg UpdateRatingParams) error {
|
|
_, err := q.db.Exec(ctx, UpdateRating, arg.ID, arg.Rating, arg.Comment)
|
|
return err
|
|
}
|