Revision history for DBIO-GraphQL

0.900001  2026-07-12
    Security fix.

    * Security
        - Fix SQL injection (CWE-89) in the orderBy.field argument of the
          plural allXs queries. The field was passed unvalidated into the DBIO
          order_by clause; under default DBIO storage identifiers are emitted
          unquoted into ORDER BY, so a client could inject arbitrary SQL in
          that position. orderBy.field is now validated against the source's
          columns (has_column) and rejected if it is not a known column,
          matching the column check the filter path already applies. Reported
          by Olaf via CPANSec's coordinated disclosure process.

    * Fixes
        - Filter's _compile_column guard used column_info() + an
          unless($info) die, but core's column_info throws "No such column"
          before that check could run, so the intended
          "DBIO::GraphQL::Filter: unknown column ..." message was
          unreachable. Switched to has_column (returns false instead of
          throwing), mirroring the orderBy fix above, so the clean
          GraphQL-level error message actually fires. karr #3.

    * Dependencies
        - Requires core DBIO >= 0.900001 (family-wide version alignment)

    * Project
        - Added SECURITY.md (CPAN Security Group guidelines v1.5.0)

0.900000  2026-06-23
    First release. Auto-generate an executable GraphQL schema from a connected DBIO schema.

    * Schema generation
        - DBIO::GraphQL->to_graphql($schema) introspects every source and
          returns an executable GraphQL::Schema with object types and
          relationship fields
        - One scalar field per column, typed (Int/Float/Boolean/String) from
          the column's data_type
        - Relationship fields: has_many resolves to a list, belongs_to and
          might_have to a single object
        - Composite primary keys supported throughout

    * Queries
        - Root Query with singular lookups and plural allXs queries
        - Nested per-column filtering (eq/not/gt/gte/lt/lte/in/like/contains/
          startsWith/endsWith/isNull) with recursive AND/OR combinators,
          mirroring the DBIO search-condition format
        - Per-scalar typed input filters (IntFilter, FloatFilter,
          StringFilter, BoolFilter); operator set follows the column type
        - Ordering (ASC/DESC) and both offset (page) and cursor pagination

    * Mutations
        - Root Mutation with createX, updateX, and deleteX per source

    * Architecture
        - Thin orchestrator over four focused modules: DBIO::GraphQL::ScalarMap
          (data_type to GraphQL scalar), DBIO::GraphQL::Filter (with ::Search
          and ::Null adapters, per-source filter input),
          DBIO::GraphQL::Relationship (relationship field resolution with
          strict relationship_info contract validation), and
          DBIO::GraphQL::Mutation

    * Acknowledgements
        - DBIO port of DBIx::Class::Schema::GraphQL by Mohammad Sajid Anwar
          (MANWAR); see ACKNOWLEDGEMENTS in the POD
