2023-09-26 14:07:14 +03:00
package sqlite
2023-09-26 12:16:58 +03:00
import (
"context"
2023-10-08 13:29:22 +03:00
"strings"
2023-09-26 12:16:58 +03:00
2023-10-27 18:24:56 +03:00
"github.com/pkg/errors"
"google.golang.org/protobuf/encoding/protojson"
storepb "github.com/usememos/memos/proto/gen/store"
2023-09-26 12:16:58 +03:00
"github.com/usememos/memos/store"
)
2023-10-05 18:11:29 +03:00
func ( d * DB ) CreateActivity ( ctx context . Context , create * store . Activity ) ( * store . Activity , error ) {
2023-10-27 18:24:56 +03:00
payloadString := "{}"
if create . Payload != nil {
bytes , err := protojson . Marshal ( create . Payload )
if err != nil {
return nil , errors . Wrap ( err , "failed to marshal activity payload" )
}
payloadString = string ( bytes )
}
2023-10-08 13:29:22 +03:00
fields := [ ] string { "`creator_id`" , "`type`" , "`level`" , "`payload`" }
placeholder := [ ] string { "?" , "?" , "?" , "?" }
2023-10-27 18:24:56 +03:00
args := [ ] any { create . CreatorID , create . Type . String ( ) , create . Level . String ( ) , payloadString }
2023-10-08 13:29:22 +03:00
if create . ID != 0 {
fields = append ( fields , "`id`" )
placeholder = append ( placeholder , "?" )
args = append ( args , create . ID )
}
if create . CreatedTs != 0 {
fields = append ( fields , "`created_ts`" )
placeholder = append ( placeholder , "?" )
args = append ( args , create . CreatedTs )
}
stmt := "INSERT INTO activity (" + strings . Join ( fields , ", " ) + ") VALUES (" + strings . Join ( placeholder , ", " ) + ") RETURNING `id`, `created_ts`"
if err := d . db . QueryRowContext ( ctx , stmt , args ... ) . Scan (
2023-09-26 12:16:58 +03:00
& create . ID ,
& create . CreatedTs ,
) ; err != nil {
return nil , err
}
return create , nil
}
2023-10-09 16:18:33 +03:00
2023-10-26 20:11:41 +03:00
func ( d * DB ) ListActivities ( ctx context . Context , find * store . FindActivity ) ( [ ] * store . Activity , error ) {
2023-10-09 16:18:33 +03:00
where , args := [ ] string { "1 = 1" } , [ ] any { }
if find . ID != nil {
where , args = append ( where , "`id` = ?" ) , append ( args , * find . ID )
}
2023-11-06 15:49:02 +03:00
if find . Type != nil {
where , args = append ( where , "`type` = ?" ) , append ( args , find . Type . String ( ) )
}
2023-10-09 16:18:33 +03:00
2023-11-06 15:49:02 +03:00
query := "SELECT `id`, `creator_id`, `type`, `level`, `payload`, `created_ts` FROM `activity` WHERE " + strings . Join ( where , " AND " ) + " ORDER BY `created_ts` DESC"
2023-10-09 16:18:33 +03:00
rows , err := d . db . QueryContext ( ctx , query , args ... )
if err != nil {
return nil , err
}
defer rows . Close ( )
list := [ ] * store . Activity { }
for rows . Next ( ) {
activity := & store . Activity { }
2023-10-27 18:24:56 +03:00
var payloadBytes [ ] byte
2023-10-09 16:18:33 +03:00
if err := rows . Scan (
& activity . ID ,
& activity . CreatorID ,
& activity . Type ,
& activity . Level ,
2023-10-27 18:24:56 +03:00
& payloadBytes ,
2023-10-09 16:18:33 +03:00
& activity . CreatedTs ,
) ; err != nil {
return nil , err
}
2023-10-27 18:24:56 +03:00
payload := & storepb . ActivityPayload { }
if err := protojsonUnmarshaler . Unmarshal ( payloadBytes , payload ) ; err != nil {
return nil , err
}
activity . Payload = payload
2023-10-09 16:18:33 +03:00
list = append ( list , activity )
}
if err := rows . Err ( ) ; err != nil {
return nil , err
}
return list , nil
}