Releases: DWTechs/Antity-pgsql.js
Releases · DWTechs/Antity-pgsql.js
support for direct SQL comparators
- Add support for direct SQL comparators (
=,<,>,<=,>=,<>,IS,IS NOT,IN,NOT IN,LIKE,NOT LIKE) as validmatchModevalues inFiltermapComparator()now passes through direct comparators without mappingmapIndexes()now wraps indexes in parentheses forINandNOT INcomparatorsshouldSkipValue()now allowsnullvalues forISandIS NOTcomparatorscheck.matchMode()now accepts direct comparators as valid for all property types
Fix audit column names for consumer nickname
- Fix audit column names for consumer nickname in generated SQL queries:
- INSERT queries (
query.insert(),query.upsert()) now writeconsumer.nicknameintocreatorNameinstead ofname - UPDATE queries (
query.update(),query.archive()) now writeconsumer.nicknameintoupdaterNameinstead ofname
- INSERT queries (
- Add double quotes around audit column names
creatorId,creatorName,updaterId,updaterNamein generated SQL queries to preserve camelCase
Fix audit column names
- Fix audit column names to use camelCase in generated SQL queries:
- INSERT queries (
query.insert(),query.upsert()) now write intocreatorIdinstead ofcreatorid - UPDATE queries (
query.update(),query.archive()) now write intoupdaterIdinstead ofupdaterid
- INSERT queries (
Rename audit columns
- Rename audit columns in INSERT and UPDATE queries to match database conventions:
- INSERT queries (
query.insert(),query.upsert()) now writeconsumer.idintocreatoridandconsumer.nicknameintonameinstead of"consumerId"/"consumerName" - UPDATE queries (
query.update(),query.archive()) now writeconsumer.idintoupdateridandconsumer.nicknameintonameinstead of"consumerId"/"consumerName"
- INSERT queries (
Single `consumer` object
- Replace separate
consumerId/consumerNameparameters with a singleconsumerobject ({ id?, nickname? }) across all relevant APIs:query.update(),query.insert(),query.upsert(),query.archive()now acceptconsumer?: { id?: number | string, nickname?: string }instead of two separate arguments- Express middlewares (
add,update,upsert,archive,sync) now readres.locals.consumer.idandres.locals.consumer.nicknameinstead ofres.locals.consumerId/res.locals.consumerName
Fix 'in' 'notin'
- Fix
notInmatch mode not working in filter SQL generation: - Add
"in"and"notIn"to allowed match modes fornumberandstring
Fix filters empty values
- Fix filter handling to exclude empty values from WHERE clauses:
- Filters with empty string values are now skipped
- Filters with empty arrays are now skipped
- Filters with null values are skipped except for
isandisNotmatch modes
Sync
- Add bulk sync functionality:
- New
sync()Express middleware atomically synchronises a table with the full provided row list inside a single PostgreSQL transaction (BEGIN / COMMIT / ROLLBACK on failure) - Incoming rows without an ID (or with an unknown ID) are inserted; rows with a known ID are updated; existing rows absent from the list are deleted
- Accepts optional
idFieldin request body (defaults to'id') to specify the identity column - Accepts optional
filtersin request body to scope the managed set — rows outside the filter are never touched - Returns synced rows with generated IDs in
res.locals.rows - Returns operation summary
{ inserted, updated, deleted }inres.locals.sync - Supports
consumerId/consumerNameforwarding for history tracking on inserts and updates
- New
- Add
syncArraySubstackgetter returning[normalizeArray, validateArray, sync]middleware chain
UPSERT
- Add UPSERT functionality using PostgreSQL's
INSERT ... ON CONFLICT ... DO UPDATEsyntax:- New
query.upsert()method generates upsert queries with configurable conflict targets - Supports single or multiple column conflict targets (e.g.,
'id'or['email', 'username']) - Properties with both
INSERTandUPDATEoperations are automatically included in upsert - Optionally includes
consumerIdandconsumerNamefor history tracking - Supports
RETURNINGclause to retrieve updated/inserted row IDs
- New
- Add
upsert()Express middleware for handling upsert operations:- Expects
rowsandconflictTargetin request body - Returns upserted rows with IDs in
res.locals.rows - Supports chunking for bulk operations
- Expects
- Add convenience Express substack middlewares:
upsertArraySubstack: Returns[normalizeArray, validateArray, upsert]middleware chainupsertOneSubstack: Returns[normalizeOne, validateOne, upsert]middleware chain
Add dedicated `Archive` query
- Add dedicated
Archivequery :- Replaces the previous approach of passing
archived: truethrough the genericUpdatequery - Generates a simplified
UPDATE ... SET archived = true WHERE id IN (...)query directly - Optionally appends
consumerIdandconsumerNameas single scalar values (not per-row CASE blocks)
- Replaces the previous approach of passing
- Add
query.archive()method toSQLEntityusing the newArchiveclass - Add
propertiesgetter toSQLEntityreturning the list ofPropertyinstances passed at construction