API Reference - Passenger API

Working with Passengers using Collections

PassengerCollection

The PassengerCollection class provides a Backbone.js-inspired interface for managing passenger data with built-in indexing, pagination, and array operations.

Accessing the PassengerCollection

import { initializeSGERP } from 'sgerp-frontend-lib';

const api = initializeSGERP({
  activeConnection: 'admin@staging',
  connections: {
    'admin@staging': {
      id: 'admin@staging',
      environment: 'staging',
      user: 'admin',
      password: 'your-password',
      baseUrl: 'https://sgerp-stage.d.gcdev.swatrider.com',
    },
  },
});

// Access the PassengerCollection
const passengers = api.collections.passenger;

Common Passenger Operations

Get All Passengers

Fetch and work with passenger collections:

const passengers = api.collections.passenger;

// Fetch first page
await passengers.fetch({ limit: 20 });
console.log('Total passengers:', passengers.length);
console.log('Has more:', passengers.hasMore);

// Iterate through passengers
passengers.forEach(passenger => {
  console.log(`${passenger.name} (${passenger.username})`);
  console.log(`  Email: ${passenger.email}`);
  console.log(`  Phone: ${passenger.phone}`);
  console.log(`  Active: ${passenger.is_active}`);
});

Find Passengers by Project

Use underscore.js methods to filter passengers by project:

const passengers = api.collections.passenger;
await passengers.fetch({ limit: 100 });

// Get all passengers for a specific project
const projectId = 455;
const projectPassengers = passengers.where({ project_id: projectId });

console.log(`Project ${projectId} has ${projectPassengers.length} passengers`);
projectPassengers.forEach(passenger => {
  console.log(`  ${passenger.name}`);
  console.log(`  Type: ${passenger.passenger_type_name}`);
  console.log(`  Organization: ${passenger.organization_name}`);
});

Find Passengers by Type

Filter passengers by passenger type:

const passengers = api.collections.passenger;
await passengers.fetch({ limit: 100 });

// Get passengers by type
const standardPassengers = passengers.where({ passenger_type_code: 'standard' });

console.log(`Found ${standardPassengers.length} standard passengers`);

Search Passengers

Use find or findWhere to search for specific passengers:

const passengers = api.collections.passenger;
await passengers.fetch({ limit: 100 });

// Find by username
const passenger = passengers.findWhere({ username: 'qauser30082023081307' });
if (passenger) {
  console.log('Found passenger:', passenger.name);
  console.log('Email:', passenger.email);
  console.log('Phone:', passenger.phone);
}

// Find by ID
const passengerById = passengers.get('0006c950-72d5-4dfb-b289-f93747a7367a');
if (passengerById) {
  console.log('Found passenger:', passengerById.name);
}

Active Passengers Only

Filter to get only active passengers:

const passengers = api.collections.passenger;
await passengers.fetch({ limit: 100 });

// Get only active passengers
const activePassengers = passengers.filter(p => p.is_active);

console.log(`${activePassengers.length} active passengers out of ${passengers.length} total`);

Group Passengers by Organization

Use collection methods to group and analyze passenger data:

const passengers = api.collections.passenger;
await passengers.fetch({ limit: 100 });

// Group by organization
const byOrganization = passengers.groupBy('organization_name');

Object.entries(byOrganization).forEach(([org, orgPassengers]) => {
  console.log(`${org}: ${orgPassengers.length} passengers`);
});

Passenger Model Properties

interface Passenger {
  // Core fields
  id: string;
  project_id: number;
  organization_id: number;
  user_id: number;
  name: string;
  username: string;
  email: string;
  phone: string;
  is_active: boolean;

  // Optional fields
  employee_id: string | null;
  passenger_type_id: number;
  cost_centre_id: number | null;
  department_id: number | null;
  stripe_customer_id: string | null;
  gender: string | null;
  birth_date: string | null;

  // Authentication
  last_login: string | null;
  failed_login_attempts: number;
  blocked_until: string | null;

  // Extended fields
  organization_code: string;
  organization_name: string;
  passenger_type_code: string;
  passenger_type_name: string;
  cost_centre_code: string | null;
  cost_centre_name: string | null;
  department_code: string | null;
  department_name: string | null;
  user_is_active: boolean;

  // Metadata
  options: Record<string, any>;
  search_index: string;
  created_by_id: number | null;
  created_by_email: string | null;

  // Timestamps
  created_at: string;
  modified_at: string;
}

Pagination

The PassengerCollection supports pagination just like other collections:

const passengers = api.collections.passenger;

// Fetch first page (20 passengers)
await passengers.fetch({ limit: 20 });
console.log('Page 1:', passengers.length, 'passengers');

// Load next page
if (passengers.hasMore) {
  await passengers.fetchNext();
  console.log('Total loaded:', passengers.length, 'passengers');
}

// Or fetch all passengers at once
await passengers.fetchAll();
console.log('All passengers loaded:', passengers.length);

Using in React

import { useSGERP } from 'sgerp-frontend-lib';
import { useEffect, useState } from 'react';

function PassengerList() {
  const api = useSGERP();
  const passengers = api?.collections.passenger;
  const [loading, setLoading] = useState(true);

  useEffect(() => {
    if (!passengers) return;

    passengers.fetch({ limit: 20 })
      .finally(() => setLoading(false));
  }, [passengers]);

  if (loading) return <div>Loading...</div>;

  return (
    <div>
      <h2>Passengers ({passengers?.length})</h2>
      {passengers?.models.map(passenger => (
        <div key={passenger.id}>
          <h3>{passenger.name}</h3>
          <p>{passenger.email}</p>
          <p>{passenger.phone}</p>
          <p>Type: {passenger.passenger_type_name}</p>
        </div>
      ))}
    </div>
  );
}