2023-01-06 00:39:21 +01:00
package primary
2022-11-19 23:16:54 +01:00
import (
scn "blackforestbytes.com/simplecloudnotifier"
2023-07-27 17:44:06 +02:00
"blackforestbytes.com/simplecloudnotifier/db"
2022-11-19 23:16:54 +01:00
"blackforestbytes.com/simplecloudnotifier/models"
2023-06-17 20:08:39 +02:00
"gogs.mikescher.com/BlackForestBytes/goext/langext"
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 ) CreateUser ( ctx db . TxContext , protoken * string , username * string ) ( models . User , error ) {
2022-11-19 23:16:54 +01:00
tx , err := ctx . GetOrCreateTransaction ( db )
if err != nil {
return models . User { } , err
}
2024-09-15 21:07:46 +02:00
entity := models . User {
2023-05-28 22:27:38 +02:00
UserID : models . NewUserID ( ) ,
2022-11-19 23:16:54 +01:00
Username : username ,
2024-09-15 21:07:46 +02:00
TimestampCreated : models . NowSCNTime ( ) ,
2022-11-19 23:16:54 +01:00
TimestampLastRead : nil ,
TimestampLastSent : nil ,
MessagesSent : 0 ,
QuotaUsed : 0 ,
QuotaUsedDay : nil ,
IsPro : protoken != nil ,
ProToken : protoken ,
2024-09-15 21:07:46 +02:00
UserExtra : models . UserExtra { } ,
2025-04-13 16:12:15 +02:00
Deleted : false ,
2023-05-28 22:27:38 +02:00
}
2024-09-15 21:07:46 +02:00
entity . PreMarshal ( )
2023-05-28 22:27:38 +02:00
_ , err = sq . InsertSingle ( ctx , tx , "users" , entity )
if err != nil {
return models . User { } , 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 ) ClearProTokens ( ctx db . TxContext , protoken string ) error {
2022-11-19 23:16:54 +01:00
tx , err := ctx . GetOrCreateTransaction ( db )
if err != nil {
return err
}
2025-04-13 16:12:15 +02:00
_ , err = tx . Exec ( ctx , "UPDATE users SET is_pro=0, pro_token=NULL WHERE pro_token = :tok AND deleted=0" , sq . PP { "tok" : protoken } )
2022-11-19 23:16:54 +01:00
if err != nil {
return err
}
return nil
}
2023-07-27 17:44:06 +02:00
func ( db * Database ) GetUser ( ctx db . TxContext , userid models . UserID ) ( models . User , error ) {
2022-11-19 23:16:54 +01:00
tx , err := ctx . GetOrCreateTransaction ( db )
if err != nil {
return models . User { } , err
}
2025-04-13 16:12:15 +02:00
return sq . QuerySingle [ models . User ] ( ctx , tx , "SELECT * FROM users WHERE user_id = :uid AND deleted=0 LIMIT 1" , sq . PP { "uid" : userid } , sq . SModeExtended , sq . Safe )
2022-11-19 23:16:54 +01:00
}
2024-09-17 20:49:10 +02:00
func ( db * Database ) GetUserOpt ( ctx db . TxContext , userid models . UserID ) ( * models . User , error ) {
tx , err := ctx . GetOrCreateTransaction ( db )
if err != nil {
return nil , err
}
2025-04-13 16:12:15 +02:00
return sq . QuerySingleOpt [ models . User ] ( ctx , tx , "SELECT * FROM users WHERE user_id = :uid AND deleted=0 LIMIT 1" , sq . PP { "uid" : userid } , sq . SModeExtended , sq . Safe )
2024-09-17 20:49:10 +02:00
}
2023-07-27 17:44:06 +02:00
func ( db * Database ) UpdateUserUsername ( ctx db . TxContext , userid models . UserID , username * string ) error {
2022-11-19 23:16:54 +01:00
tx , err := ctx . GetOrCreateTransaction ( db )
if err != nil {
return err
}
2025-04-13 16:12:15 +02:00
_ , err = tx . Exec ( ctx , "UPDATE users SET username = :nam WHERE user_id = :uid AND deleted=0" , sq . PP {
2022-12-07 22:11:44 +01:00
"nam" : username ,
"uid" : userid ,
} )
2022-11-19 23:16:54 +01:00
if err != nil {
return err
}
return nil
}
2023-07-27 17:44:06 +02:00
func ( db * Database ) UpdateUserProToken ( ctx db . TxContext , userid models . UserID , protoken * string ) error {
2022-11-19 23:16:54 +01:00
tx , err := ctx . GetOrCreateTransaction ( db )
if err != nil {
return err
}
2025-04-13 16:12:15 +02:00
_ , err = tx . Exec ( ctx , "UPDATE users SET pro_token = :tok, is_pro = :pro WHERE user_id = :uid AND deleted=0" , sq . PP {
2022-12-07 22:11:44 +01:00
"tok" : protoken ,
"pro" : bool2DB ( protoken != nil ) ,
"uid" : userid ,
} )
2022-11-19 23:16:54 +01:00
if err != nil {
return err
}
return nil
}
2023-07-27 17:44:06 +02:00
func ( db * Database ) IncUserMessageCounter ( ctx db . TxContext , user * models . User ) error {
2022-11-19 23:16:54 +01:00
tx , err := ctx . GetOrCreateTransaction ( db )
if err != nil {
return err
}
2023-06-17 20:08:39 +02:00
now := time . Now ( )
2022-11-19 23:16:54 +01:00
quota := user . QuotaUsedToday ( ) + 1
2023-06-17 20:08:39 +02:00
user . QuotaUsed = quota
user . QuotaUsedDay = langext . Ptr ( scn . QuotaDayString ( ) )
2025-04-13 16:12:15 +02:00
_ , err = tx . Exec ( ctx , "UPDATE users SET timestamp_lastsent = :ts, messages_sent = messages_sent+1, quota_used = :qu, quota_used_day = :qd WHERE user_id = :uid AND deleted=0" , sq . PP {
2023-06-17 20:08:39 +02:00
"ts" : time2DB ( now ) ,
"qu" : user . QuotaUsed ,
"qd" : user . QuotaUsedDay ,
2022-12-07 22:11:44 +01:00
"uid" : user . UserID ,
} )
2022-11-19 23:16:54 +01:00
if err != nil {
return err
}
2024-09-15 21:07:46 +02:00
user . TimestampLastSent = models . NewSCNTimePtr ( & now )
2023-06-17 20:16:02 +02:00
user . MessagesSent = user . MessagesSent + 1
2022-11-19 23:16:54 +01:00
return nil
}
2023-07-27 17:44:06 +02:00
func ( db * Database ) UpdateUserLastRead ( ctx db . TxContext , userid models . UserID ) error {
2022-11-19 23:16:54 +01:00
tx , err := ctx . GetOrCreateTransaction ( db )
if err != nil {
return err
}
2025-04-13 16:12:15 +02:00
_ , err = tx . Exec ( ctx , "UPDATE users SET timestamp_lastread = :ts WHERE user_id = :uid AND deleted=0" , sq . PP {
2022-12-07 22:11:44 +01:00
"ts" : time2DB ( time . Now ( ) ) ,
"uid" : userid ,
} )
2022-11-19 23:16:54 +01:00
if err != nil {
return err
}
return nil
}
2025-04-13 16:12:15 +02:00
func ( db * Database ) DeleteUser ( ctx db . TxContext , userid models . UserID ) error {
tx , err := ctx . GetOrCreateTransaction ( db )
if err != nil {
return err
}
_ , err = tx . Exec ( ctx , "UPDATE users SET deleted=1 WHERE user_id = :uid AND deleted=0" , sq . PP { "uid" : userid } )
if err != nil {
return err
}
return nil
}