Skip to content

Cards

singularName: cardpluralName: cards

Schema

NameTypeDetails
card_typeenumerationone of [member, guest]
memberrelationmanyToOne → Members
guest_numberinteger
is_activeboolean
drink_redemptionsrelationoneToMany → Drink Redemption
card_uidstring

Lifecycles

beforeCreate (async)

Assigns a random UUID to card_uid and validates the card before creation. For member cards: checks the member is active and has no existing active card. For guest cards: auto-assigns the next guest_number if not set.

Parameters:

  • event:

afterCreate

Fires only for member cards when CARD_EMAILS_ENABLED=true. Generates the member card image and Google Wallet URL, then sends the card email via email-designer-5. Runs in setImmediate so the HTTP response is not blocked.

Parameters:

  • event:

Services

bulkCreateGuestCards (async)

Creates multiple guest cards with a continuous guest_number sequence, starting from the current maximum. The card_uid for each card is generated automatically by the card beforeCreate lifecycle hook.

Parameters:

  • count: - Number of guest cards to create.

Returns:

  • of created cards ordered by guest_number.

deactivateCard (async)

Deactivates a card by setting is_active to false. Returns null if no card with the given documentId exists.

Parameters:

  • documentId: - Strapi documentId of the card to deactivate.

Returns:

  • card, or null if not found.

buildBackgroundSVG

Builds an SVG buffer containing the card's coloured bands and white text. Bitmap images (logo, photo, QR) are composited on top by sharp separately. Coordinate mapping (pdf-lib y-up → screen y-down): screen_y = (CARD_H − pdf_y) × SCALE Key anchors at SCALE=3 (px): Header band : y=0..129 Body band : y=129..459 Photo : left=30 top=159 size=270 QR : left=501 top=231 size=198 Text x : 321 Name base : 159 + namePx × 0.72 CardNum base: 393 Date base : 429

generateQR (async)

Generates a QR code PNG buffer for value at sizePx resolution, compositing the favicon in the centre if available.

Parameters:

  • value: - Value to encode.
  • sizePx: - Output size in pixels.

Returns:

generateMemberCardImage (async)

Generate a PNG image of a member card identical in layout to the PDF version.

Parameters:

  • card: - card record from strapi.db.query, with member populated (member must include: alias, member_id, member_type, joined_date, image.url)

Returns:

  • buffer (729 × 459 px at SCALE=3)

fitFontSize

Returns the largest font size (stepping down by 0.5pt) at which text fits within maxW in a single line. Never goes below minSize.

Parameters:

  • text: - Text to measure.
  • font: - pdf-lib font object with widthOfTextAtSize.
  • maxW: - Maximum allowed width in points.
  • maxSize: - Starting (maximum) font size to try.
  • minSize: - Floor font size; returned if nothing else fits.

Returns:

  • fitting font size.

generateQRBuffer (async)

Generate a QR code PNG buffer for the given value. If sharp and favicon.png are available, composites the favicon in the centre.

Parameters:

  • value: - Value to encode (card_uid).

Returns:

drawCard

Draw a single card at position (cx, cy) — bottom-left corner in pdf-lib coords.

Parameters:

  • page: - pdf-lib PDFPage
  • cx: - x coordinate of card bottom-left
  • cy: - y coordinate of card bottom-left
  • cardData: -
  • font: - pdf-lib Helvetica font
  • boldFont: - pdf-lib HelveticaBold font
  • headerImg: - pdf-lib embedded header image, or null
  • memberPhoto: - pdf-lib embedded photo image, or null
  • qrImg: - pdf-lib embedded QR code image, or null

renderCardsToDoc (async)

Render an array of card rows into the PDF document. Each row is printed twice side-by-side (two copies per A4 row) with cut guides.

Parameters:

  • pdfDoc: - pdf-lib PDFDocument
  • rows: - [{ cardData, photo, qrImg }]
  • font: - Helvetica
  • boldFont: - HelveticaBold
  • headerImg: - Embedded header image or null

generateCardsPDF (async)

Generate a DIN-A4 PDF of member and/or guest cards. Each card is printed twice side-by-side per A4 row with dashed cut guides.

Parameters:

  • memberIds: - member_id values to include. Empty = no member filter.
  • guestNumbers: - guest_number values to include. Empty = no guest filter. Omit both to print all active cards.

Returns:

  • as a Node.js Buffer.

getLogoUrl (async)

Lazily generates a 660×660 PNG wallet logo by compositing the white club SVG onto a #880E4F background. Cached to disk after first generation. Returns the public URL, or null if sharp / the SVG is unavailable.

getHeroImageUrl (async)

Lazily generates a 1032×336 hero banner (wide format required by Google Wallet) with the white club SVG centred on a #880E4F background.

generateSaveToWalletUrl (async)

Generates a "Save to Google Wallet" URL for the given member card. Returns null gracefully when credentials are not configured. Required env vars: GOOGLE_WALLET_ISSUER_ID – numeric issuer ID from Google Pay Console GOOGLE_WALLET_CLIENT_EMAIL – service account e-mail address GOOGLE_WALLET_PRIVATE_KEY – service account private key (PEM); use \n for newlines when set in a .env file Optional: GOOGLE_WALLET_CLASS_ID – pass class suffix (default: klh_member_card) STRAPI_PUBLIC_URL – public base URL of this server, e.g. https://klharriettes.org — enables logo + member photo on the pass

Parameters:

  • card: - card record with member populated (including image.url)

Returns:

Released under the MIT License.