70 lines
1.8 KiB
Go
70 lines
1.8 KiB
Go
package httpinvoce
|
|
|
|
import (
|
|
"fmt"
|
|
"log/slog"
|
|
"net/http"
|
|
"strings"
|
|
|
|
"git.schreifuchs.ch/lou-taylor/accounting/internal/email"
|
|
"git.schreifuchs.ch/lou-taylor/accounting/internal/jtype"
|
|
"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 jtype.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:"subject"`
|
|
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.WriteHeader(statusCode)
|
|
w.Write([]byte(msg))
|
|
}
|
|
|
|
func (s *Service) sendErr(w http.ResponseWriter, statusCode int, a ...any) {
|
|
msg := fmt.Sprint(a...)
|
|
s.log.Error(msg, slog.Any("statusCode", statusCode))
|
|
w.WriteHeader(statusCode)
|
|
w.Write([]byte(msg))
|
|
}
|