UNPKG

@accounter/server

Version:

130 lines 5.53 kB
import { __decorate, __metadata } from "tslib"; import DataLoader from 'dataloader'; import { Injectable, Scope } from 'graphql-modules'; import { DBProvider } from '../../app-providers/db.provider.js'; import { sql } from '@pgtyped/runtime'; import { getCacheInstance } from '../../../shared/helpers/index.js'; import { BusinessTripsProvider } from './business-trips.provider.js'; const getBusinessTripsAttendeesByBusinessTripIds = sql ` SELECT bta.business_trip_id, bta.arrival, bta.departure, b.*, fe.type, fe.owner_id, fe.name, fe.sort_code, fe.created_at, fe.updated_at, fe.irs_code FROM accounter_schema.financial_entities fe LEFT JOIN accounter_schema.business_trips_attendees bta ON bta.attendee_business_id = fe.id LEFT JOIN accounter_schema.businesses b ON bta.attendee_business_id = b.id WHERE bta.business_trip_id IN $$businessTripIds;`; const getBusinessTripsByAttendeeId = sql ` SELECT DISTINCT bt.* FROM accounter_schema.business_trips_attendees bta LEFT JOIN accounter_schema.business_trips bt ON bt.id = bta.business_trip_id WHERE bta.attendee_business_id = $attendeeId;`; const getLastFlightByDateAndAttendeeId = sql ` SELECT * FROM accounter_schema.business_trips_attendees WHERE attendee_business_id = $attendeeBusinessId AND arrival < $date AND departure <= $date AND departure >= $date - INTERVAL '14 DAY' ORDER BY departure DESC FETCH FIRST 1 ROWS ONLY;`; const addBusinessTripAttendees = sql ` INSERT INTO accounter_schema.business_trips_attendees (business_trip_id, attendee_business_id, arrival, departure) VALUES ($businessTripId, $businessId, $arrival, $departure) ON CONFLICT DO NOTHING RETURNING *;`; const updateBusinessTripAttendee = sql ` UPDATE accounter_schema.business_trips_attendees SET arrival = COALESCE( $arrival, arrival ), departure = COALESCE( $departure, departure ) WHERE business_trip_id = $businessTripId AND attendee_business_id = $attendeeBusinessId RETURNING *; `; const removeBusinessTripAttendees = sql ` DELETE FROM accounter_schema.business_trips_attendees WHERE business_trip_id = $businessTripId AND attendee_business_id = $businessId RETURNING *;`; let BusinessTripAttendeesProvider = class BusinessTripAttendeesProvider { dbProvider; businessTripsProvider; cache = getCacheInstance({ stdTTL: 60 * 5, }); constructor(dbProvider, businessTripsProvider) { this.dbProvider = dbProvider; this.businessTripsProvider = businessTripsProvider; } async batchBusinessTripsAttendeesByChargeIds(chargeIds) { const businessTripsMatches = await this.businessTripsProvider.getBusinessTripsByChargeIdLoader .loadMany(chargeIds) .then(res => res.filter(item => item && !(item instanceof Error))); const businessTripsAttendees = await this.getBusinessTripsAttendeesByBusinessTripIdLoader .loadMany(businessTripsMatches.filter(record => record.id).map(record => record.id)) .then(records => records .flat() .filter(record => !(record instanceof Error))); return chargeIds.map(id => businessTripsMatches .filter(record => record.charge_id === id) .map(match => businessTripsAttendees.filter(attendee => attendee.business_trip_id === match.id)) .flat()); } getBusinessTripsAttendeesByChargeIdLoader = new DataLoader((chargeIds) => this.batchBusinessTripsAttendeesByChargeIds(chargeIds), { cache: false, }); async batchBusinessTripsAttendeesByBusinessTripIds(businessTripIds) { const businessTrips = await getBusinessTripsAttendeesByBusinessTripIds.run({ businessTripIds, }, this.dbProvider); return businessTripIds.map(id => businessTrips.filter(record => record.business_trip_id === id)); } getBusinessTripsAttendeesByBusinessTripIdLoader = new DataLoader((ids) => this.batchBusinessTripsAttendeesByBusinessTripIds(ids), { cacheKeyFn: key => `business-trip-${key}-attendees`, cacheMap: this.cache, }); getBusinessTripsByAttendeeId(attendeeId) { return getBusinessTripsByAttendeeId.run({ attendeeId }, this.dbProvider); } getLastFlightByDateAndAttendeeId(params) { return getLastFlightByDateAndAttendeeId.run(params, this.dbProvider); } addBusinessTripAttendees(params) { if (params.businessTripId) { this.cache.delete(`business-trip-${params.businessTripId}-attendees`); } return addBusinessTripAttendees.run(params, this.dbProvider); } updateBusinessTripAttendee(params) { if (params.businessTripId) { this.cache.delete(`business-trip-${params.businessTripId}-attendees`); } return updateBusinessTripAttendee.run(params, this.dbProvider); } removeBusinessTripAttendees(params) { if (params.businessTripId) { this.cache.delete(`business-trip-${params.businessTripId}-attendees`); } return removeBusinessTripAttendees.run(params, this.dbProvider); } clearCache() { this.cache.clear(); } }; BusinessTripAttendeesProvider = __decorate([ Injectable({ scope: Scope.Singleton, global: true, }), __metadata("design:paramtypes", [DBProvider, BusinessTripsProvider]) ], BusinessTripAttendeesProvider); export { BusinessTripAttendeesProvider }; //# sourceMappingURL=business-trips-attendees.provider.js.map