package httpinvoce import ( "fmt" "log/slog" "net/http" "strings" "time" "git.schreifuchs.ch/lou-taylor/accounting/internal/email" "git.schreifuchs.ch/lou-taylor/accounting/pkg/invoice" "git.schreifuchs.ch/lou-taylor/accounting/pkg/invoice/model" ) type invoiceReq struct { Debtor model.Entity `json:"debtor"` Creditor model.Entity `json:"creditor"` DurationThreshold time.Duration `json:"durationThreshold"` HourlyRate float64 `json:"hourlyRate"` Repos []string `json:"repositories"` } func (i invoiceReq) GetRepos() (repos []invoice.Repo, err error) { for i, repo := range i.Repos { parts := strings.Split(repo, "/") if len(parts) != 2 { err = fmt.Errorf("cannot read body: repo with index %d does not split into 2 parts", i) return } repos = append(repos, invoice.Repo{ Owner: parts[0], Repo: parts[1], }) } return } type sendReq struct { To []string `json:"to"` Cc []string `json:"cc"` Bcc []string `json:"bcc"` Subject string `json:"subjec"` Body string `json:"body"` Invoice invoiceReq `json:"invoice"` } func (s sendReq) ToEMail() email.Mail { return email.Mail{ To: s.To, Cc: s.Cc, Bcc: s.Bcc, Subject: s.Subject, Body: s.Body, } } func (s *Service) sendErrf(w http.ResponseWriter, statusCode int, format string, a ...any) { msg := fmt.Sprintf(format, a...) s.log.Error(msg, slog.Any("statusCode", statusCode)) w.Write([]byte(msg)) w.WriteHeader(statusCode) } func (s *Service) sendErr(w http.ResponseWriter, statusCode int, a ...any) { msg := fmt.Sprint(a...) s.log.Error(msg, slog.Any("statusCode", statusCode)) w.Write([]byte(msg)) w.WriteHeader(statusCode) }