1/*2 Provide framework for storage3*/45package storage67import (8 "context"9 gomail "net/mail"10 "time"1112 gomsg "github.com/emersion/go-message"13 "github.com/emersion/go-message/mail"14)1516var ContextKey = struct{ key string }{"storage"}1718const (19 PERM_BROWSE = 1 << iota20 PERM_REPLY21 PERM_POST22)2324type RequestType string2526const (27 REQUEST_INVALID RequestType = "invalid"28 REQUEST_SUBSCRIBE RequestType = "subscribe"29 REQUEST_UNSUBSCRIBE RequestType = "unsubscribe"30)3132type Storage interface {33 NewList(ctx context.Context, name, address, description string, defaultPerm uint8) (List, error)34 GetList(ctx context.Context, address string) (List, error)35 UpdateList(ctx context.Context, address string, name, description string, defaultPerm uint8) (List, error)36 DeleteList(ctx context.Context, address string) error37 Lists(ctx context.Context) ([]List, error)38 Shutdown(context.Context) error39}4041type List interface {42 Address() string43 Name() string44 Description() string45 DefaultPerm() uint84647 NewRequest(ctx context.Context, from string, rtype RequestType, expireAt time.Time) (string, error)48 CompleteReqest(ctx context.Context, from, token string) (RequestType, error)4950 NewMember(context.Context, string) (AddressInfo, error)51 DelMember(context.Context, string) error52 UpdateMember(ctx context.Context, addr string, perm uint8) (AddressInfo, error)53 GetMember(context.Context, string) (AddressInfo, error)54 Members(context.Context) ([]AddressInfo, error)55 // Message Del(junk) ?56 AddMessage(ctx context.Context, header gomail.Header, body []byte) (Message, error)57 Messages(ctx context.Context, isThreadHead bool, search string, start, limit uint) (msgs []Message, total int64, err error)58 Message(ctx context.Context, msgID string) (Message, error)59 IsNewThread(ctx context.Context, header gomail.Header) (bool, error)60 DelMessagesRecursive(ctx context.Context, msg Message) ([]Message, error)61}6263type AddressInfo interface {64 String() string65 Name() string66 Address() string67 Perm() uint868 JoinedLists(context.Context) ([]List, error)69}7071type Message interface {72 Header() *mail.Header73 Parent(ctx context.Context) Message74 Entity() *gomsg.Entity75 Text() string76 Subject() string77 SubMessages(ctx context.Context, recursive bool) ([]Message, error)78 CreateAt() time.Time79}8081func Context(ctx context.Context, st Storage) context.Context {82 return context.WithValue(ctx, ContextKey, st)83}8485func FromContext(ctx context.Context) (st Storage, loaded bool) {86 st, loaded = ctx.Value(ContextKey).(Storage)87 return88}