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}6061type AddressInfo interface {62 String() string63 Name() string64 Address() string65 Perm() uint866 JoinedLists(context.Context) ([]List, error)67}6869type Message interface {70 Header() *mail.Header71 Parent(ctx context.Context) Message72 Entity() *gomsg.Entity73 Text() string74 Subject() string75 SubMessages(ctx context.Context, recursive bool) ([]Message, error)76 CreateAt() time.Time77}7879func Context(ctx context.Context, st Storage) context.Context {80 return context.WithValue(ctx, ContextKey, st)81}8283func FromContext(ctx context.Context) (st Storage, loaded bool) {84 st, loaded = ctx.Value(ContextKey).(Storage)85 return86}