issues

Github, Jira, Gitlab issues from Plan 9's acme
Log | Files | Refs | README | LICENSE

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 }