rentease/internal/driver/parser/client.go

91 lines
2.5 KiB
Go

package parser
import (
"encoding/json"
"fmt"
"log"
"net/http"
"net/url"
"time"
"github.com/rjNemo/rentease/internal/service/booking"
)
type BookingAgentParser struct {
baseUrl string
}
func NewBookingAgentParser(baseUrl string) *BookingAgentParser {
return &BookingAgentParser{
baseUrl: baseUrl,
}
}
func (p *BookingAgentParser) Parse(rawContent string) (*booking.Booking, error) {
log.Println("sending request to booking agent parser")
resp, err := http.Post(fmt.Sprintf("%s/sync?input=%s", p.baseUrl, url.QueryEscape(rawContent)), "application/json", nil)
if err != nil {
return nil, fmt.Errorf("error sending request to booking agent parser: %w", err)
}
defer resp.Body.Close()
type ResponseData struct {
ArrivalDate string `json:"arrival_date"`
BookingFees json.Number `json:"booking_fees"`
BookingID string `json:"booking_id"`
DepartureDate string `json:"departure_date"`
StayLength int `json:"stay_length"`
GuestEmail string `json:"guest_email"`
GuestName string `json:"guest_name"`
GuestNumber int `json:"guest_number"`
GuestPhone string `json:"guest_phone"`
RoomBooked string `json:"room_booked"`
StandardRate json.Number `json:"standard_rate"`
SpecialRequests string `json:"special_requests"`
}
type Response struct {
Data ResponseData `json:"data"`
}
var r Response
err = json.NewDecoder(resp.Body).Decode(&r)
if err != nil {
return nil, fmt.Errorf("error decoding response from booking agent parser: %w", err)
}
var b booking.Booking
b.From, err = time.Parse("2006-01-02", r.Data.ArrivalDate)
if err != nil {
return nil, fmt.Errorf("error parsing arrival_date: %w", err)
}
b.To, err = time.Parse("2006-01-02", r.Data.DepartureDate)
if err != nil {
return nil, fmt.Errorf("error parsing departure_date: %w", err)
}
b.Name = r.Data.GuestName
b.PhoneNumber = r.Data.GuestPhone
b.Email = r.Data.GuestEmail
b.CustomerNumber = r.Data.GuestNumber
bookingFees, err := r.Data.BookingFees.Float64()
if err != nil {
return nil, fmt.Errorf("error parsing booking fees: %w", err)
}
b.Platform = "Booking"
b.PlatformFees = bookingFees
b.ExternalId = &r.Data.BookingID
price, err := r.Data.StandardRate.Float64()
if err != nil {
return nil, fmt.Errorf("error parsing standard rate: %w", err)
}
b.Items = append(b.Items, booking.Item{
Item: r.Data.RoomBooked,
Quantity: r.Data.StayLength,
Price: price,
PaymentMethod: "Card",
})
return &b, nil
}