2023-09-28 22:09:52 +08:00
package mysql
import (
"context"
2023-10-08 18:29:22 +08:00
"strings"
2023-09-28 22:09:52 +08:00
"github.com/pkg/errors"
2023-10-27 23:24:56 +08:00
"google.golang.org/protobuf/encoding/protojson"
2023-09-28 22:09:52 +08:00
2023-10-27 23:24:56 +08:00
storepb "github.com/usememos/memos/proto/gen/store"
2023-09-28 22:09:52 +08:00
"github.com/usememos/memos/store"
)
2023-10-05 23:11:29 +08:00
func ( d * DB ) CreateActivity ( ctx context . Context , create * store . Activity ) ( * store . Activity , error ) {
2023-10-27 23:24:56 +08: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 18:29:22 +08:00
fields := [ ] string { "`creator_id`" , "`type`" , "`level`" , "`payload`" }
placeholder := [ ] string { "?" , "?" , "?" , "?" }
2023-10-27 23:24:56 +08:00
args := [ ] any { create . CreatorID , create . Type . String ( ) , create . Level . String ( ) , payloadString }
2023-10-08 18:29:22 +08:00
2024-01-06 16:55:13 +08:00
stmt := "INSERT INTO `activity` (" + strings . Join ( fields , ", " ) + ") VALUES (" + strings . Join ( placeholder , ", " ) + ")"
2023-10-08 18:29:22 +08:00
result , err := d . db . ExecContext ( ctx , stmt , args ... )
2023-09-28 22:09:52 +08:00
if err != nil {
2023-10-07 22:56:12 +08:00
return nil , errors . Wrap ( err , "failed to execute statement" )
2023-09-28 22:09:52 +08:00
}
id , err := result . LastInsertId ( )
if err != nil {
2023-10-07 22:56:12 +08:00
return nil , errors . Wrap ( err , "failed to get last insert id" )
2023-09-28 22:09:52 +08:00
}
2023-10-09 21:18:33 +08:00
id32 := int32 ( id )
2023-10-27 01:11:41 +08:00
list , err := d . ListActivities ( ctx , & store . FindActivity { ID : & id32 } )
2023-10-09 21:18:33 +08:00
if err != nil || len ( list ) == 0 {
return nil , errors . Wrap ( err , "failed to find activity" )
}
return list [ 0 ] , nil
2023-09-28 22:09:52 +08:00
}
2023-10-27 01:11:41 +08:00
func ( d * DB ) ListActivities ( ctx context . Context , find * store . FindActivity ) ( [ ] * store . Activity , error ) {
2023-10-09 21:18:33 +08:00
where , args := [ ] string { "1 = 1" } , [ ] any { }
if find . ID != nil {
where , args = append ( where , "`id` = ?" ) , append ( args , * find . ID )
}
2023-11-06 20:49:02 +08:00
if find . Type != nil {
where , args = append ( where , "`type` = ?" ) , append ( args , find . Type . String ( ) )
}
2023-10-09 21:18:33 +08:00
2023-11-06 20:49:02 +08:00
query := "SELECT `id`, `creator_id`, `type`, `level`, `payload`, UNIX_TIMESTAMP(`created_ts`) FROM `activity` WHERE " + strings . Join ( where , " AND " ) + " ORDER BY `created_ts` DESC"
2023-10-09 21:18:33 +08: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 23:24:56 +08:00
var payloadBytes [ ] byte
2023-10-09 21:18:33 +08:00
if err := rows . Scan (
& activity . ID ,
& activity . CreatorID ,
& activity . Type ,
& activity . Level ,
2023-10-27 23:24:56 +08:00
& payloadBytes ,
2023-10-09 21:18:33 +08:00
& activity . CreatedTs ,
) ; err != nil {
return nil , err
}
2023-10-27 23:24:56 +08:00
payload := & storepb . ActivityPayload { }
if err := protojsonUnmarshaler . Unmarshal ( payloadBytes , payload ) ; err != nil {
return nil , err
}
activity . Payload = payload
2023-10-09 21:18:33 +08:00
list = append ( list , activity )
}
if err := rows . Err ( ) ; err != nil {
return nil , err
}
return list , nil
2023-09-28 22:09:52 +08:00
}