mlisting

Mailing list service

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

  1package admin
  2
  3import (
  4	"fmt"
  5
  6	"git.lin.moe/go/mlisting/storage"
  7	"github.com/spf13/cobra"
  8)
  9
 10func init() {
 11	grpShowCmd := &cobra.Command{
 12		Use:     "show",
 13		Aliases: []string{"ls", "list"},
 14		Short:   "show group information",
 15		RunE:    groupShow,
 16	}
 17
 18	grpNewCmd := &cobra.Command{
 19		Use:     "create {name} {address} {description}",
 20		Aliases: []string{"new"},
 21		Short:   "create group",
 22		Args:    cobra.MatchAll(cobra.ExactArgs(3), cobra.OnlyValidArgs),
 23		RunE:    groupAdd,
 24	}
 25	grpNewCmd.Flags().Uint8("perm", 3, "default permission of new group (1:browser,2:reply,4:post)")
 26
 27	grpDelCmd := &cobra.Command{
 28		Use:     "delete {address} ",
 29		Aliases: []string{"del", "rm"},
 30		Short:   "delete group",
 31		Args:    cobra.MatchAll(cobra.ExactArgs(1), cobra.OnlyValidArgs),
 32		RunE:    groupDelete,
 33	}
 34
 35	grpModifyCmd := &cobra.Command{
 36		Use:     "update {address}",
 37		Aliases: []string{"modify"},
 38		Short:   "update group configures",
 39		Args:    cobra.MatchAll(cobra.ExactArgs(1), cobra.OnlyValidArgs),
 40		RunE:    groupModify,
 41	}
 42	grpModifyCmd.Flags().String("name", "", "group name")
 43	grpModifyCmd.Flags().String("desc", "", "group description")
 44	grpModifyCmd.Flags().Uint8("perm", 0, "default group member permissions (1:browser,2:reply,4:post)")
 45
 46	grpCmd := &cobra.Command{
 47		Use:     "group",
 48		Aliases: []string{"grp"},
 49		Short:   "group management",
 50	}
 51
 52	grpCmd.AddCommand(grpShowCmd)
 53	grpCmd.AddCommand(grpNewCmd)
 54	grpCmd.AddCommand(grpDelCmd)
 55	grpCmd.AddCommand(grpModifyCmd)
 56	cmd.AddCommand(grpCmd)
 57}
 58
 59func groupAdd(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
 65	name := args[0]
 66	addr := args[1]
 67	desc := args[2]
 68	perm, _ := cmd.Flags().GetUint8("perm")
 69	if list, err := st.NewList(cmd.Context(), name, addr, desc, perm); err != nil {
 70		return err
 71	} else {
 72		cmd.Printf("list created: %s <%s> \n", list.Name(), list.Address())
 73	}
 74	return nil
 75}
 76
 77func groupShow(cmd *cobra.Command, args []string) error {
 78	st, ok := storage.FromContext(cmd.Context())
 79	if !ok {
 80		return fmt.Errorf("storage not found")
 81	}
 82
 83	lists, err := st.Lists(cmd.Context())
 84	if err != nil {
 85		return err
 86	}
 87	for _, l := range lists {
 88		cmd.Printf("%s <%s> [%s]: %s\n", l.Name(), l.Address(), storage.PermString(l.DefaultPerm()), l.Description())
 89	}
 90	return nil
 91}
 92
 93func groupDelete(cmd *cobra.Command, args []string) error {
 94	st, ok := storage.FromContext(cmd.Context())
 95	if !ok {
 96		return fmt.Errorf("storage not found")
 97	}
 98
 99	addr := args[0]
100	list, err := st.GetList(cmd.Context(), addr)
101	if err != nil {
102		return err
103	}
104	if err := st.DeleteList(cmd.Context(), addr); err != nil {
105		return err
106	}
107	cmd.Printf("list %s <%s> deleted\n", list.Name(), list.Address())
108	return nil
109}
110
111func groupModify(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	address := list.Address()
122
123	name := list.Name()
124	if cmd.Flags().Changed("name") {
125		name, _ = cmd.Flags().GetString("name")
126	}
127	description := list.Description()
128	if cmd.Flags().Changed("desc") {
129		description, _ = cmd.Flags().GetString("desc")
130	}
131	defaultPerm := list.DefaultPerm()
132	if cmd.Flags().Changed("perm") {
133		defaultPerm, _ = cmd.Flags().GetUint8("perm")
134	}
135	l, err := st.UpdateList(cmd.Context(), address, name, description, defaultPerm)
136	if err == nil {
137		cmd.Printf("%s <%s> [%s]: %s\n", l.Name(), l.Address(), storage.PermString(l.DefaultPerm()), l.Description())
138	}
139	return err
140}