2023-01-06 00:39:21 +01:00
package primary
2022-11-19 23:16:54 +01:00
import (
2023-07-27 17:44:06 +02:00
"blackforestbytes.com/simplecloudnotifier/db"
2023-02-03 22:51:03 +01:00
ct "blackforestbytes.com/simplecloudnotifier/db/cursortoken"
2022-11-19 23:16:54 +01:00
"blackforestbytes.com/simplecloudnotifier/models"
2023-06-18 02:09:05 +02:00
"errors"
2022-12-07 23:32:58 +01:00
"gogs.mikescher.com/BlackForestBytes/goext/sq"
2022-11-19 23:16:54 +01:00
"time"
)
2023-07-27 17:44:06 +02:00
func ( db * Database ) GetMessageByUserMessageID ( ctx db . TxContext , usrMsgId string ) ( * models . Message , error ) {
2022-11-19 23:16:54 +01:00
tx , err := ctx . GetOrCreateTransaction ( db )
if err != nil {
return nil , err
}
2024-09-15 21:07:46 +02:00
return sq . QuerySingleOpt [ models . Message ] ( ctx , tx , "SELECT * FROM messages WHERE usr_message_id = :umid LIMIT 1" , sq . PP { "umid" : usrMsgId } , sq . SModeExtended , sq . Safe )
2022-11-19 23:16:54 +01:00
}
2023-07-27 17:44:06 +02:00
func ( db * Database ) GetMessage ( ctx db . TxContext , scnMessageID models . MessageID , allowDeleted bool ) ( models . Message , error ) {
2022-11-19 23:16:54 +01:00
tx , err := ctx . GetOrCreateTransaction ( db )
if err != nil {
return models . Message { } , err
}
2022-12-14 12:29:55 +01:00
var sqlcmd string
if allowDeleted {
2023-01-14 00:48:51 +01:00
sqlcmd = "SELECT * FROM messages WHERE message_id = :mid LIMIT 1"
2022-12-14 12:29:55 +01:00
} else {
2023-01-14 00:48:51 +01:00
sqlcmd = "SELECT * FROM messages WHERE message_id = :mid AND deleted=0 LIMIT 1"
2022-12-14 12:29:55 +01:00
}
2024-09-15 21:07:46 +02:00
return sq . QuerySingle [ models . Message ] ( ctx , tx , sqlcmd , sq . PP { "mid" : scnMessageID } , sq . SModeExtended , sq . Safe )
2022-11-19 23:16:54 +01:00
}
2023-07-27 17:44:06 +02:00
func ( db * Database ) CreateMessage ( ctx db . TxContext , senderUserID models . UserID , channel models . Channel , timestampSend * time . Time , title string , content * string , priority int , userMsgId * string , senderIP string , senderName * string , usedKeyID models . KeyTokenID ) ( models . Message , error ) {
2022-11-19 23:16:54 +01:00
tx , err := ctx . GetOrCreateTransaction ( db )
if err != nil {
return models . Message { } , err
}
2024-09-15 21:07:46 +02:00
entity := models . Message {
2023-05-28 22:27:38 +02:00
MessageID : models . NewMessageID ( ) ,
2022-12-22 11:22:36 +01:00
SenderUserID : senderUserID ,
ChannelInternalName : channel . InternalName ,
ChannelID : channel . ChannelID ,
SenderIP : senderIP ,
SenderName : senderName ,
2024-09-15 21:07:46 +02:00
TimestampReal : models . NowSCNTime ( ) ,
TimestampClient : models . NewSCNTimePtr ( timestampSend ) ,
2022-12-22 11:22:36 +01:00
Title : title ,
Content : content ,
Priority : priority ,
UserMessageID : userMsgId ,
2023-05-27 18:51:20 +02:00
UsedKeyID : usedKeyID ,
2024-09-15 21:07:46 +02:00
Deleted : false ,
MessageExtra : models . MessageExtra { } ,
2023-05-28 22:27:38 +02:00
}
_ , err = sq . InsertSingle ( ctx , tx , "messages" , entity )
if err != nil {
return models . Message { } , err
}
2024-09-15 21:07:46 +02:00
return entity , nil
2022-11-19 23:16:54 +01:00
}
2023-07-27 17:44:06 +02:00
func ( db * Database ) DeleteMessage ( ctx db . TxContext , messageID models . MessageID ) error {
2022-11-19 23:16:54 +01:00
tx , err := ctx . GetOrCreateTransaction ( db )
if err != nil {
return err
}
2023-01-14 00:48:51 +01:00
_ , err = tx . Exec ( ctx , "UPDATE messages SET deleted=1 WHERE message_id = :mid AND deleted=0" , sq . PP { "mid" : messageID } )
2022-11-19 23:16:54 +01:00
if err != nil {
return err
}
return nil
}
2022-11-20 00:19:41 +01:00
2024-09-20 15:36:16 +02:00
func ( db * Database ) ListMessages ( ctx db . TxContext , filter models . MessageFilter , pageSize * int , inTok ct . CursorToken ) ( [ ] models . Message , ct . CursorToken , int64 , error ) {
2022-11-20 00:19:41 +01:00
tx , err := ctx . GetOrCreateTransaction ( db )
if err != nil {
2024-09-20 15:36:16 +02:00
return nil , ct . CursorToken { } , 0 , err
2022-11-20 00:19:41 +01:00
}
2022-12-11 02:47:23 +01:00
pageCond := "1=1"
2023-02-03 22:51:03 +01:00
if inTok . Mode == ct . CTMNormal {
2023-01-14 00:48:51 +01:00
pageCond = "timestamp_real < :tokts OR (timestamp_real = :tokts AND message_id < :tokid )"
2022-11-20 00:19:41 +01:00
}
2022-12-10 03:38:48 +01:00
filterCond , filterJoin , prepParams , err := filter . SQL ( )
2022-11-20 00:19:41 +01:00
2023-05-27 23:54:14 +02:00
orderClause := ""
if pageSize != nil {
orderClause = "ORDER BY COALESCE(timestamp_client, timestamp_real) DESC, message_id DESC LIMIT :lim"
prepParams [ "lim" ] = * pageSize + 1
} else {
orderClause = "ORDER BY COALESCE(timestamp_client, timestamp_real) DESC, message_id DESC"
}
2022-11-20 00:19:41 +01:00
2024-09-20 15:36:16 +02:00
sqlQueryList := "SELECT " + "messages.*" + " FROM messages " + filterJoin + " WHERE ( " + pageCond + " ) AND ( " + filterCond + " ) " + orderClause
sqlQueryCount := "SELECT " + " COUNT(*) AS count FROM messages " + filterJoin + " WHERE ( " + filterCond + " ) "
2022-11-20 00:30:30 +01:00
2022-12-10 03:38:48 +01:00
prepParams [ "tokts" ] = inTok . Timestamp
prepParams [ "tokid" ] = inTok . Id
2022-11-20 00:30:30 +01:00
2024-09-20 15:36:16 +02:00
if inTok . Mode == ct . CTMEnd {
dataCount , err := sq . QuerySingle [ CountResponse ] ( ctx , tx , sqlQueryCount , prepParams , sq . SModeFast , sq . Safe )
if err != nil {
return nil , ct . CursorToken { } , 0 , err
}
return make ( [ ] models . Message , 0 ) , ct . End ( ) , dataCount . Count , nil
}
dataList , err := sq . QueryAll [ models . Message ] ( ctx , tx , sqlQueryList , prepParams , sq . SModeExtended , sq . Safe )
2022-11-20 00:30:30 +01:00
if err != nil {
2024-09-20 15:36:16 +02:00
return nil , ct . CursorToken { } , 0 , err
2022-11-20 00:30:30 +01:00
}
2024-09-20 15:36:16 +02:00
if pageSize == nil || len ( dataList ) <= * pageSize {
return dataList , ct . End ( ) , int64 ( len ( dataList ) ) , nil
2022-11-20 00:30:30 +01:00
} else {
2024-09-20 15:36:16 +02:00
dataCount , err := sq . QuerySingle [ CountResponse ] ( ctx , tx , sqlQueryCount , prepParams , sq . SModeFast , sq . Safe )
if err != nil {
return nil , ct . CursorToken { } , 0 , err
}
outToken := ct . Normal ( dataList [ * pageSize - 1 ] . Timestamp ( ) , dataList [ * pageSize - 1 ] . MessageID . String ( ) , "DESC" , filter . Hash ( ) )
return dataList [ 0 : * pageSize ] , outToken , dataCount . Count , nil
2022-11-20 00:30:30 +01:00
}
}
2023-06-18 02:09:05 +02:00
2023-07-27 17:44:06 +02:00
func ( db * Database ) CountMessages ( ctx db . TxContext , filter models . MessageFilter ) ( int64 , error ) {
2023-06-18 02:09:05 +02:00
tx , err := ctx . GetOrCreateTransaction ( db )
if err != nil {
return 0 , err
}
filterCond , filterJoin , prepParams , err := filter . SQL ( )
sqlQuery := "SELECT " + "COUNT(*)" + " FROM messages " + filterJoin + " WHERE ( " + filterCond + " ) "
rows , err := tx . Query ( ctx , sqlQuery , prepParams )
if err != nil {
return 0 , err
}
if ! rows . Next ( ) {
return 0 , errors . New ( "COUNT query returned no results" )
}
var countRes int64
err = rows . Scan ( & countRes )
if err != nil {
return 0 , err
}
return countRes , nil
}