2331 lines
59 KiB
Go
2331 lines
59 KiB
Go
// Code generated by sqlc. DO NOT EDIT.
|
|
// versions:
|
|
// sqlc v1.31.1
|
|
// source: message.sql
|
|
|
|
package sqlcgen
|
|
|
|
import (
|
|
"context"
|
|
)
|
|
|
|
const createMessage = `-- name: CreateMessage :one
|
|
WITH pm AS (
|
|
INSERT INTO private_messages (
|
|
sender_user_id,
|
|
recipient_user_id,
|
|
random_id,
|
|
message_date,
|
|
body,
|
|
entities
|
|
) VALUES (
|
|
$1,
|
|
$2,
|
|
0,
|
|
$3,
|
|
$4,
|
|
$5::jsonb
|
|
)
|
|
RETURNING id, sender_user_id
|
|
),
|
|
box AS (
|
|
INSERT INTO message_boxes (
|
|
owner_user_id,
|
|
box_id,
|
|
private_message_id,
|
|
message_sender_id,
|
|
peer_type,
|
|
peer_id,
|
|
from_user_id,
|
|
message_date,
|
|
outgoing,
|
|
body,
|
|
entities,
|
|
pts
|
|
)
|
|
SELECT
|
|
$2,
|
|
$6,
|
|
pm.id,
|
|
pm.sender_user_id,
|
|
$7,
|
|
$8,
|
|
$1,
|
|
$3,
|
|
$9,
|
|
$4,
|
|
$5::jsonb,
|
|
$10
|
|
FROM pm
|
|
RETURNING
|
|
box_id,
|
|
private_message_id,
|
|
owner_user_id,
|
|
peer_type,
|
|
peer_id,
|
|
from_user_id,
|
|
message_date,
|
|
edit_date,
|
|
outgoing,
|
|
body,
|
|
entities::text AS entities_json,
|
|
pts
|
|
)
|
|
SELECT
|
|
box_id,
|
|
private_message_id,
|
|
owner_user_id,
|
|
peer_type,
|
|
peer_id,
|
|
from_user_id,
|
|
message_date,
|
|
edit_date,
|
|
outgoing,
|
|
body,
|
|
entities_json,
|
|
pts
|
|
FROM box
|
|
`
|
|
|
|
type CreateMessageParams struct {
|
|
FromUserID int64
|
|
OwnerUserID int64
|
|
MessageDate int32
|
|
Body string
|
|
EntitiesJson []byte
|
|
BoxID int32
|
|
PeerType string
|
|
PeerID int64
|
|
Outgoing bool
|
|
Pts int32
|
|
}
|
|
|
|
type CreateMessageRow struct {
|
|
BoxID int32
|
|
PrivateMessageID int64
|
|
OwnerUserID int64
|
|
PeerType string
|
|
PeerID int64
|
|
FromUserID int64
|
|
MessageDate int32
|
|
EditDate int32
|
|
Outgoing bool
|
|
Body string
|
|
EntitiesJson string
|
|
Pts int32
|
|
}
|
|
|
|
func (q *Queries) CreateMessage(ctx context.Context, arg CreateMessageParams) (CreateMessageRow, error) {
|
|
row := q.db.QueryRow(ctx, createMessage,
|
|
arg.FromUserID,
|
|
arg.OwnerUserID,
|
|
arg.MessageDate,
|
|
arg.Body,
|
|
arg.EntitiesJson,
|
|
arg.BoxID,
|
|
arg.PeerType,
|
|
arg.PeerID,
|
|
arg.Outgoing,
|
|
arg.Pts,
|
|
)
|
|
var i CreateMessageRow
|
|
err := row.Scan(
|
|
&i.BoxID,
|
|
&i.PrivateMessageID,
|
|
&i.OwnerUserID,
|
|
&i.PeerType,
|
|
&i.PeerID,
|
|
&i.FromUserID,
|
|
&i.MessageDate,
|
|
&i.EditDate,
|
|
&i.Outgoing,
|
|
&i.Body,
|
|
&i.EntitiesJson,
|
|
&i.Pts,
|
|
)
|
|
return i, err
|
|
}
|
|
|
|
const createMessageBox = `-- name: CreateMessageBox :one
|
|
INSERT INTO message_boxes (
|
|
owner_user_id,
|
|
box_id,
|
|
private_message_id,
|
|
message_sender_id,
|
|
peer_type,
|
|
peer_id,
|
|
from_user_id,
|
|
message_date,
|
|
outgoing,
|
|
body,
|
|
entities,
|
|
silent,
|
|
noforwards,
|
|
reply_to_msg_id,
|
|
reply_to_peer_type,
|
|
reply_to_peer_id,
|
|
reply_to_top_id,
|
|
quote_text,
|
|
quote_entities,
|
|
quote_offset,
|
|
fwd_from_peer_type,
|
|
fwd_from_peer_id,
|
|
fwd_from_name,
|
|
fwd_date,
|
|
pts,
|
|
media
|
|
) VALUES (
|
|
$1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11::jsonb,
|
|
$12::boolean,
|
|
$13::boolean,
|
|
$14::int,
|
|
$15::text,
|
|
$16::bigint,
|
|
$17::int,
|
|
$18::text,
|
|
$19::jsonb,
|
|
$20::int,
|
|
$21::text,
|
|
$22::bigint,
|
|
$23::text,
|
|
$24::int,
|
|
$25::int,
|
|
$26::jsonb
|
|
)
|
|
RETURNING
|
|
box_id,
|
|
private_message_id,
|
|
owner_user_id,
|
|
peer_type,
|
|
peer_id,
|
|
from_user_id,
|
|
message_date,
|
|
edit_date,
|
|
outgoing,
|
|
body,
|
|
entities::text AS entities_json,
|
|
silent,
|
|
noforwards,
|
|
reply_to_msg_id,
|
|
reply_to_peer_type,
|
|
reply_to_peer_id,
|
|
reply_to_top_id,
|
|
quote_text,
|
|
quote_entities::text AS quote_entities_json,
|
|
quote_offset,
|
|
fwd_from_peer_type,
|
|
fwd_from_peer_id,
|
|
fwd_from_name,
|
|
fwd_date,
|
|
pts,
|
|
media::text AS media_json
|
|
`
|
|
|
|
type CreateMessageBoxParams struct {
|
|
OwnerUserID int64
|
|
BoxID int32
|
|
PrivateMessageID int64
|
|
MessageSenderID int64
|
|
PeerType string
|
|
PeerID int64
|
|
FromUserID int64
|
|
MessageDate int32
|
|
Outgoing bool
|
|
Body string
|
|
EntitiesJson []byte
|
|
Silent bool
|
|
Noforwards bool
|
|
ReplyToMsgID int32
|
|
ReplyToPeerType string
|
|
ReplyToPeerID int64
|
|
ReplyToTopID int32
|
|
QuoteText string
|
|
QuoteEntitiesJson []byte
|
|
QuoteOffset int32
|
|
FwdFromPeerType string
|
|
FwdFromPeerID int64
|
|
FwdFromName string
|
|
FwdDate int32
|
|
Pts int32
|
|
MediaJson []byte
|
|
}
|
|
|
|
type CreateMessageBoxRow struct {
|
|
BoxID int32
|
|
PrivateMessageID int64
|
|
OwnerUserID int64
|
|
PeerType string
|
|
PeerID int64
|
|
FromUserID int64
|
|
MessageDate int32
|
|
EditDate int32
|
|
Outgoing bool
|
|
Body string
|
|
EntitiesJson string
|
|
Silent bool
|
|
Noforwards bool
|
|
ReplyToMsgID int32
|
|
ReplyToPeerType string
|
|
ReplyToPeerID int64
|
|
ReplyToTopID int32
|
|
QuoteText string
|
|
QuoteEntitiesJson string
|
|
QuoteOffset int32
|
|
FwdFromPeerType string
|
|
FwdFromPeerID int64
|
|
FwdFromName string
|
|
FwdDate int32
|
|
Pts int32
|
|
MediaJson string
|
|
}
|
|
|
|
func (q *Queries) CreateMessageBox(ctx context.Context, arg CreateMessageBoxParams) (CreateMessageBoxRow, error) {
|
|
row := q.db.QueryRow(ctx, createMessageBox,
|
|
arg.OwnerUserID,
|
|
arg.BoxID,
|
|
arg.PrivateMessageID,
|
|
arg.MessageSenderID,
|
|
arg.PeerType,
|
|
arg.PeerID,
|
|
arg.FromUserID,
|
|
arg.MessageDate,
|
|
arg.Outgoing,
|
|
arg.Body,
|
|
arg.EntitiesJson,
|
|
arg.Silent,
|
|
arg.Noforwards,
|
|
arg.ReplyToMsgID,
|
|
arg.ReplyToPeerType,
|
|
arg.ReplyToPeerID,
|
|
arg.ReplyToTopID,
|
|
arg.QuoteText,
|
|
arg.QuoteEntitiesJson,
|
|
arg.QuoteOffset,
|
|
arg.FwdFromPeerType,
|
|
arg.FwdFromPeerID,
|
|
arg.FwdFromName,
|
|
arg.FwdDate,
|
|
arg.Pts,
|
|
arg.MediaJson,
|
|
)
|
|
var i CreateMessageBoxRow
|
|
err := row.Scan(
|
|
&i.BoxID,
|
|
&i.PrivateMessageID,
|
|
&i.OwnerUserID,
|
|
&i.PeerType,
|
|
&i.PeerID,
|
|
&i.FromUserID,
|
|
&i.MessageDate,
|
|
&i.EditDate,
|
|
&i.Outgoing,
|
|
&i.Body,
|
|
&i.EntitiesJson,
|
|
&i.Silent,
|
|
&i.Noforwards,
|
|
&i.ReplyToMsgID,
|
|
&i.ReplyToPeerType,
|
|
&i.ReplyToPeerID,
|
|
&i.ReplyToTopID,
|
|
&i.QuoteText,
|
|
&i.QuoteEntitiesJson,
|
|
&i.QuoteOffset,
|
|
&i.FwdFromPeerType,
|
|
&i.FwdFromPeerID,
|
|
&i.FwdFromName,
|
|
&i.FwdDate,
|
|
&i.Pts,
|
|
&i.MediaJson,
|
|
)
|
|
return i, err
|
|
}
|
|
|
|
const createPrivateMessage = `-- name: CreatePrivateMessage :one
|
|
INSERT INTO private_messages (
|
|
sender_user_id,
|
|
recipient_user_id,
|
|
random_id,
|
|
message_date,
|
|
body,
|
|
entities,
|
|
silent,
|
|
noforwards,
|
|
reply_to_msg_id,
|
|
reply_to_peer_type,
|
|
reply_to_peer_id,
|
|
reply_to_top_id,
|
|
quote_text,
|
|
quote_entities,
|
|
quote_offset,
|
|
fwd_from_peer_type,
|
|
fwd_from_peer_id,
|
|
fwd_from_name,
|
|
fwd_date,
|
|
media
|
|
) VALUES (
|
|
$1, $2, $3, $4, $5, $6::jsonb,
|
|
$7::boolean,
|
|
$8::boolean,
|
|
$9::int,
|
|
$10::text,
|
|
$11::bigint,
|
|
$12::int,
|
|
$13::text,
|
|
$14::jsonb,
|
|
$15::int,
|
|
$16::text,
|
|
$17::bigint,
|
|
$18::text,
|
|
$19::int,
|
|
$20::jsonb
|
|
)
|
|
ON CONFLICT (sender_user_id, random_id) WHERE random_id <> 0 DO NOTHING
|
|
RETURNING
|
|
id,
|
|
sender_user_id,
|
|
recipient_user_id,
|
|
random_id,
|
|
message_date,
|
|
edit_date,
|
|
body,
|
|
entities::text AS entities_json
|
|
`
|
|
|
|
type CreatePrivateMessageParams struct {
|
|
SenderUserID int64
|
|
RecipientUserID int64
|
|
RandomID int64
|
|
MessageDate int32
|
|
Body string
|
|
EntitiesJson []byte
|
|
Silent bool
|
|
Noforwards bool
|
|
ReplyToMsgID int32
|
|
ReplyToPeerType string
|
|
ReplyToPeerID int64
|
|
ReplyToTopID int32
|
|
QuoteText string
|
|
QuoteEntitiesJson []byte
|
|
QuoteOffset int32
|
|
FwdFromPeerType string
|
|
FwdFromPeerID int64
|
|
FwdFromName string
|
|
FwdDate int32
|
|
MediaJson []byte
|
|
}
|
|
|
|
type CreatePrivateMessageRow struct {
|
|
ID int64
|
|
SenderUserID int64
|
|
RecipientUserID int64
|
|
RandomID int64
|
|
MessageDate int32
|
|
EditDate int32
|
|
Body string
|
|
EntitiesJson string
|
|
}
|
|
|
|
func (q *Queries) CreatePrivateMessage(ctx context.Context, arg CreatePrivateMessageParams) (CreatePrivateMessageRow, error) {
|
|
row := q.db.QueryRow(ctx, createPrivateMessage,
|
|
arg.SenderUserID,
|
|
arg.RecipientUserID,
|
|
arg.RandomID,
|
|
arg.MessageDate,
|
|
arg.Body,
|
|
arg.EntitiesJson,
|
|
arg.Silent,
|
|
arg.Noforwards,
|
|
arg.ReplyToMsgID,
|
|
arg.ReplyToPeerType,
|
|
arg.ReplyToPeerID,
|
|
arg.ReplyToTopID,
|
|
arg.QuoteText,
|
|
arg.QuoteEntitiesJson,
|
|
arg.QuoteOffset,
|
|
arg.FwdFromPeerType,
|
|
arg.FwdFromPeerID,
|
|
arg.FwdFromName,
|
|
arg.FwdDate,
|
|
arg.MediaJson,
|
|
)
|
|
var i CreatePrivateMessageRow
|
|
err := row.Scan(
|
|
&i.ID,
|
|
&i.SenderUserID,
|
|
&i.RecipientUserID,
|
|
&i.RandomID,
|
|
&i.MessageDate,
|
|
&i.EditDate,
|
|
&i.Body,
|
|
&i.EntitiesJson,
|
|
)
|
|
return i, err
|
|
}
|
|
|
|
const deleteMessageBoxesByIDs = `-- name: DeleteMessageBoxesByIDs :many
|
|
WITH updated AS (
|
|
UPDATE message_boxes m
|
|
SET deleted = true
|
|
WHERE m.owner_user_id = $1::bigint
|
|
AND m.box_id = ANY($2::int[])
|
|
AND NOT m.deleted
|
|
RETURNING
|
|
m.owner_user_id,
|
|
m.box_id,
|
|
m.private_message_id,
|
|
m.message_sender_id,
|
|
m.peer_type,
|
|
m.peer_id
|
|
)
|
|
SELECT
|
|
owner_user_id,
|
|
box_id,
|
|
private_message_id,
|
|
message_sender_id,
|
|
peer_type,
|
|
peer_id
|
|
FROM updated
|
|
ORDER BY box_id ASC
|
|
`
|
|
|
|
type DeleteMessageBoxesByIDsParams struct {
|
|
OwnerUserID int64
|
|
BoxIds []int32
|
|
}
|
|
|
|
type DeleteMessageBoxesByIDsRow struct {
|
|
OwnerUserID int64
|
|
BoxID int32
|
|
PrivateMessageID int64
|
|
MessageSenderID int64
|
|
PeerType string
|
|
PeerID int64
|
|
}
|
|
|
|
func (q *Queries) DeleteMessageBoxesByIDs(ctx context.Context, arg DeleteMessageBoxesByIDsParams) ([]DeleteMessageBoxesByIDsRow, error) {
|
|
rows, err := q.db.Query(ctx, deleteMessageBoxesByIDs, arg.OwnerUserID, arg.BoxIds)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
var items []DeleteMessageBoxesByIDsRow
|
|
for rows.Next() {
|
|
var i DeleteMessageBoxesByIDsRow
|
|
if err := rows.Scan(
|
|
&i.OwnerUserID,
|
|
&i.BoxID,
|
|
&i.PrivateMessageID,
|
|
&i.MessageSenderID,
|
|
&i.PeerType,
|
|
&i.PeerID,
|
|
); err != nil {
|
|
return nil, err
|
|
}
|
|
items = append(items, i)
|
|
}
|
|
if err := rows.Err(); err != nil {
|
|
return nil, err
|
|
}
|
|
return items, nil
|
|
}
|
|
|
|
const deleteMessageBoxesByPeer = `-- name: DeleteMessageBoxesByPeer :many
|
|
WITH updated AS (
|
|
UPDATE message_boxes m
|
|
SET deleted = true
|
|
WHERE m.owner_user_id = $1::bigint
|
|
AND m.peer_type = $2::text
|
|
AND m.peer_id = $3::bigint
|
|
AND ($4::int <= 0 OR m.box_id <= $4::int)
|
|
AND NOT m.deleted
|
|
RETURNING
|
|
m.owner_user_id,
|
|
m.box_id,
|
|
m.private_message_id,
|
|
m.message_sender_id,
|
|
m.peer_type,
|
|
m.peer_id
|
|
)
|
|
SELECT
|
|
owner_user_id,
|
|
box_id,
|
|
private_message_id,
|
|
message_sender_id,
|
|
peer_type,
|
|
peer_id
|
|
FROM updated
|
|
ORDER BY box_id ASC
|
|
`
|
|
|
|
type DeleteMessageBoxesByPeerParams struct {
|
|
OwnerUserID int64
|
|
PeerType string
|
|
PeerID int64
|
|
MaxID int32
|
|
}
|
|
|
|
type DeleteMessageBoxesByPeerRow struct {
|
|
OwnerUserID int64
|
|
BoxID int32
|
|
PrivateMessageID int64
|
|
MessageSenderID int64
|
|
PeerType string
|
|
PeerID int64
|
|
}
|
|
|
|
func (q *Queries) DeleteMessageBoxesByPeer(ctx context.Context, arg DeleteMessageBoxesByPeerParams) ([]DeleteMessageBoxesByPeerRow, error) {
|
|
rows, err := q.db.Query(ctx, deleteMessageBoxesByPeer,
|
|
arg.OwnerUserID,
|
|
arg.PeerType,
|
|
arg.PeerID,
|
|
arg.MaxID,
|
|
)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
var items []DeleteMessageBoxesByPeerRow
|
|
for rows.Next() {
|
|
var i DeleteMessageBoxesByPeerRow
|
|
if err := rows.Scan(
|
|
&i.OwnerUserID,
|
|
&i.BoxID,
|
|
&i.PrivateMessageID,
|
|
&i.MessageSenderID,
|
|
&i.PeerType,
|
|
&i.PeerID,
|
|
); err != nil {
|
|
return nil, err
|
|
}
|
|
items = append(items, i)
|
|
}
|
|
if err := rows.Err(); err != nil {
|
|
return nil, err
|
|
}
|
|
return items, nil
|
|
}
|
|
|
|
const deleteMessageBoxesByPeerBatch = `-- name: DeleteMessageBoxesByPeerBatch :many
|
|
WITH target AS (
|
|
SELECT
|
|
m.owner_user_id,
|
|
m.box_id
|
|
FROM message_boxes m
|
|
WHERE m.owner_user_id = $1::bigint
|
|
AND m.peer_type = $2::text
|
|
AND m.peer_id = $3::bigint
|
|
AND ($4::int <= 0 OR m.box_id <= $4::int)
|
|
AND NOT m.deleted
|
|
ORDER BY m.box_id DESC
|
|
LIMIT $5::int
|
|
FOR UPDATE SKIP LOCKED
|
|
),
|
|
updated AS (
|
|
UPDATE message_boxes m
|
|
SET deleted = true
|
|
FROM target t
|
|
WHERE m.owner_user_id = t.owner_user_id
|
|
AND m.box_id = t.box_id
|
|
RETURNING
|
|
m.owner_user_id,
|
|
m.box_id,
|
|
m.private_message_id,
|
|
m.message_sender_id,
|
|
m.peer_type,
|
|
m.peer_id
|
|
)
|
|
SELECT
|
|
owner_user_id,
|
|
box_id,
|
|
private_message_id,
|
|
message_sender_id,
|
|
peer_type,
|
|
peer_id
|
|
FROM updated
|
|
ORDER BY box_id ASC
|
|
`
|
|
|
|
type DeleteMessageBoxesByPeerBatchParams struct {
|
|
OwnerUserID int64
|
|
PeerType string
|
|
PeerID int64
|
|
MaxID int32
|
|
LimitCount int32
|
|
}
|
|
|
|
type DeleteMessageBoxesByPeerBatchRow struct {
|
|
OwnerUserID int64
|
|
BoxID int32
|
|
PrivateMessageID int64
|
|
MessageSenderID int64
|
|
PeerType string
|
|
PeerID int64
|
|
}
|
|
|
|
func (q *Queries) DeleteMessageBoxesByPeerBatch(ctx context.Context, arg DeleteMessageBoxesByPeerBatchParams) ([]DeleteMessageBoxesByPeerBatchRow, error) {
|
|
rows, err := q.db.Query(ctx, deleteMessageBoxesByPeerBatch,
|
|
arg.OwnerUserID,
|
|
arg.PeerType,
|
|
arg.PeerID,
|
|
arg.MaxID,
|
|
arg.LimitCount,
|
|
)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
var items []DeleteMessageBoxesByPeerBatchRow
|
|
for rows.Next() {
|
|
var i DeleteMessageBoxesByPeerBatchRow
|
|
if err := rows.Scan(
|
|
&i.OwnerUserID,
|
|
&i.BoxID,
|
|
&i.PrivateMessageID,
|
|
&i.MessageSenderID,
|
|
&i.PeerType,
|
|
&i.PeerID,
|
|
); err != nil {
|
|
return nil, err
|
|
}
|
|
items = append(items, i)
|
|
}
|
|
if err := rows.Err(); err != nil {
|
|
return nil, err
|
|
}
|
|
return items, nil
|
|
}
|
|
|
|
const deleteMessageBoxesByPrivateMessages = `-- name: DeleteMessageBoxesByPrivateMessages :many
|
|
WITH requested AS (
|
|
SELECT
|
|
($1::bigint[])[i] AS message_sender_id,
|
|
($2::bigint[])[i] AS private_message_id
|
|
FROM generate_subscripts($2::bigint[], 1) AS g(i)
|
|
WHERE i <= cardinality($1::bigint[])
|
|
),
|
|
deduped AS (
|
|
SELECT DISTINCT message_sender_id, private_message_id
|
|
FROM requested
|
|
),
|
|
updated AS (
|
|
UPDATE message_boxes m
|
|
SET deleted = true
|
|
FROM deduped d
|
|
WHERE m.message_sender_id = d.message_sender_id
|
|
AND m.private_message_id = d.private_message_id
|
|
AND NOT m.deleted
|
|
RETURNING
|
|
m.owner_user_id,
|
|
m.box_id,
|
|
m.private_message_id,
|
|
m.message_sender_id,
|
|
m.peer_type,
|
|
m.peer_id
|
|
)
|
|
SELECT
|
|
owner_user_id,
|
|
box_id,
|
|
private_message_id,
|
|
message_sender_id,
|
|
peer_type,
|
|
peer_id
|
|
FROM updated
|
|
ORDER BY owner_user_id ASC, box_id ASC
|
|
`
|
|
|
|
type DeleteMessageBoxesByPrivateMessagesParams struct {
|
|
MessageSenderIds []int64
|
|
PrivateMessageIds []int64
|
|
}
|
|
|
|
type DeleteMessageBoxesByPrivateMessagesRow struct {
|
|
OwnerUserID int64
|
|
BoxID int32
|
|
PrivateMessageID int64
|
|
MessageSenderID int64
|
|
PeerType string
|
|
PeerID int64
|
|
}
|
|
|
|
func (q *Queries) DeleteMessageBoxesByPrivateMessages(ctx context.Context, arg DeleteMessageBoxesByPrivateMessagesParams) ([]DeleteMessageBoxesByPrivateMessagesRow, error) {
|
|
rows, err := q.db.Query(ctx, deleteMessageBoxesByPrivateMessages, arg.MessageSenderIds, arg.PrivateMessageIds)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
var items []DeleteMessageBoxesByPrivateMessagesRow
|
|
for rows.Next() {
|
|
var i DeleteMessageBoxesByPrivateMessagesRow
|
|
if err := rows.Scan(
|
|
&i.OwnerUserID,
|
|
&i.BoxID,
|
|
&i.PrivateMessageID,
|
|
&i.MessageSenderID,
|
|
&i.PeerType,
|
|
&i.PeerID,
|
|
); err != nil {
|
|
return nil, err
|
|
}
|
|
items = append(items, i)
|
|
}
|
|
if err := rows.Err(); err != nil {
|
|
return nil, err
|
|
}
|
|
return items, nil
|
|
}
|
|
|
|
const getDialogReadStateForUpdate = `-- name: GetDialogReadStateForUpdate :one
|
|
SELECT
|
|
user_id,
|
|
peer_type,
|
|
peer_id,
|
|
top_message_id,
|
|
read_inbox_max_id,
|
|
unread_count
|
|
FROM dialogs
|
|
WHERE user_id = $1::bigint
|
|
AND peer_type = $2::text
|
|
AND peer_id = $3::bigint
|
|
FOR UPDATE
|
|
`
|
|
|
|
type GetDialogReadStateForUpdateParams struct {
|
|
UserID int64
|
|
PeerType string
|
|
PeerID int64
|
|
}
|
|
|
|
type GetDialogReadStateForUpdateRow struct {
|
|
UserID int64
|
|
PeerType string
|
|
PeerID int64
|
|
TopMessageID int32
|
|
ReadInboxMaxID int32
|
|
UnreadCount int32
|
|
}
|
|
|
|
func (q *Queries) GetDialogReadStateForUpdate(ctx context.Context, arg GetDialogReadStateForUpdateParams) (GetDialogReadStateForUpdateRow, error) {
|
|
row := q.db.QueryRow(ctx, getDialogReadStateForUpdate, arg.UserID, arg.PeerType, arg.PeerID)
|
|
var i GetDialogReadStateForUpdateRow
|
|
err := row.Scan(
|
|
&i.UserID,
|
|
&i.PeerType,
|
|
&i.PeerID,
|
|
&i.TopMessageID,
|
|
&i.ReadInboxMaxID,
|
|
&i.UnreadCount,
|
|
)
|
|
return i, err
|
|
}
|
|
|
|
const getMessageBoxByPrivateMessage = `-- name: GetMessageBoxByPrivateMessage :one
|
|
SELECT
|
|
box_id,
|
|
private_message_id,
|
|
owner_user_id,
|
|
peer_type,
|
|
peer_id,
|
|
from_user_id,
|
|
message_date,
|
|
edit_date,
|
|
outgoing,
|
|
body,
|
|
entities::text AS entities_json,
|
|
silent,
|
|
noforwards,
|
|
reply_to_msg_id,
|
|
reply_to_peer_type,
|
|
reply_to_peer_id,
|
|
reply_to_top_id,
|
|
quote_text,
|
|
quote_entities::text AS quote_entities_json,
|
|
quote_offset,
|
|
fwd_from_peer_type,
|
|
fwd_from_peer_id,
|
|
fwd_from_name,
|
|
fwd_date,
|
|
pts,
|
|
media::text AS media_json
|
|
FROM message_boxes
|
|
WHERE owner_user_id = $1
|
|
AND private_message_id = $2
|
|
AND NOT deleted
|
|
`
|
|
|
|
type GetMessageBoxByPrivateMessageParams struct {
|
|
OwnerUserID int64
|
|
PrivateMessageID int64
|
|
}
|
|
|
|
type GetMessageBoxByPrivateMessageRow struct {
|
|
BoxID int32
|
|
PrivateMessageID int64
|
|
OwnerUserID int64
|
|
PeerType string
|
|
PeerID int64
|
|
FromUserID int64
|
|
MessageDate int32
|
|
EditDate int32
|
|
Outgoing bool
|
|
Body string
|
|
EntitiesJson string
|
|
Silent bool
|
|
Noforwards bool
|
|
ReplyToMsgID int32
|
|
ReplyToPeerType string
|
|
ReplyToPeerID int64
|
|
ReplyToTopID int32
|
|
QuoteText string
|
|
QuoteEntitiesJson string
|
|
QuoteOffset int32
|
|
FwdFromPeerType string
|
|
FwdFromPeerID int64
|
|
FwdFromName string
|
|
FwdDate int32
|
|
Pts int32
|
|
MediaJson string
|
|
}
|
|
|
|
func (q *Queries) GetMessageBoxByPrivateMessage(ctx context.Context, arg GetMessageBoxByPrivateMessageParams) (GetMessageBoxByPrivateMessageRow, error) {
|
|
row := q.db.QueryRow(ctx, getMessageBoxByPrivateMessage, arg.OwnerUserID, arg.PrivateMessageID)
|
|
var i GetMessageBoxByPrivateMessageRow
|
|
err := row.Scan(
|
|
&i.BoxID,
|
|
&i.PrivateMessageID,
|
|
&i.OwnerUserID,
|
|
&i.PeerType,
|
|
&i.PeerID,
|
|
&i.FromUserID,
|
|
&i.MessageDate,
|
|
&i.EditDate,
|
|
&i.Outgoing,
|
|
&i.Body,
|
|
&i.EntitiesJson,
|
|
&i.Silent,
|
|
&i.Noforwards,
|
|
&i.ReplyToMsgID,
|
|
&i.ReplyToPeerType,
|
|
&i.ReplyToPeerID,
|
|
&i.ReplyToTopID,
|
|
&i.QuoteText,
|
|
&i.QuoteEntitiesJson,
|
|
&i.QuoteOffset,
|
|
&i.FwdFromPeerType,
|
|
&i.FwdFromPeerID,
|
|
&i.FwdFromName,
|
|
&i.FwdDate,
|
|
&i.Pts,
|
|
&i.MediaJson,
|
|
)
|
|
return i, err
|
|
}
|
|
|
|
const getMessageBoxForEdit = `-- name: GetMessageBoxForEdit :one
|
|
SELECT
|
|
box_id,
|
|
private_message_id,
|
|
owner_user_id,
|
|
message_sender_id,
|
|
peer_type,
|
|
peer_id,
|
|
from_user_id,
|
|
message_date,
|
|
edit_date,
|
|
outgoing,
|
|
body,
|
|
entities::text AS entities_json,
|
|
silent,
|
|
noforwards,
|
|
reply_to_msg_id,
|
|
reply_to_peer_type,
|
|
reply_to_peer_id,
|
|
reply_to_top_id,
|
|
quote_text,
|
|
quote_entities::text AS quote_entities_json,
|
|
quote_offset,
|
|
fwd_from_peer_type,
|
|
fwd_from_peer_id,
|
|
fwd_from_name,
|
|
fwd_date,
|
|
pts,
|
|
media::text AS media_json
|
|
FROM message_boxes
|
|
WHERE owner_user_id = $1::bigint
|
|
AND box_id = $2::int
|
|
AND peer_type = $3::text
|
|
AND peer_id = $4::bigint
|
|
AND NOT deleted
|
|
LIMIT 1
|
|
FOR UPDATE
|
|
`
|
|
|
|
type GetMessageBoxForEditParams struct {
|
|
OwnerUserID int64
|
|
BoxID int32
|
|
PeerType string
|
|
PeerID int64
|
|
}
|
|
|
|
type GetMessageBoxForEditRow struct {
|
|
BoxID int32
|
|
PrivateMessageID int64
|
|
OwnerUserID int64
|
|
MessageSenderID int64
|
|
PeerType string
|
|
PeerID int64
|
|
FromUserID int64
|
|
MessageDate int32
|
|
EditDate int32
|
|
Outgoing bool
|
|
Body string
|
|
EntitiesJson string
|
|
Silent bool
|
|
Noforwards bool
|
|
ReplyToMsgID int32
|
|
ReplyToPeerType string
|
|
ReplyToPeerID int64
|
|
ReplyToTopID int32
|
|
QuoteText string
|
|
QuoteEntitiesJson string
|
|
QuoteOffset int32
|
|
FwdFromPeerType string
|
|
FwdFromPeerID int64
|
|
FwdFromName string
|
|
FwdDate int32
|
|
Pts int32
|
|
MediaJson string
|
|
}
|
|
|
|
func (q *Queries) GetMessageBoxForEdit(ctx context.Context, arg GetMessageBoxForEditParams) (GetMessageBoxForEditRow, error) {
|
|
row := q.db.QueryRow(ctx, getMessageBoxForEdit,
|
|
arg.OwnerUserID,
|
|
arg.BoxID,
|
|
arg.PeerType,
|
|
arg.PeerID,
|
|
)
|
|
var i GetMessageBoxForEditRow
|
|
err := row.Scan(
|
|
&i.BoxID,
|
|
&i.PrivateMessageID,
|
|
&i.OwnerUserID,
|
|
&i.MessageSenderID,
|
|
&i.PeerType,
|
|
&i.PeerID,
|
|
&i.FromUserID,
|
|
&i.MessageDate,
|
|
&i.EditDate,
|
|
&i.Outgoing,
|
|
&i.Body,
|
|
&i.EntitiesJson,
|
|
&i.Silent,
|
|
&i.Noforwards,
|
|
&i.ReplyToMsgID,
|
|
&i.ReplyToPeerType,
|
|
&i.ReplyToPeerID,
|
|
&i.ReplyToTopID,
|
|
&i.QuoteText,
|
|
&i.QuoteEntitiesJson,
|
|
&i.QuoteOffset,
|
|
&i.FwdFromPeerType,
|
|
&i.FwdFromPeerID,
|
|
&i.FwdFromName,
|
|
&i.FwdDate,
|
|
&i.Pts,
|
|
&i.MediaJson,
|
|
)
|
|
return i, err
|
|
}
|
|
|
|
const getMessageBoxForReply = `-- name: GetMessageBoxForReply :one
|
|
SELECT
|
|
box_id,
|
|
private_message_id,
|
|
message_sender_id
|
|
FROM message_boxes
|
|
WHERE owner_user_id = $1::bigint
|
|
AND peer_type = $2::text
|
|
AND peer_id = $3::bigint
|
|
AND box_id = $4::int
|
|
AND NOT deleted
|
|
LIMIT 1
|
|
`
|
|
|
|
type GetMessageBoxForReplyParams struct {
|
|
OwnerUserID int64
|
|
PeerType string
|
|
PeerID int64
|
|
BoxID int32
|
|
}
|
|
|
|
type GetMessageBoxForReplyRow struct {
|
|
BoxID int32
|
|
PrivateMessageID int64
|
|
MessageSenderID int64
|
|
}
|
|
|
|
func (q *Queries) GetMessageBoxForReply(ctx context.Context, arg GetMessageBoxForReplyParams) (GetMessageBoxForReplyRow, error) {
|
|
row := q.db.QueryRow(ctx, getMessageBoxForReply,
|
|
arg.OwnerUserID,
|
|
arg.PeerType,
|
|
arg.PeerID,
|
|
arg.BoxID,
|
|
)
|
|
var i GetMessageBoxForReplyRow
|
|
err := row.Scan(&i.BoxID, &i.PrivateMessageID, &i.MessageSenderID)
|
|
return i, err
|
|
}
|
|
|
|
const getMessageBoxesByIDs = `-- name: GetMessageBoxesByIDs :many
|
|
SELECT
|
|
wanted.box_id AS requested_box_id,
|
|
m.box_id,
|
|
m.private_message_id,
|
|
m.owner_user_id,
|
|
m.peer_type,
|
|
m.peer_id,
|
|
m.from_user_id,
|
|
m.message_date,
|
|
m.edit_date,
|
|
m.outgoing,
|
|
m.body,
|
|
m.entities::text AS entities_json,
|
|
m.silent,
|
|
m.noforwards,
|
|
m.reply_to_msg_id,
|
|
m.reply_to_peer_type,
|
|
m.reply_to_peer_id,
|
|
m.reply_to_top_id,
|
|
m.quote_text,
|
|
m.quote_entities::text AS quote_entities_json,
|
|
m.quote_offset,
|
|
m.fwd_from_peer_type,
|
|
m.fwd_from_peer_id,
|
|
m.fwd_from_name,
|
|
m.fwd_date,
|
|
m.pts,
|
|
m.media::text AS media_json,
|
|
COALESCE(peer_u.id, 0)::bigint AS peer_user_id,
|
|
COALESCE(peer_u.access_hash, 0)::bigint AS peer_access_hash,
|
|
COALESCE(peer_u.phone, '')::text AS peer_phone,
|
|
COALESCE(peer_u.first_name, '')::text AS peer_first_name,
|
|
COALESCE(peer_u.last_name, '')::text AS peer_last_name,
|
|
COALESCE(peer_u.username, '')::text AS peer_username,
|
|
COALESCE(peer_u.country_code, '')::text AS peer_country_code,
|
|
COALESCE(peer_u.verified, false)::boolean AS peer_verified,
|
|
COALESCE(peer_u.support, false)::boolean AS peer_support,
|
|
COALESCE(peer_u.last_seen_at, 0)::bigint AS peer_last_seen_at,
|
|
COALESCE(from_u.id, 0)::bigint AS from_user_user_id,
|
|
COALESCE(from_u.access_hash, 0)::bigint AS from_user_access_hash,
|
|
COALESCE(from_u.phone, '')::text AS from_user_phone,
|
|
COALESCE(from_u.first_name, '')::text AS from_user_first_name,
|
|
COALESCE(from_u.last_name, '')::text AS from_user_last_name,
|
|
COALESCE(from_u.username, '')::text AS from_user_username,
|
|
COALESCE(from_u.country_code, '')::text AS from_user_country_code,
|
|
COALESCE(from_u.verified, false)::boolean AS from_user_verified,
|
|
COALESCE(from_u.support, false)::boolean AS from_user_support,
|
|
COALESCE(from_u.last_seen_at, 0)::bigint AS from_user_last_seen_at
|
|
FROM unnest($1::int[]) WITH ORDINALITY AS wanted(box_id, ord)
|
|
JOIN message_boxes m
|
|
ON m.owner_user_id = $2::bigint
|
|
AND m.box_id = wanted.box_id
|
|
AND NOT m.deleted
|
|
LEFT JOIN users peer_u ON m.peer_type = 'user' AND peer_u.id = m.peer_id
|
|
LEFT JOIN users from_u ON from_u.id = m.from_user_id
|
|
ORDER BY wanted.ord ASC
|
|
`
|
|
|
|
type GetMessageBoxesByIDsParams struct {
|
|
BoxIds []int32
|
|
OwnerUserID int64
|
|
}
|
|
|
|
type GetMessageBoxesByIDsRow struct {
|
|
RequestedBoxID interface{}
|
|
BoxID int32
|
|
PrivateMessageID int64
|
|
OwnerUserID int64
|
|
PeerType string
|
|
PeerID int64
|
|
FromUserID int64
|
|
MessageDate int32
|
|
EditDate int32
|
|
Outgoing bool
|
|
Body string
|
|
EntitiesJson string
|
|
Silent bool
|
|
Noforwards bool
|
|
ReplyToMsgID int32
|
|
ReplyToPeerType string
|
|
ReplyToPeerID int64
|
|
ReplyToTopID int32
|
|
QuoteText string
|
|
QuoteEntitiesJson string
|
|
QuoteOffset int32
|
|
FwdFromPeerType string
|
|
FwdFromPeerID int64
|
|
FwdFromName string
|
|
FwdDate int32
|
|
Pts int32
|
|
MediaJson string
|
|
PeerUserID int64
|
|
PeerAccessHash int64
|
|
PeerPhone string
|
|
PeerFirstName string
|
|
PeerLastName string
|
|
PeerUsername string
|
|
PeerCountryCode string
|
|
PeerVerified bool
|
|
PeerSupport bool
|
|
PeerLastSeenAt int64
|
|
FromUserUserID int64
|
|
FromUserAccessHash int64
|
|
FromUserPhone string
|
|
FromUserFirstName string
|
|
FromUserLastName string
|
|
FromUserUsername string
|
|
FromUserCountryCode string
|
|
FromUserVerified bool
|
|
FromUserSupport bool
|
|
FromUserLastSeenAt int64
|
|
}
|
|
|
|
func (q *Queries) GetMessageBoxesByIDs(ctx context.Context, arg GetMessageBoxesByIDsParams) ([]GetMessageBoxesByIDsRow, error) {
|
|
rows, err := q.db.Query(ctx, getMessageBoxesByIDs, arg.BoxIds, arg.OwnerUserID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
var items []GetMessageBoxesByIDsRow
|
|
for rows.Next() {
|
|
var i GetMessageBoxesByIDsRow
|
|
if err := rows.Scan(
|
|
&i.RequestedBoxID,
|
|
&i.BoxID,
|
|
&i.PrivateMessageID,
|
|
&i.OwnerUserID,
|
|
&i.PeerType,
|
|
&i.PeerID,
|
|
&i.FromUserID,
|
|
&i.MessageDate,
|
|
&i.EditDate,
|
|
&i.Outgoing,
|
|
&i.Body,
|
|
&i.EntitiesJson,
|
|
&i.Silent,
|
|
&i.Noforwards,
|
|
&i.ReplyToMsgID,
|
|
&i.ReplyToPeerType,
|
|
&i.ReplyToPeerID,
|
|
&i.ReplyToTopID,
|
|
&i.QuoteText,
|
|
&i.QuoteEntitiesJson,
|
|
&i.QuoteOffset,
|
|
&i.FwdFromPeerType,
|
|
&i.FwdFromPeerID,
|
|
&i.FwdFromName,
|
|
&i.FwdDate,
|
|
&i.Pts,
|
|
&i.MediaJson,
|
|
&i.PeerUserID,
|
|
&i.PeerAccessHash,
|
|
&i.PeerPhone,
|
|
&i.PeerFirstName,
|
|
&i.PeerLastName,
|
|
&i.PeerUsername,
|
|
&i.PeerCountryCode,
|
|
&i.PeerVerified,
|
|
&i.PeerSupport,
|
|
&i.PeerLastSeenAt,
|
|
&i.FromUserUserID,
|
|
&i.FromUserAccessHash,
|
|
&i.FromUserPhone,
|
|
&i.FromUserFirstName,
|
|
&i.FromUserLastName,
|
|
&i.FromUserUsername,
|
|
&i.FromUserCountryCode,
|
|
&i.FromUserVerified,
|
|
&i.FromUserSupport,
|
|
&i.FromUserLastSeenAt,
|
|
); err != nil {
|
|
return nil, err
|
|
}
|
|
items = append(items, i)
|
|
}
|
|
if err := rows.Err(); err != nil {
|
|
return nil, err
|
|
}
|
|
return items, nil
|
|
}
|
|
|
|
const getMessageBoxesForForward = `-- name: GetMessageBoxesForForward :many
|
|
WITH requested AS (
|
|
SELECT
|
|
id::int AS box_id,
|
|
ord::int AS ord
|
|
FROM unnest($4::int[]) WITH ORDINALITY AS r(id, ord)
|
|
)
|
|
SELECT
|
|
r.ord,
|
|
m.box_id,
|
|
m.private_message_id,
|
|
m.owner_user_id,
|
|
m.message_sender_id,
|
|
m.peer_type,
|
|
m.peer_id,
|
|
m.from_user_id,
|
|
m.message_date,
|
|
m.edit_date,
|
|
m.outgoing,
|
|
m.body,
|
|
m.entities::text AS entities_json,
|
|
m.silent,
|
|
m.noforwards,
|
|
m.reply_to_msg_id,
|
|
m.reply_to_peer_type,
|
|
m.reply_to_peer_id,
|
|
m.reply_to_top_id,
|
|
m.quote_text,
|
|
m.quote_entities::text AS quote_entities_json,
|
|
m.quote_offset,
|
|
m.fwd_from_peer_type,
|
|
m.fwd_from_peer_id,
|
|
m.fwd_from_name,
|
|
m.fwd_date,
|
|
m.pts,
|
|
m.media::text AS media_json
|
|
FROM requested r
|
|
JOIN message_boxes m
|
|
ON m.owner_user_id = $1::bigint
|
|
AND m.peer_type = $2::text
|
|
AND m.peer_id = $3::bigint
|
|
AND m.box_id = r.box_id
|
|
AND NOT m.deleted
|
|
ORDER BY r.ord ASC
|
|
`
|
|
|
|
type GetMessageBoxesForForwardParams struct {
|
|
OwnerUserID int64
|
|
PeerType string
|
|
PeerID int64
|
|
BoxIds []int32
|
|
}
|
|
|
|
type GetMessageBoxesForForwardRow struct {
|
|
Ord int32
|
|
BoxID int32
|
|
PrivateMessageID int64
|
|
OwnerUserID int64
|
|
MessageSenderID int64
|
|
PeerType string
|
|
PeerID int64
|
|
FromUserID int64
|
|
MessageDate int32
|
|
EditDate int32
|
|
Outgoing bool
|
|
Body string
|
|
EntitiesJson string
|
|
Silent bool
|
|
Noforwards bool
|
|
ReplyToMsgID int32
|
|
ReplyToPeerType string
|
|
ReplyToPeerID int64
|
|
ReplyToTopID int32
|
|
QuoteText string
|
|
QuoteEntitiesJson string
|
|
QuoteOffset int32
|
|
FwdFromPeerType string
|
|
FwdFromPeerID int64
|
|
FwdFromName string
|
|
FwdDate int32
|
|
Pts int32
|
|
MediaJson string
|
|
}
|
|
|
|
func (q *Queries) GetMessageBoxesForForward(ctx context.Context, arg GetMessageBoxesForForwardParams) ([]GetMessageBoxesForForwardRow, error) {
|
|
rows, err := q.db.Query(ctx, getMessageBoxesForForward,
|
|
arg.OwnerUserID,
|
|
arg.PeerType,
|
|
arg.PeerID,
|
|
arg.BoxIds,
|
|
)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
var items []GetMessageBoxesForForwardRow
|
|
for rows.Next() {
|
|
var i GetMessageBoxesForForwardRow
|
|
if err := rows.Scan(
|
|
&i.Ord,
|
|
&i.BoxID,
|
|
&i.PrivateMessageID,
|
|
&i.OwnerUserID,
|
|
&i.MessageSenderID,
|
|
&i.PeerType,
|
|
&i.PeerID,
|
|
&i.FromUserID,
|
|
&i.MessageDate,
|
|
&i.EditDate,
|
|
&i.Outgoing,
|
|
&i.Body,
|
|
&i.EntitiesJson,
|
|
&i.Silent,
|
|
&i.Noforwards,
|
|
&i.ReplyToMsgID,
|
|
&i.ReplyToPeerType,
|
|
&i.ReplyToPeerID,
|
|
&i.ReplyToTopID,
|
|
&i.QuoteText,
|
|
&i.QuoteEntitiesJson,
|
|
&i.QuoteOffset,
|
|
&i.FwdFromPeerType,
|
|
&i.FwdFromPeerID,
|
|
&i.FwdFromName,
|
|
&i.FwdDate,
|
|
&i.Pts,
|
|
&i.MediaJson,
|
|
); err != nil {
|
|
return nil, err
|
|
}
|
|
items = append(items, i)
|
|
}
|
|
if err := rows.Err(); err != nil {
|
|
return nil, err
|
|
}
|
|
return items, nil
|
|
}
|
|
|
|
const getOutboxMessageForReadDate = `-- name: GetOutboxMessageForReadDate :one
|
|
SELECT box_id
|
|
FROM message_boxes
|
|
WHERE owner_user_id = $1::bigint
|
|
AND peer_type = $2::text
|
|
AND peer_id = $3::bigint
|
|
AND box_id = $4::int
|
|
AND outgoing
|
|
AND NOT deleted
|
|
LIMIT 1
|
|
`
|
|
|
|
type GetOutboxMessageForReadDateParams struct {
|
|
OwnerUserID int64
|
|
PeerType string
|
|
PeerID int64
|
|
BoxID int32
|
|
}
|
|
|
|
func (q *Queries) GetOutboxMessageForReadDate(ctx context.Context, arg GetOutboxMessageForReadDateParams) (int32, error) {
|
|
row := q.db.QueryRow(ctx, getOutboxMessageForReadDate,
|
|
arg.OwnerUserID,
|
|
arg.PeerType,
|
|
arg.PeerID,
|
|
arg.BoxID,
|
|
)
|
|
var box_id int32
|
|
err := row.Scan(&box_id)
|
|
return box_id, err
|
|
}
|
|
|
|
const getOutboxReadDate = `-- name: GetOutboxReadDate :one
|
|
SELECT COALESCE(MIN(date), 0)::int AS read_date
|
|
FROM user_update_events
|
|
WHERE user_id = $1::bigint
|
|
AND event_type = 'read_history_outbox'
|
|
AND peer_type = $2::text
|
|
AND peer_id = $3::bigint
|
|
AND max_id >= $4::int
|
|
`
|
|
|
|
type GetOutboxReadDateParams struct {
|
|
UserID int64
|
|
PeerType string
|
|
PeerID int64
|
|
MessageID int32
|
|
}
|
|
|
|
func (q *Queries) GetOutboxReadDate(ctx context.Context, arg GetOutboxReadDateParams) (int32, error) {
|
|
row := q.db.QueryRow(ctx, getOutboxReadDate,
|
|
arg.UserID,
|
|
arg.PeerType,
|
|
arg.PeerID,
|
|
arg.MessageID,
|
|
)
|
|
var read_date int32
|
|
err := row.Scan(&read_date)
|
|
return read_date, err
|
|
}
|
|
|
|
const getPrivateMessageByRandomID = `-- name: GetPrivateMessageByRandomID :one
|
|
SELECT
|
|
id,
|
|
sender_user_id,
|
|
recipient_user_id,
|
|
random_id,
|
|
message_date,
|
|
edit_date,
|
|
body,
|
|
entities::text AS entities_json
|
|
FROM private_messages
|
|
WHERE sender_user_id = $1
|
|
AND random_id = $2
|
|
AND random_id <> 0
|
|
`
|
|
|
|
type GetPrivateMessageByRandomIDParams struct {
|
|
SenderUserID int64
|
|
RandomID int64
|
|
}
|
|
|
|
type GetPrivateMessageByRandomIDRow struct {
|
|
ID int64
|
|
SenderUserID int64
|
|
RecipientUserID int64
|
|
RandomID int64
|
|
MessageDate int32
|
|
EditDate int32
|
|
Body string
|
|
EntitiesJson string
|
|
}
|
|
|
|
func (q *Queries) GetPrivateMessageByRandomID(ctx context.Context, arg GetPrivateMessageByRandomIDParams) (GetPrivateMessageByRandomIDRow, error) {
|
|
row := q.db.QueryRow(ctx, getPrivateMessageByRandomID, arg.SenderUserID, arg.RandomID)
|
|
var i GetPrivateMessageByRandomIDRow
|
|
err := row.Scan(
|
|
&i.ID,
|
|
&i.SenderUserID,
|
|
&i.RecipientUserID,
|
|
&i.RandomID,
|
|
&i.MessageDate,
|
|
&i.EditDate,
|
|
&i.Body,
|
|
&i.EntitiesJson,
|
|
)
|
|
return i, err
|
|
}
|
|
|
|
const hasDeletableMessageBoxByPeer = `-- name: HasDeletableMessageBoxByPeer :one
|
|
SELECT EXISTS (
|
|
SELECT 1
|
|
FROM message_boxes m
|
|
WHERE m.owner_user_id = $1::bigint
|
|
AND m.peer_type = $2::text
|
|
AND m.peer_id = $3::bigint
|
|
AND ($4::int <= 0 OR m.box_id <= $4::int)
|
|
AND NOT m.deleted
|
|
LIMIT 1
|
|
)::boolean AS more
|
|
`
|
|
|
|
type HasDeletableMessageBoxByPeerParams struct {
|
|
OwnerUserID int64
|
|
PeerType string
|
|
PeerID int64
|
|
MaxID int32
|
|
}
|
|
|
|
func (q *Queries) HasDeletableMessageBoxByPeer(ctx context.Context, arg HasDeletableMessageBoxByPeerParams) (bool, error) {
|
|
row := q.db.QueryRow(ctx, hasDeletableMessageBoxByPeer,
|
|
arg.OwnerUserID,
|
|
arg.PeerType,
|
|
arg.PeerID,
|
|
arg.MaxID,
|
|
)
|
|
var more bool
|
|
err := row.Scan(&more)
|
|
return more, err
|
|
}
|
|
|
|
const latestIncomingReadReceiptCandidate = `-- name: LatestIncomingReadReceiptCandidate :one
|
|
SELECT
|
|
m.message_sender_id,
|
|
m.private_message_id,
|
|
sender_box.owner_user_id AS sender_owner_user_id,
|
|
sender_box.box_id AS sender_box_id
|
|
FROM message_boxes m
|
|
JOIN message_boxes sender_box
|
|
ON sender_box.message_sender_id = m.message_sender_id
|
|
AND sender_box.private_message_id = m.private_message_id
|
|
AND sender_box.owner_user_id = m.message_sender_id
|
|
AND sender_box.outgoing
|
|
AND NOT sender_box.deleted
|
|
WHERE m.owner_user_id = $1::bigint
|
|
AND m.peer_type = $2::text
|
|
AND m.peer_id = $3::bigint
|
|
AND NOT m.outgoing
|
|
AND NOT m.deleted
|
|
AND m.box_id > $4::int
|
|
AND m.box_id <= $5::int
|
|
ORDER BY m.box_id DESC
|
|
LIMIT 1
|
|
`
|
|
|
|
type LatestIncomingReadReceiptCandidateParams struct {
|
|
OwnerUserID int64
|
|
PeerType string
|
|
PeerID int64
|
|
OldReadInboxMaxID int32
|
|
NewReadInboxMaxID int32
|
|
}
|
|
|
|
type LatestIncomingReadReceiptCandidateRow struct {
|
|
MessageSenderID int64
|
|
PrivateMessageID int64
|
|
SenderOwnerUserID int64
|
|
SenderBoxID int32
|
|
}
|
|
|
|
func (q *Queries) LatestIncomingReadReceiptCandidate(ctx context.Context, arg LatestIncomingReadReceiptCandidateParams) (LatestIncomingReadReceiptCandidateRow, error) {
|
|
row := q.db.QueryRow(ctx, latestIncomingReadReceiptCandidate,
|
|
arg.OwnerUserID,
|
|
arg.PeerType,
|
|
arg.PeerID,
|
|
arg.OldReadInboxMaxID,
|
|
arg.NewReadInboxMaxID,
|
|
)
|
|
var i LatestIncomingReadReceiptCandidateRow
|
|
err := row.Scan(
|
|
&i.MessageSenderID,
|
|
&i.PrivateMessageID,
|
|
&i.SenderOwnerUserID,
|
|
&i.SenderBoxID,
|
|
)
|
|
return i, err
|
|
}
|
|
|
|
const listMessagesByUser = `-- name: ListMessagesByUser :many
|
|
WITH load_params AS (
|
|
SELECT
|
|
$2::int AS offset_id,
|
|
$3::int AS offset_date,
|
|
$4::int AS add_offset,
|
|
$5::int AS limit_count,
|
|
CASE
|
|
WHEN $4::int >= 0 THEN 'backward'
|
|
WHEN $4::int + $5::int > 0 THEN 'around'
|
|
ELSE 'forward'
|
|
END::text AS load_type
|
|
),
|
|
base AS NOT MATERIALIZED (
|
|
SELECT
|
|
m.box_id,
|
|
m.private_message_id,
|
|
m.owner_user_id,
|
|
m.peer_type,
|
|
m.peer_id,
|
|
m.from_user_id,
|
|
m.message_date,
|
|
m.edit_date,
|
|
m.outgoing,
|
|
m.body,
|
|
m.entities::text AS entities_json,
|
|
m.silent,
|
|
m.noforwards,
|
|
m.reply_to_msg_id,
|
|
m.reply_to_peer_type,
|
|
m.reply_to_peer_id,
|
|
m.reply_to_top_id,
|
|
m.quote_text,
|
|
m.quote_entities::text AS quote_entities_json,
|
|
m.quote_offset,
|
|
m.fwd_from_peer_type,
|
|
m.fwd_from_peer_id,
|
|
m.fwd_from_name,
|
|
m.fwd_date,
|
|
m.pts,
|
|
m.media::text AS media_json,
|
|
COALESCE(peer_u.id, 0)::bigint AS peer_user_id,
|
|
COALESCE(peer_u.access_hash, 0)::bigint AS peer_access_hash,
|
|
COALESCE(peer_u.phone, '')::text AS peer_phone,
|
|
COALESCE(peer_u.first_name, '')::text AS peer_first_name,
|
|
COALESCE(peer_u.last_name, '')::text AS peer_last_name,
|
|
COALESCE(peer_u.username, '')::text AS peer_username,
|
|
COALESCE(peer_u.country_code, '')::text AS peer_country_code,
|
|
COALESCE(peer_u.verified, false)::boolean AS peer_verified,
|
|
COALESCE(peer_u.support, false)::boolean AS peer_support,
|
|
COALESCE(peer_u.last_seen_at, 0)::bigint AS peer_last_seen_at,
|
|
COALESCE(from_u.id, 0)::bigint AS from_user_user_id,
|
|
COALESCE(from_u.access_hash, 0)::bigint AS from_user_access_hash,
|
|
COALESCE(from_u.phone, '')::text AS from_user_phone,
|
|
COALESCE(from_u.first_name, '')::text AS from_user_first_name,
|
|
COALESCE(from_u.last_name, '')::text AS from_user_last_name,
|
|
COALESCE(from_u.username, '')::text AS from_user_username,
|
|
COALESCE(from_u.country_code, '')::text AS from_user_country_code,
|
|
COALESCE(from_u.verified, false)::boolean AS from_user_verified,
|
|
COALESCE(from_u.support, false)::boolean AS from_user_support,
|
|
COALESCE(from_u.last_seen_at, 0)::bigint AS from_user_last_seen_at
|
|
FROM message_boxes m
|
|
LEFT JOIN users peer_u ON m.peer_type = 'user' AND peer_u.id = m.peer_id
|
|
LEFT JOIN users from_u ON from_u.id = m.from_user_id
|
|
WHERE m.owner_user_id = $1
|
|
AND NOT m.deleted
|
|
AND (
|
|
NOT $6::boolean
|
|
OR (m.peer_type = $7::text AND m.peer_id = $8::bigint)
|
|
)
|
|
AND (
|
|
$9::text = ''
|
|
OR m.body ILIKE ('%' || $9::text || '%')
|
|
)
|
|
AND ($10::int <= 0 OR m.box_id < $10::int)
|
|
AND ($11::int <= 0 OR m.box_id > $11::int)
|
|
),
|
|
total AS (
|
|
SELECT count(*)::int AS total_count
|
|
FROM base
|
|
WHERE $12::boolean
|
|
),
|
|
backward AS (
|
|
SELECT b.box_id, b.private_message_id, b.owner_user_id, b.peer_type, b.peer_id, b.from_user_id, b.message_date, b.edit_date, b.outgoing, b.body, b.entities_json, b.silent, b.noforwards, b.reply_to_msg_id, b.reply_to_peer_type, b.reply_to_peer_id, b.reply_to_top_id, b.quote_text, b.quote_entities_json, b.quote_offset, b.fwd_from_peer_type, b.fwd_from_peer_id, b.fwd_from_name, b.fwd_date, b.pts, b.media_json, b.peer_user_id, b.peer_access_hash, b.peer_phone, b.peer_first_name, b.peer_last_name, b.peer_username, b.peer_country_code, b.peer_verified, b.peer_support, b.peer_last_seen_at, b.from_user_user_id, b.from_user_access_hash, b.from_user_phone, b.from_user_first_name, b.from_user_last_name, b.from_user_username, b.from_user_country_code, b.from_user_verified, b.from_user_support, b.from_user_last_seen_at
|
|
FROM base b
|
|
CROSS JOIN load_params p
|
|
WHERE p.load_type = 'backward'
|
|
AND (
|
|
(p.offset_date > 0 AND b.message_date < p.offset_date)
|
|
OR (p.offset_date <= 0 AND (p.offset_id <= 0 OR b.box_id < p.offset_id))
|
|
)
|
|
ORDER BY b.box_id DESC
|
|
OFFSET GREATEST((SELECT add_offset FROM load_params), 0)
|
|
LIMIT (SELECT limit_count FROM load_params)
|
|
),
|
|
around_forward AS (
|
|
SELECT f.box_id, f.private_message_id, f.owner_user_id, f.peer_type, f.peer_id, f.from_user_id, f.message_date, f.edit_date, f.outgoing, f.body, f.entities_json, f.silent, f.noforwards, f.reply_to_msg_id, f.reply_to_peer_type, f.reply_to_peer_id, f.reply_to_top_id, f.quote_text, f.quote_entities_json, f.quote_offset, f.fwd_from_peer_type, f.fwd_from_peer_id, f.fwd_from_name, f.fwd_date, f.pts, f.media_json, f.peer_user_id, f.peer_access_hash, f.peer_phone, f.peer_first_name, f.peer_last_name, f.peer_username, f.peer_country_code, f.peer_verified, f.peer_support, f.peer_last_seen_at, f.from_user_user_id, f.from_user_access_hash, f.from_user_phone, f.from_user_first_name, f.from_user_last_name, f.from_user_username, f.from_user_country_code, f.from_user_verified, f.from_user_support, f.from_user_last_seen_at
|
|
FROM (
|
|
SELECT b.box_id, b.private_message_id, b.owner_user_id, b.peer_type, b.peer_id, b.from_user_id, b.message_date, b.edit_date, b.outgoing, b.body, b.entities_json, b.silent, b.noforwards, b.reply_to_msg_id, b.reply_to_peer_type, b.reply_to_peer_id, b.reply_to_top_id, b.quote_text, b.quote_entities_json, b.quote_offset, b.fwd_from_peer_type, b.fwd_from_peer_id, b.fwd_from_name, b.fwd_date, b.pts, b.media_json, b.peer_user_id, b.peer_access_hash, b.peer_phone, b.peer_first_name, b.peer_last_name, b.peer_username, b.peer_country_code, b.peer_verified, b.peer_support, b.peer_last_seen_at, b.from_user_user_id, b.from_user_access_hash, b.from_user_phone, b.from_user_first_name, b.from_user_last_name, b.from_user_username, b.from_user_country_code, b.from_user_verified, b.from_user_support, b.from_user_last_seen_at
|
|
FROM base b
|
|
CROSS JOIN load_params p
|
|
WHERE p.load_type = 'around'
|
|
AND (
|
|
(p.offset_date > 0 AND b.message_date >= p.offset_date)
|
|
OR (p.offset_date <= 0 AND p.offset_id > 0 AND b.box_id > p.offset_id)
|
|
)
|
|
ORDER BY b.box_id ASC
|
|
LIMIT LEAST(-(SELECT add_offset FROM load_params), (SELECT limit_count FROM load_params))
|
|
) f
|
|
),
|
|
around_backward AS (
|
|
SELECT b.box_id, b.private_message_id, b.owner_user_id, b.peer_type, b.peer_id, b.from_user_id, b.message_date, b.edit_date, b.outgoing, b.body, b.entities_json, b.silent, b.noforwards, b.reply_to_msg_id, b.reply_to_peer_type, b.reply_to_peer_id, b.reply_to_top_id, b.quote_text, b.quote_entities_json, b.quote_offset, b.fwd_from_peer_type, b.fwd_from_peer_id, b.fwd_from_name, b.fwd_date, b.pts, b.media_json, b.peer_user_id, b.peer_access_hash, b.peer_phone, b.peer_first_name, b.peer_last_name, b.peer_username, b.peer_country_code, b.peer_verified, b.peer_support, b.peer_last_seen_at, b.from_user_user_id, b.from_user_access_hash, b.from_user_phone, b.from_user_first_name, b.from_user_last_name, b.from_user_username, b.from_user_country_code, b.from_user_verified, b.from_user_support, b.from_user_last_seen_at
|
|
FROM base b
|
|
CROSS JOIN load_params p
|
|
WHERE p.load_type = 'around'
|
|
AND (
|
|
(p.offset_date > 0 AND b.message_date < p.offset_date)
|
|
OR (p.offset_date <= 0 AND (p.offset_id <= 0 OR b.box_id <= p.offset_id))
|
|
)
|
|
ORDER BY b.box_id DESC
|
|
LIMIT GREATEST((SELECT limit_count + add_offset FROM load_params), 0)
|
|
),
|
|
forward AS (
|
|
SELECT f.box_id, f.private_message_id, f.owner_user_id, f.peer_type, f.peer_id, f.from_user_id, f.message_date, f.edit_date, f.outgoing, f.body, f.entities_json, f.silent, f.noforwards, f.reply_to_msg_id, f.reply_to_peer_type, f.reply_to_peer_id, f.reply_to_top_id, f.quote_text, f.quote_entities_json, f.quote_offset, f.fwd_from_peer_type, f.fwd_from_peer_id, f.fwd_from_name, f.fwd_date, f.pts, f.media_json, f.peer_user_id, f.peer_access_hash, f.peer_phone, f.peer_first_name, f.peer_last_name, f.peer_username, f.peer_country_code, f.peer_verified, f.peer_support, f.peer_last_seen_at, f.from_user_user_id, f.from_user_access_hash, f.from_user_phone, f.from_user_first_name, f.from_user_last_name, f.from_user_username, f.from_user_country_code, f.from_user_verified, f.from_user_support, f.from_user_last_seen_at
|
|
FROM (
|
|
SELECT b.box_id, b.private_message_id, b.owner_user_id, b.peer_type, b.peer_id, b.from_user_id, b.message_date, b.edit_date, b.outgoing, b.body, b.entities_json, b.silent, b.noforwards, b.reply_to_msg_id, b.reply_to_peer_type, b.reply_to_peer_id, b.reply_to_top_id, b.quote_text, b.quote_entities_json, b.quote_offset, b.fwd_from_peer_type, b.fwd_from_peer_id, b.fwd_from_name, b.fwd_date, b.pts, b.media_json, b.peer_user_id, b.peer_access_hash, b.peer_phone, b.peer_first_name, b.peer_last_name, b.peer_username, b.peer_country_code, b.peer_verified, b.peer_support, b.peer_last_seen_at, b.from_user_user_id, b.from_user_access_hash, b.from_user_phone, b.from_user_first_name, b.from_user_last_name, b.from_user_username, b.from_user_country_code, b.from_user_verified, b.from_user_support, b.from_user_last_seen_at
|
|
FROM base b
|
|
CROSS JOIN load_params p
|
|
WHERE p.load_type = 'forward'
|
|
AND (
|
|
(p.offset_date > 0 AND b.message_date >= p.offset_date)
|
|
OR (p.offset_date <= 0 AND p.offset_id > 0 AND b.box_id > p.offset_id)
|
|
)
|
|
ORDER BY b.box_id ASC
|
|
LIMIT (SELECT limit_count FROM load_params)
|
|
) f
|
|
),
|
|
paged AS (
|
|
SELECT box_id, private_message_id, owner_user_id, peer_type, peer_id, from_user_id, message_date, edit_date, outgoing, body, entities_json, silent, noforwards, reply_to_msg_id, reply_to_peer_type, reply_to_peer_id, reply_to_top_id, quote_text, quote_entities_json, quote_offset, fwd_from_peer_type, fwd_from_peer_id, fwd_from_name, fwd_date, pts, media_json, peer_user_id, peer_access_hash, peer_phone, peer_first_name, peer_last_name, peer_username, peer_country_code, peer_verified, peer_support, peer_last_seen_at, from_user_user_id, from_user_access_hash, from_user_phone, from_user_first_name, from_user_last_name, from_user_username, from_user_country_code, from_user_verified, from_user_support, from_user_last_seen_at FROM backward
|
|
UNION ALL
|
|
SELECT box_id, private_message_id, owner_user_id, peer_type, peer_id, from_user_id, message_date, edit_date, outgoing, body, entities_json, silent, noforwards, reply_to_msg_id, reply_to_peer_type, reply_to_peer_id, reply_to_top_id, quote_text, quote_entities_json, quote_offset, fwd_from_peer_type, fwd_from_peer_id, fwd_from_name, fwd_date, pts, media_json, peer_user_id, peer_access_hash, peer_phone, peer_first_name, peer_last_name, peer_username, peer_country_code, peer_verified, peer_support, peer_last_seen_at, from_user_user_id, from_user_access_hash, from_user_phone, from_user_first_name, from_user_last_name, from_user_username, from_user_country_code, from_user_verified, from_user_support, from_user_last_seen_at FROM around_forward
|
|
UNION ALL
|
|
SELECT box_id, private_message_id, owner_user_id, peer_type, peer_id, from_user_id, message_date, edit_date, outgoing, body, entities_json, silent, noforwards, reply_to_msg_id, reply_to_peer_type, reply_to_peer_id, reply_to_top_id, quote_text, quote_entities_json, quote_offset, fwd_from_peer_type, fwd_from_peer_id, fwd_from_name, fwd_date, pts, media_json, peer_user_id, peer_access_hash, peer_phone, peer_first_name, peer_last_name, peer_username, peer_country_code, peer_verified, peer_support, peer_last_seen_at, from_user_user_id, from_user_access_hash, from_user_phone, from_user_first_name, from_user_last_name, from_user_username, from_user_country_code, from_user_verified, from_user_support, from_user_last_seen_at FROM around_backward
|
|
UNION ALL
|
|
SELECT box_id, private_message_id, owner_user_id, peer_type, peer_id, from_user_id, message_date, edit_date, outgoing, body, entities_json, silent, noforwards, reply_to_msg_id, reply_to_peer_type, reply_to_peer_id, reply_to_top_id, quote_text, quote_entities_json, quote_offset, fwd_from_peer_type, fwd_from_peer_id, fwd_from_name, fwd_date, pts, media_json, peer_user_id, peer_access_hash, peer_phone, peer_first_name, peer_last_name, peer_username, peer_country_code, peer_verified, peer_support, peer_last_seen_at, from_user_user_id, from_user_access_hash, from_user_phone, from_user_first_name, from_user_last_name, from_user_username, from_user_country_code, from_user_verified, from_user_support, from_user_last_seen_at FROM forward
|
|
)
|
|
SELECT
|
|
box_id,
|
|
private_message_id,
|
|
owner_user_id,
|
|
peer_type,
|
|
peer_id,
|
|
from_user_id,
|
|
message_date,
|
|
edit_date,
|
|
outgoing,
|
|
body,
|
|
entities_json,
|
|
silent,
|
|
noforwards,
|
|
reply_to_msg_id,
|
|
reply_to_peer_type,
|
|
reply_to_peer_id,
|
|
reply_to_top_id,
|
|
quote_text,
|
|
quote_entities_json,
|
|
quote_offset,
|
|
fwd_from_peer_type,
|
|
fwd_from_peer_id,
|
|
fwd_from_name,
|
|
fwd_date,
|
|
pts,
|
|
media_json,
|
|
peer_user_id,
|
|
peer_access_hash,
|
|
peer_phone,
|
|
peer_first_name,
|
|
peer_last_name,
|
|
peer_username,
|
|
peer_country_code,
|
|
peer_verified,
|
|
peer_support,
|
|
peer_last_seen_at,
|
|
from_user_user_id,
|
|
from_user_access_hash,
|
|
from_user_phone,
|
|
from_user_first_name,
|
|
from_user_last_name,
|
|
from_user_username,
|
|
from_user_country_code,
|
|
from_user_verified,
|
|
from_user_support,
|
|
from_user_last_seen_at,
|
|
COALESCE(total.total_count, 0)::int AS total_count
|
|
FROM paged
|
|
CROSS JOIN total
|
|
ORDER BY box_id DESC
|
|
`
|
|
|
|
type ListMessagesByUserParams struct {
|
|
OwnerUserID int64
|
|
OffsetID int32
|
|
OffsetDate int32
|
|
AddOffset int32
|
|
LimitCount int32
|
|
HasPeer bool
|
|
PeerType string
|
|
PeerID int64
|
|
Query string
|
|
MaxID int32
|
|
MinID int32
|
|
NeedTotalCount bool
|
|
}
|
|
|
|
type ListMessagesByUserRow struct {
|
|
BoxID int32
|
|
PrivateMessageID int64
|
|
OwnerUserID int64
|
|
PeerType string
|
|
PeerID int64
|
|
FromUserID int64
|
|
MessageDate int32
|
|
EditDate int32
|
|
Outgoing bool
|
|
Body string
|
|
EntitiesJson string
|
|
Silent bool
|
|
Noforwards bool
|
|
ReplyToMsgID int32
|
|
ReplyToPeerType string
|
|
ReplyToPeerID int64
|
|
ReplyToTopID int32
|
|
QuoteText string
|
|
QuoteEntitiesJson string
|
|
QuoteOffset int32
|
|
FwdFromPeerType string
|
|
FwdFromPeerID int64
|
|
FwdFromName string
|
|
FwdDate int32
|
|
Pts int32
|
|
MediaJson string
|
|
PeerUserID int64
|
|
PeerAccessHash int64
|
|
PeerPhone string
|
|
PeerFirstName string
|
|
PeerLastName string
|
|
PeerUsername string
|
|
PeerCountryCode string
|
|
PeerVerified bool
|
|
PeerSupport bool
|
|
PeerLastSeenAt int64
|
|
FromUserUserID int64
|
|
FromUserAccessHash int64
|
|
FromUserPhone string
|
|
FromUserFirstName string
|
|
FromUserLastName string
|
|
FromUserUsername string
|
|
FromUserCountryCode string
|
|
FromUserVerified bool
|
|
FromUserSupport bool
|
|
FromUserLastSeenAt int64
|
|
TotalCount int32
|
|
}
|
|
|
|
func (q *Queries) ListMessagesByUser(ctx context.Context, arg ListMessagesByUserParams) ([]ListMessagesByUserRow, error) {
|
|
rows, err := q.db.Query(ctx, listMessagesByUser,
|
|
arg.OwnerUserID,
|
|
arg.OffsetID,
|
|
arg.OffsetDate,
|
|
arg.AddOffset,
|
|
arg.LimitCount,
|
|
arg.HasPeer,
|
|
arg.PeerType,
|
|
arg.PeerID,
|
|
arg.Query,
|
|
arg.MaxID,
|
|
arg.MinID,
|
|
arg.NeedTotalCount,
|
|
)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
var items []ListMessagesByUserRow
|
|
for rows.Next() {
|
|
var i ListMessagesByUserRow
|
|
if err := rows.Scan(
|
|
&i.BoxID,
|
|
&i.PrivateMessageID,
|
|
&i.OwnerUserID,
|
|
&i.PeerType,
|
|
&i.PeerID,
|
|
&i.FromUserID,
|
|
&i.MessageDate,
|
|
&i.EditDate,
|
|
&i.Outgoing,
|
|
&i.Body,
|
|
&i.EntitiesJson,
|
|
&i.Silent,
|
|
&i.Noforwards,
|
|
&i.ReplyToMsgID,
|
|
&i.ReplyToPeerType,
|
|
&i.ReplyToPeerID,
|
|
&i.ReplyToTopID,
|
|
&i.QuoteText,
|
|
&i.QuoteEntitiesJson,
|
|
&i.QuoteOffset,
|
|
&i.FwdFromPeerType,
|
|
&i.FwdFromPeerID,
|
|
&i.FwdFromName,
|
|
&i.FwdDate,
|
|
&i.Pts,
|
|
&i.MediaJson,
|
|
&i.PeerUserID,
|
|
&i.PeerAccessHash,
|
|
&i.PeerPhone,
|
|
&i.PeerFirstName,
|
|
&i.PeerLastName,
|
|
&i.PeerUsername,
|
|
&i.PeerCountryCode,
|
|
&i.PeerVerified,
|
|
&i.PeerSupport,
|
|
&i.PeerLastSeenAt,
|
|
&i.FromUserUserID,
|
|
&i.FromUserAccessHash,
|
|
&i.FromUserPhone,
|
|
&i.FromUserFirstName,
|
|
&i.FromUserLastName,
|
|
&i.FromUserUsername,
|
|
&i.FromUserCountryCode,
|
|
&i.FromUserVerified,
|
|
&i.FromUserSupport,
|
|
&i.FromUserLastSeenAt,
|
|
&i.TotalCount,
|
|
); err != nil {
|
|
return nil, err
|
|
}
|
|
items = append(items, i)
|
|
}
|
|
if err := rows.Err(); err != nil {
|
|
return nil, err
|
|
}
|
|
return items, nil
|
|
}
|
|
|
|
const listVisibleMessageBoxesByPrivateMessage = `-- name: ListVisibleMessageBoxesByPrivateMessage :many
|
|
SELECT
|
|
box_id,
|
|
private_message_id,
|
|
owner_user_id,
|
|
message_sender_id,
|
|
peer_type,
|
|
peer_id,
|
|
from_user_id,
|
|
message_date,
|
|
edit_date,
|
|
outgoing,
|
|
body,
|
|
entities::text AS entities_json,
|
|
silent,
|
|
noforwards,
|
|
reply_to_msg_id,
|
|
reply_to_peer_type,
|
|
reply_to_peer_id,
|
|
reply_to_top_id,
|
|
quote_text,
|
|
quote_entities::text AS quote_entities_json,
|
|
quote_offset,
|
|
fwd_from_peer_type,
|
|
fwd_from_peer_id,
|
|
fwd_from_name,
|
|
fwd_date,
|
|
pts,
|
|
media::text AS media_json
|
|
FROM message_boxes
|
|
WHERE message_sender_id = $1::bigint
|
|
AND private_message_id = $2::bigint
|
|
AND NOT deleted
|
|
ORDER BY owner_user_id ASC, box_id ASC
|
|
FOR UPDATE
|
|
`
|
|
|
|
type ListVisibleMessageBoxesByPrivateMessageParams struct {
|
|
MessageSenderID int64
|
|
PrivateMessageID int64
|
|
}
|
|
|
|
type ListVisibleMessageBoxesByPrivateMessageRow struct {
|
|
BoxID int32
|
|
PrivateMessageID int64
|
|
OwnerUserID int64
|
|
MessageSenderID int64
|
|
PeerType string
|
|
PeerID int64
|
|
FromUserID int64
|
|
MessageDate int32
|
|
EditDate int32
|
|
Outgoing bool
|
|
Body string
|
|
EntitiesJson string
|
|
Silent bool
|
|
Noforwards bool
|
|
ReplyToMsgID int32
|
|
ReplyToPeerType string
|
|
ReplyToPeerID int64
|
|
ReplyToTopID int32
|
|
QuoteText string
|
|
QuoteEntitiesJson string
|
|
QuoteOffset int32
|
|
FwdFromPeerType string
|
|
FwdFromPeerID int64
|
|
FwdFromName string
|
|
FwdDate int32
|
|
Pts int32
|
|
MediaJson string
|
|
}
|
|
|
|
func (q *Queries) ListVisibleMessageBoxesByPrivateMessage(ctx context.Context, arg ListVisibleMessageBoxesByPrivateMessageParams) ([]ListVisibleMessageBoxesByPrivateMessageRow, error) {
|
|
rows, err := q.db.Query(ctx, listVisibleMessageBoxesByPrivateMessage, arg.MessageSenderID, arg.PrivateMessageID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
var items []ListVisibleMessageBoxesByPrivateMessageRow
|
|
for rows.Next() {
|
|
var i ListVisibleMessageBoxesByPrivateMessageRow
|
|
if err := rows.Scan(
|
|
&i.BoxID,
|
|
&i.PrivateMessageID,
|
|
&i.OwnerUserID,
|
|
&i.MessageSenderID,
|
|
&i.PeerType,
|
|
&i.PeerID,
|
|
&i.FromUserID,
|
|
&i.MessageDate,
|
|
&i.EditDate,
|
|
&i.Outgoing,
|
|
&i.Body,
|
|
&i.EntitiesJson,
|
|
&i.Silent,
|
|
&i.Noforwards,
|
|
&i.ReplyToMsgID,
|
|
&i.ReplyToPeerType,
|
|
&i.ReplyToPeerID,
|
|
&i.ReplyToTopID,
|
|
&i.QuoteText,
|
|
&i.QuoteEntitiesJson,
|
|
&i.QuoteOffset,
|
|
&i.FwdFromPeerType,
|
|
&i.FwdFromPeerID,
|
|
&i.FwdFromName,
|
|
&i.FwdDate,
|
|
&i.Pts,
|
|
&i.MediaJson,
|
|
); err != nil {
|
|
return nil, err
|
|
}
|
|
items = append(items, i)
|
|
}
|
|
if err := rows.Err(); err != nil {
|
|
return nil, err
|
|
}
|
|
return items, nil
|
|
}
|
|
|
|
const maxMessageBoxID = `-- name: MaxMessageBoxID :one
|
|
SELECT COALESCE(MAX(box_id), 0)::int AS max_box_id
|
|
FROM message_boxes
|
|
WHERE owner_user_id = $1
|
|
`
|
|
|
|
func (q *Queries) MaxMessageBoxID(ctx context.Context, ownerUserID int64) (int32, error) {
|
|
row := q.db.QueryRow(ctx, maxMessageBoxID, ownerUserID)
|
|
var max_box_id int32
|
|
err := row.Scan(&max_box_id)
|
|
return max_box_id, err
|
|
}
|
|
|
|
const topVisibleMessageBoxByPeer = `-- name: TopVisibleMessageBoxByPeer :one
|
|
SELECT
|
|
box_id,
|
|
message_date
|
|
FROM message_boxes
|
|
WHERE owner_user_id = $1
|
|
AND peer_type = $2
|
|
AND peer_id = $3
|
|
AND NOT deleted
|
|
ORDER BY box_id DESC
|
|
LIMIT 1
|
|
`
|
|
|
|
type TopVisibleMessageBoxByPeerParams struct {
|
|
OwnerUserID int64
|
|
PeerType string
|
|
PeerID int64
|
|
}
|
|
|
|
type TopVisibleMessageBoxByPeerRow struct {
|
|
BoxID int32
|
|
MessageDate int32
|
|
}
|
|
|
|
func (q *Queries) TopVisibleMessageBoxByPeer(ctx context.Context, arg TopVisibleMessageBoxByPeerParams) (TopVisibleMessageBoxByPeerRow, error) {
|
|
row := q.db.QueryRow(ctx, topVisibleMessageBoxByPeer, arg.OwnerUserID, arg.PeerType, arg.PeerID)
|
|
var i TopVisibleMessageBoxByPeerRow
|
|
err := row.Scan(&i.BoxID, &i.MessageDate)
|
|
return i, err
|
|
}
|
|
|
|
const updateDialogReadInbox = `-- name: UpdateDialogReadInbox :one
|
|
UPDATE dialogs d
|
|
SET
|
|
read_inbox_max_id = GREATEST(d.read_inbox_max_id, $1::int),
|
|
unread_count = (
|
|
SELECT count(*)::int
|
|
FROM message_boxes m
|
|
WHERE m.owner_user_id = d.user_id
|
|
AND m.peer_type = d.peer_type
|
|
AND m.peer_id = d.peer_id
|
|
AND NOT m.deleted
|
|
AND NOT m.outgoing
|
|
AND m.box_id > GREATEST(d.read_inbox_max_id, $1::int)
|
|
),
|
|
unread_mark = false,
|
|
unread_mentions_count = 0,
|
|
unread_reactions_count = 0,
|
|
updated_at = now()
|
|
WHERE d.user_id = $2::bigint
|
|
AND d.peer_type = $3::text
|
|
AND d.peer_id = $4::bigint
|
|
RETURNING
|
|
d.read_inbox_max_id,
|
|
d.unread_count
|
|
`
|
|
|
|
type UpdateDialogReadInboxParams struct {
|
|
ReadInboxMaxID int32
|
|
UserID int64
|
|
PeerType string
|
|
PeerID int64
|
|
}
|
|
|
|
type UpdateDialogReadInboxRow struct {
|
|
ReadInboxMaxID int32
|
|
UnreadCount int32
|
|
}
|
|
|
|
func (q *Queries) UpdateDialogReadInbox(ctx context.Context, arg UpdateDialogReadInboxParams) (UpdateDialogReadInboxRow, error) {
|
|
row := q.db.QueryRow(ctx, updateDialogReadInbox,
|
|
arg.ReadInboxMaxID,
|
|
arg.UserID,
|
|
arg.PeerType,
|
|
arg.PeerID,
|
|
)
|
|
var i UpdateDialogReadInboxRow
|
|
err := row.Scan(&i.ReadInboxMaxID, &i.UnreadCount)
|
|
return i, err
|
|
}
|
|
|
|
const updateDialogReadOutbox = `-- name: UpdateDialogReadOutbox :one
|
|
UPDATE dialogs
|
|
SET
|
|
read_outbox_max_id = GREATEST(read_outbox_max_id, $1::int),
|
|
updated_at = now()
|
|
WHERE user_id = $2::bigint
|
|
AND peer_type = $3::text
|
|
AND peer_id = $4::bigint
|
|
AND read_outbox_max_id < $1::int
|
|
RETURNING read_outbox_max_id
|
|
`
|
|
|
|
type UpdateDialogReadOutboxParams struct {
|
|
ReadOutboxMaxID int32
|
|
UserID int64
|
|
PeerType string
|
|
PeerID int64
|
|
}
|
|
|
|
func (q *Queries) UpdateDialogReadOutbox(ctx context.Context, arg UpdateDialogReadOutboxParams) (int32, error) {
|
|
row := q.db.QueryRow(ctx, updateDialogReadOutbox,
|
|
arg.ReadOutboxMaxID,
|
|
arg.UserID,
|
|
arg.PeerType,
|
|
arg.PeerID,
|
|
)
|
|
var read_outbox_max_id int32
|
|
err := row.Scan(&read_outbox_max_id)
|
|
return read_outbox_max_id, err
|
|
}
|
|
|
|
const updateMessageBoxEdit = `-- name: UpdateMessageBoxEdit :one
|
|
UPDATE message_boxes
|
|
SET body = $1::text,
|
|
entities = $2::jsonb,
|
|
edit_date = $3::int,
|
|
pts = $4::int
|
|
WHERE owner_user_id = $5::bigint
|
|
AND box_id = $6::int
|
|
AND NOT deleted
|
|
RETURNING
|
|
box_id,
|
|
private_message_id,
|
|
owner_user_id,
|
|
message_sender_id,
|
|
peer_type,
|
|
peer_id,
|
|
from_user_id,
|
|
message_date,
|
|
edit_date,
|
|
outgoing,
|
|
body,
|
|
entities::text AS entities_json,
|
|
silent,
|
|
noforwards,
|
|
reply_to_msg_id,
|
|
reply_to_peer_type,
|
|
reply_to_peer_id,
|
|
reply_to_top_id,
|
|
quote_text,
|
|
quote_entities::text AS quote_entities_json,
|
|
quote_offset,
|
|
fwd_from_peer_type,
|
|
fwd_from_peer_id,
|
|
fwd_from_name,
|
|
fwd_date,
|
|
pts,
|
|
media::text AS media_json
|
|
`
|
|
|
|
type UpdateMessageBoxEditParams struct {
|
|
Body string
|
|
EntitiesJson []byte
|
|
EditDate int32
|
|
Pts int32
|
|
OwnerUserID int64
|
|
BoxID int32
|
|
}
|
|
|
|
type UpdateMessageBoxEditRow struct {
|
|
BoxID int32
|
|
PrivateMessageID int64
|
|
OwnerUserID int64
|
|
MessageSenderID int64
|
|
PeerType string
|
|
PeerID int64
|
|
FromUserID int64
|
|
MessageDate int32
|
|
EditDate int32
|
|
Outgoing bool
|
|
Body string
|
|
EntitiesJson string
|
|
Silent bool
|
|
Noforwards bool
|
|
ReplyToMsgID int32
|
|
ReplyToPeerType string
|
|
ReplyToPeerID int64
|
|
ReplyToTopID int32
|
|
QuoteText string
|
|
QuoteEntitiesJson string
|
|
QuoteOffset int32
|
|
FwdFromPeerType string
|
|
FwdFromPeerID int64
|
|
FwdFromName string
|
|
FwdDate int32
|
|
Pts int32
|
|
MediaJson string
|
|
}
|
|
|
|
func (q *Queries) UpdateMessageBoxEdit(ctx context.Context, arg UpdateMessageBoxEditParams) (UpdateMessageBoxEditRow, error) {
|
|
row := q.db.QueryRow(ctx, updateMessageBoxEdit,
|
|
arg.Body,
|
|
arg.EntitiesJson,
|
|
arg.EditDate,
|
|
arg.Pts,
|
|
arg.OwnerUserID,
|
|
arg.BoxID,
|
|
)
|
|
var i UpdateMessageBoxEditRow
|
|
err := row.Scan(
|
|
&i.BoxID,
|
|
&i.PrivateMessageID,
|
|
&i.OwnerUserID,
|
|
&i.MessageSenderID,
|
|
&i.PeerType,
|
|
&i.PeerID,
|
|
&i.FromUserID,
|
|
&i.MessageDate,
|
|
&i.EditDate,
|
|
&i.Outgoing,
|
|
&i.Body,
|
|
&i.EntitiesJson,
|
|
&i.Silent,
|
|
&i.Noforwards,
|
|
&i.ReplyToMsgID,
|
|
&i.ReplyToPeerType,
|
|
&i.ReplyToPeerID,
|
|
&i.ReplyToTopID,
|
|
&i.QuoteText,
|
|
&i.QuoteEntitiesJson,
|
|
&i.QuoteOffset,
|
|
&i.FwdFromPeerType,
|
|
&i.FwdFromPeerID,
|
|
&i.FwdFromName,
|
|
&i.FwdDate,
|
|
&i.Pts,
|
|
&i.MediaJson,
|
|
)
|
|
return i, err
|
|
}
|
|
|
|
const updatePrivateMessageEdit = `-- name: UpdatePrivateMessageEdit :exec
|
|
UPDATE private_messages
|
|
SET body = $1::text,
|
|
entities = $2::jsonb,
|
|
edit_date = $3::int
|
|
WHERE sender_user_id = $4::bigint
|
|
AND id = $5::bigint
|
|
`
|
|
|
|
type UpdatePrivateMessageEditParams struct {
|
|
Body string
|
|
EntitiesJson []byte
|
|
EditDate int32
|
|
SenderUserID int64
|
|
PrivateMessageID int64
|
|
}
|
|
|
|
func (q *Queries) UpdatePrivateMessageEdit(ctx context.Context, arg UpdatePrivateMessageEditParams) error {
|
|
_, err := q.db.Exec(ctx, updatePrivateMessageEdit,
|
|
arg.Body,
|
|
arg.EntitiesJson,
|
|
arg.EditDate,
|
|
arg.SenderUserID,
|
|
arg.PrivateMessageID,
|
|
)
|
|
return err
|
|
}
|