fix cronjob (#45)

fixes #32
This commit is contained in:
Ruidy 2025-02-23 22:38:32 +01:00 committed by GitHub
parent 6bdbd36869
commit 9a6b6ef0c3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 53 additions and 163 deletions

View file

@ -4,6 +4,7 @@ WORKDIR /app
RUN apk update \ RUN apk update \
&& apk add --no-cache build-base \ && apk add --no-cache build-base \
&& apk add --no-cache golangci-lint \
&& go install github.com/air-verse/air@latest \ && go install github.com/air-verse/air@latest \
&& go install github.com/a-h/templ/cmd/templ@latest && go install github.com/a-h/templ/cmd/templ@latest

View file

@ -1,32 +1,48 @@
package cron package cron
// func JobMonthlyBookingReport() error { import (
// _ = godotenv.Load() "fmt"
// db, err := gorm.Open(postgres.Open(os.Getenv("DATABASE_URL")), &gorm.Config{}) "log"
// if err != nil { "os"
// return fmt.Errorf("error connecting to the database %w", err) "time"
// }
// now := time.Now() "github.com/joho/godotenv"
// log.Println("Start Monthly Booking Report job at:", now) "github.com/rjNemo/rentease/internal/driver/pdf"
"github.com/rjNemo/rentease/internal/repository/booking"
bookingService "github.com/rjNemo/rentease/internal/service/booking"
"gorm.io/driver/postgres"
"gorm.io/gorm"
)
// ps, err := pdf.NewPdfClient( func JobMonthlyBookingReport() error {
// os.Getenv("HTMLDOCS_PROJECT_ID"), _ = godotenv.Load()
// os.Getenv("HTMLDOCS_REPORT_PROJECT_ID"), db, err := gorm.Open(postgres.Open(os.Getenv("DATABASE_URL")), &gorm.Config{})
// os.Getenv("HTMLDOCS_URL"), if err != nil {
// os.Getenv("HTMLDOCS_KEY"), return fmt.Errorf("error connecting to the database %w", err)
// ) }
// if err != nil {
// return fmt.Errorf("error starting pdf service %w", err)
// }
// service, _ := booking.NewService(db, nil, ps) now := time.Now()
// period := "monthly" log.Println("Start Monthly Booking Report job at:", now)
// month := int(now.Month()) ps, err := pdf.NewPdfClient()
// year := now.Year() if err != nil {
return fmt.Errorf("error starting pdf service %w", err)
}
// err = service.BuildReport(service.Report(period, month, year), period, month, year) store := booking.NewPgStore(db)
service, err := bookingService.NewService(store, nil, nil, ps)
if err != nil {
return fmt.Errorf("error creating booking service: %w", err)
}
period := "monthly"
month := int(now.Month())
year := now.Year()
// log.Printf("Executed Monthly Booking Report job at %v with errors: %s:", time.Now().Format(time.DateTime), err) _, err = service.BuildReport(service.Report(period, month, year), period, month, year)
// return err if err != nil {
// } log.Printf("Executed Monthly Booking Report job at %v with error: %v", time.Now().Format(time.DateTime), err)
return fmt.Errorf("error building report: %w", err)
}
log.Printf("Executed Monthly Booking Report job successfully at %v", time.Now().Format(time.DateTime))
return nil
}

View file

@ -1,137 +0,0 @@
package pdf
import (
"bytes"
"encoding/json"
"errors"
"io"
"net/http"
"os"
"github.com/labstack/gommon/log"
)
type PdfClient struct {
path string
invoiceId string
reportId string
url string
apiKey string
}
func NewApiPdfClient(pid, rid, url, key string) (*PdfClient, error) {
if pid == "" || rid == "" || url == "" || key == "" {
return nil, errors.New("error building Pdf service. Verify your env variables")
}
return &PdfClient{
path: "index.html",
invoiceId: pid,
reportId: rid,
url: url,
apiKey: key,
}, nil
}
func (ps PdfClient) BuildInvoice(context map[string]any) error {
data := struct {
Context map[string]any `json:"context"`
Path string `json:"path"`
ProjectId string `json:"projectId"`
}{
Context: context,
Path: ps.path,
ProjectId: ps.invoiceId,
}
payload, err := json.Marshal(data)
if err != nil {
log.Warnf("Error marshalling JSON: %s", err)
return err
}
return ps.sendData(payload)
}
func (ps PdfClient) BuildReport(context map[string]any, period string, month, year int) error {
data := struct {
Context map[string]any `json:"context"`
Path string `json:"path"`
ProjectId string `json:"projectId"`
}{
Context: context,
Path: ps.path,
ProjectId: ps.reportId,
}
payload, err := json.Marshal(data)
if err != nil {
log.Warnf("Error marshalling JSON: %s", err)
return err
}
return ps.sendData(payload)
}
func (ps PdfClient) sendData(payload []byte) error {
req, err := http.NewRequest("POST", ps.url, bytes.NewBuffer(payload))
if err != nil {
log.Warnf("Error creating request: %s", err)
return err
}
req.Header.Set("Authorization", "Bearer "+ps.apiKey)
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
log.Warnf("Error sending request: %s", err)
return err
}
defer resp.Body.Close()
res := new(struct {
Url string `json:"url"`
Error string `json:"error"`
})
body, err := io.ReadAll(resp.Body)
if err != nil {
return err
}
err = json.Unmarshal(body, res)
if err != nil {
log.Warnf("error decoding response: %s", err)
return err
}
if res.Error != "" {
log.Warnf("error building pdf file %s", err)
return errors.New(res.Error)
}
resp, err = http.Get(res.Url)
if err != nil {
log.Warnf("Error retrieving file")
return err
}
defer resp.Body.Close()
file, err := os.Create("tmp.pdf")
if err != nil {
log.Fatal(err)
}
defer file.Close()
body, err = io.ReadAll(resp.Body)
if err != nil {
return err
}
_, err = file.Write(body)
if err != nil {
log.Error("Error copying file content")
return err
}
return nil
}

View file

@ -91,7 +91,17 @@ func (ps *PgStore) Create(b *booking.Booking) error {
} }
func (ps *PgStore) Update(b *booking.Booking) error { func (ps *PgStore) Update(b *booking.Booking) error {
return ps.db.Save(b).Error return ps.db.Model(&booking.Booking{}).Where("id = ?", b.Id).Updates(map[string]any{
"from": b.From,
"to": b.To,
"customer_name": b.Name,
"phone_number": b.PhoneNumber,
"email": b.Email,
"platform": b.Platform,
"external_id": b.ExternalId,
"customers": b.CustomerNumber,
"platform_fees": b.PlatformFees,
}).Error
} }
func (ps *PgStore) Cancel(id int) error { func (ps *PgStore) Cancel(id int) error {