// 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 }