create.go (1537B)
1 package main 2 3 import ( 4 "bytes" 5 "fmt" 6 "io" 7 "io/fs" 8 "net/mail" 9 "strings" 10 11 "olowe.co/issues/jira" 12 ) 13 14 func (w *awin) put() error { 15 f, ok := w.fsys.(*jira.FS) 16 if !ok { 17 return fmt.Errorf("cannot write with filesystem type %T", w.fsys) 18 } 19 20 defer w.Ctl("clean") 21 body, err := w.ReadAll("body") 22 if err != nil { 23 return fmt.Errorf("read body: %w", err) 24 } 25 26 // are we creating an issue or a comment? 27 // PROJECT/123/new 28 // PROJECT/new 29 elems := strings.Split(w.name(), "/") 30 switch len(elems) { 31 case 3: 32 ikey := fmt.Sprintf("%s-%s", elems[0], elems[1]) 33 jtf := toJTF(string(body)) 34 return f.Client.PostComment(ikey, strings.NewReader(jtf)) 35 case 2: 36 issue, err := readIssue(bytes.NewReader(body), elems[0]) 37 if err != nil { 38 return fmt.Errorf("read issue: %w", err) 39 } 40 if err := f.Client.CreateIssue(*issue); err != nil { 41 return fmt.Errorf("create issue: %w", err) 42 } 43 return nil 44 } 45 return &fs.PathError{"write", w.name(), fs.ErrPermission} 46 } 47 48 func readIssue(rd io.Reader, project string) (*jira.Issue, error) { 49 msg, err := mail.ReadMessage(rd) 50 if err != nil { 51 return nil, err 52 } 53 typ := "Task" 54 if msg.Header.Get("Type") != "" { 55 typ = msg.Header.Get("Type") 56 } 57 issue := jira.Issue{ 58 Summary: msg.Header.Get("Subject"), 59 Project: jira.Project{ 60 Key: project, 61 }, 62 Type: struct { 63 Name string `json:"name"` 64 }{typ}, 65 } 66 body, err := io.ReadAll(msg.Body) 67 if err != nil { 68 return nil, fmt.Errorf("read issue body: %w", err) 69 } 70 issue.Description = string(bytes.TrimSpace(body)) 71 return &issue, nil 72 }