@@ -21,6 +21,7 @@ import (
2121
2222 "github.com/usememos/memos/internal/profile"
2323 "github.com/usememos/memos/internal/util"
24+ "github.com/usememos/memos/plugin/filter"
2425 "github.com/usememos/memos/plugin/storage/s3"
2526 v1pb "github.com/usememos/memos/proto/gen/api/v1"
2627 storepb "github.com/usememos/memos/proto/gen/store"
@@ -156,6 +157,14 @@ func (s *APIV1Service) ListAttachments(ctx context.Context, request *v1pb.ListAt
156157 Offset : & offset ,
157158 }
158159
160+ // Parse filter if provided
161+ if request .Filter != "" {
162+ if err := s .validateAttachmentFilter (ctx , request .Filter ); err != nil {
163+ return nil , status .Errorf (codes .InvalidArgument , "invalid filter: %v" , err )
164+ }
165+ findAttachment .Filters = append (findAttachment .Filters , request .Filter )
166+ }
167+
159168 attachments , err := s .Store .ListAttachments (ctx , findAttachment )
160169 if err != nil {
161170 return nil , status .Errorf (codes .Internal , "failed to list attachments: %v" , err )
@@ -472,3 +481,29 @@ func isValidMimeType(mimeType string) bool {
472481 matched , _ := regexp .MatchString (`^[a-zA-Z0-9][a-zA-Z0-9!#$&^_.+-]{0,126}/[a-zA-Z0-9][a-zA-Z0-9!#$&^_.+-]{0,126}$` , mimeType )
473482 return matched
474483}
484+
485+ func (s * APIV1Service ) validateAttachmentFilter (ctx context.Context , filterStr string ) error {
486+ if filterStr == "" {
487+ return errors .New ("filter cannot be empty" )
488+ }
489+
490+ engine , err := filter .DefaultAttachmentEngine ()
491+ if err != nil {
492+ return err
493+ }
494+
495+ var dialect filter.DialectName
496+ switch s .Profile .Driver {
497+ case "mysql" :
498+ dialect = filter .DialectMySQL
499+ case "postgres" :
500+ dialect = filter .DialectPostgres
501+ default :
502+ dialect = filter .DialectSQLite
503+ }
504+
505+ if _ , err := engine .CompileToStatement (ctx , filterStr , filter.RenderOptions {Dialect : dialect }); err != nil {
506+ return errors .Wrap (err , "failed to compile filter" )
507+ }
508+ return nil
509+ }
0 commit comments