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}
60
61type AddressInfo interface {
62	String() string
63	Name() string
64	Address() string
65	Perm() uint8
66	JoinedLists(context.Context) ([]List, error)
67}
68
69type Message interface {
70	Header() *mail.Header
71	Parent(ctx context.Context) Message
72	Entity() *gomsg.Entity
73	Text() string
74	Subject() string
75	SubMessages(ctx context.Context, recursive bool) ([]Message, error)
76	CreateAt() time.Time
77}
78
79func Context(ctx context.Context, st Storage) context.Context {
80	return context.WithValue(ctx, ContextKey, st)
81}
82
83func FromContext(ctx context.Context) (st Storage, loaded bool) {
84	st, loaded = ctx.Value(ContextKey).(Storage)
85	return
86}