mlisting

Mailing list service

git clone git://git.lin.moe/go/mlisting.git

 1/*
 2   Provide framework for storage
 3*/
 4
 5package storage
 6
 7import (
 8	"context"
 9	gomail "net/mail"
10	"time"
11
12	gomsg "github.com/emersion/go-message"
13	"github.com/emersion/go-message/mail"
14)
15
16var ContextKey = struct{ key string }{"storage"}
17
18const (
19	PERM_BROWSE = 1 << iota
20	PERM_REPLY
21	PERM_POST
22)
23
24type RequestType string
25
26const (
27	REQUEST_INVALID     RequestType = "invalid"
28	REQUEST_SUBSCRIBE   RequestType = "subscribe"
29	REQUEST_UNSUBSCRIBE RequestType = "unsubscribe"
30)
31
32type 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) error
37	Lists(ctx context.Context) ([]List, error)
38	Shutdown(context.Context) error
39}
40
41type List interface {
42	Address() string
43	Name() string
44	Description() string
45	DefaultPerm() uint8
46
47	NewRequest(ctx context.Context, from string, rtype RequestType, expireAt time.Time) (string, error)
48	CompleteReqest(ctx context.Context, from, token string) (RequestType, error)
49
50	NewMember(context.Context, string) (AddressInfo, error)
51	DelMember(context.Context, string) error
52	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}
62
63type AddressInfo interface {
64	String() string
65	Name() string
66	Address() string
67	Perm() uint8
68	JoinedLists(context.Context) ([]List, error)
69}
70
71type Message interface {
72	Header() *mail.Header
73	Parent(ctx context.Context) Message
74	Entity() *gomsg.Entity
75	Text() string
76	Subject() string
77	SubMessages(ctx context.Context, recursive bool) ([]Message, error)
78	CreateAt() time.Time
79}
80
81func Context(ctx context.Context, st Storage) context.Context {
82	return context.WithValue(ctx, ContextKey, st)
83}
84
85func FromContext(ctx context.Context) (st Storage, loaded bool) {
86	st, loaded = ctx.Value(ContextKey).(Storage)
87	return
88}