mlisting

Mailing list service

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

  1package admin
  2
  3import (
  4	"database/sql"
  5	"fmt"
  6
  7	"git.lin.moe/go/mlisting/storage"
  8	"github.com/spf13/cobra"
  9)
 10
 11func init() {
 12	memShowCmd := &cobra.Command{
 13		Use:     "show {group_address}",
 14		Aliases: []string{"ls", "list"},
 15		Short:   "show members",
 16		Args:    cobra.MatchAll(cobra.ExactArgs(1), cobra.OnlyValidArgs),
 17		RunE:    memShow,
 18	}
 19	memAddCmd := &cobra.Command{
 20		Use:   "add {group_address} {mem_address ...}",
 21		Short: "add members",
 22		Args:  cobra.MatchAll(cobra.MinimumNArgs(2), cobra.OnlyValidArgs),
 23		RunE:  memAdd,
 24	}
 25
 26	memAddCmd.Flags().Uint8("perm", 0, "permission of new member (1:browser,2:reply,4:post)")
 27
 28	memDelCmd := &cobra.Command{
 29		Use:     "delete {group_address} {mem_address ...}",
 30		Aliases: []string{"del"},
 31		Short:   "delete members",
 32		Args:    cobra.MatchAll(cobra.MinimumNArgs(2), cobra.OnlyValidArgs),
 33		RunE:    memDel,
 34	}
 35
 36	memModifyCmd := &cobra.Command{
 37		Use:     "update {group_address} {mem_address}",
 38		Short:   "modify group member configures",
 39		Aliases: []string{"modify"},
 40		Args:    cobra.MatchAll(cobra.MinimumNArgs(2), cobra.OnlyValidArgs),
 41		RunE:    memModify,
 42	}
 43	mFlags := memModifyCmd.Flags()
 44	mFlags.Uint8("perm", 0, "permission of member (1:browser,2:reply,4:post)")
 45
 46	memCmd := &cobra.Command{
 47		Use:     "member",
 48		Aliases: []string{"mem"},
 49		Short:   "group members management",
 50	}
 51	memCmd.AddCommand(memShowCmd)
 52	memCmd.AddCommand(memAddCmd)
 53	memCmd.AddCommand(memDelCmd)
 54	memCmd.AddCommand(memModifyCmd)
 55
 56	cmd.AddCommand(memCmd)
 57}
 58
 59func memShow(cmd *cobra.Command, args []string) error {
 60	st, ok := storage.FromContext(cmd.Context())
 61	if !ok {
 62		return fmt.Errorf("storage not found")
 63	}
 64	list, err := st.GetList(cmd.Context(), args[0])
 65	if err != nil {
 66		if err == sql.ErrNoRows {
 67			return fmt.Errorf("not found list %s", args[0])
 68		}
 69		return err
 70	}
 71	mems, err := list.Members(cmd.Context())
 72	if err != nil {
 73		return err
 74	}
 75	for _, mem := range mems {
 76		cmd.Printf("%s <%s>: %d(%s)\n", mem.Name(), mem.Address(), mem.Perm(), storage.PermString(mem.Perm()))
 77	}
 78	return nil
 79}
 80
 81func memAdd(cmd *cobra.Command, args []string) error {
 82	st, ok := storage.FromContext(cmd.Context())
 83	if !ok {
 84		return fmt.Errorf("storage not found")
 85	}
 86	list, err := st.GetList(cmd.Context(), args[0])
 87	if err != nil {
 88		return err
 89	}
 90
 91	setperm := cmd.Flags().Changed("perm")
 92	perm, _ := cmd.Flags().GetUint8("perm")
 93
 94	for _, m := range args[1:] {
 95		info, err := list.NewMember(cmd.Context(), m)
 96		if err != nil {
 97			cmd.PrintErrf("add member [%s] failed: %v\n", m, err)
 98			continue
 99		}
100		if setperm {
101			info, err = list.UpdateMember(cmd.Context(), info.Address(), perm)
102			if err != nil {
103				cmd.PrintErrf("add permission for [%s] failed: %v\n", info.Address(), err)
104				continue
105			}
106		}
107	}
108	return nil
109}
110
111func memDel(cmd *cobra.Command, args []string) error {
112	st, ok := storage.FromContext(cmd.Context())
113	if !ok {
114		return fmt.Errorf("storage not found")
115	}
116
117	list, err := st.GetList(cmd.Context(), args[0])
118	if err != nil {
119		return err
120	}
121
122	for _, m := range args[1:] {
123		err := list.DelMember(cmd.Context(), m)
124		if err != nil {
125			cmd.PrintErrf("delete member [%s] failed: %v\n", m, err)
126			continue
127		} else {
128			cmd.Printf("member [%s] been removed from group [%s]\n", m, list.Address())
129		}
130	}
131	return nil
132}
133
134func memModify(cmd *cobra.Command, args []string) error {
135	st, ok := storage.FromContext(cmd.Context())
136	if !ok {
137		return fmt.Errorf("storage not found")
138	}
139
140	list, err := st.GetList(cmd.Context(), args[0])
141	if err != nil {
142		return err
143	}
144
145	memInfo, err := list.GetMember(cmd.Context(), args[1])
146	if err != nil {
147		return err
148	}
149
150	if cmd.Flags().Changed("perm") {
151		perm, _ := cmd.Flags().GetUint8("perm")
152		_, err = list.UpdateMember(cmd.Context(), memInfo.Address(), perm)
153		if err != nil {
154			cmd.PrintErrf("add permission for [%s] failed: %v\n", memInfo.Address(), err)
155		}
156	}
157	return nil
158}