Skip to content

Tiqets Tags Implementation Plan

Status: COMPLETE ✓

Backend Completed: 2026-01-21 Front-end Completed: 2026-01-21 (implemented in tqweb/pub repository)

Commits: - a534058 - Add tag sync to TiqetsDataRefresher

All components are implemented. Tags can be synced via API or automatically during data refresh. Front-end tag strip UI is implemented in the separate tqweb/pub project.


Overview

Add tags and tag types from the Tiqets API to enable filtering experiences by "Activity categories" on the front-end.


1. Remote API Layer (tqtiqets) ✓ COMPLETE

New Files

File Description
remote/entity/TiqetsTag.java DTO: id, name, type_name, type_id, type_group_name
remote/entity/TiqetsTagType.java DTO: id, name, group_name
remote/service/response/TagsResponse.java Response wrapper with pagination
remote/service/response/TagTypesResponse.java Response wrapper
remote/service/TagsService.java GET /tag_types, GET /tags

2. Database Schema ✓ COMPLETE

Location: config/db/tiqets-schema.sql

CREATE SEQUENCE IF NOT EXISTS tiqets.tag_type_seq START WITH 1 INCREMENT BY 1;
CREATE SEQUENCE IF NOT EXISTS tiqets.tag_seq START WITH 1 INCREMENT BY 1;

CREATE TABLE IF NOT EXISTS tiqets.tag_type (
    id INTEGER NOT NULL DEFAULT nextval('tiqets.tag_type_seq'),
    supplier_tag_type_id INTEGER NOT NULL,
    name VARCHAR(255) NOT NULL,
    group_name VARCHAR(255),
    icon_url VARCHAR(500),
    hash BIGINT NOT NULL DEFAULT 0,
    last_update TIMESTAMP NOT NULL DEFAULT NOW(),
    PRIMARY KEY (id),
    CONSTRAINT uk_tiqets_tag_type_supplier_id UNIQUE (supplier_tag_type_id)
);

CREATE TABLE IF NOT EXISTS tiqets.tag (
    id INTEGER NOT NULL DEFAULT nextval('tiqets.tag_seq'),
    supplier_tag_id VARCHAR(30) NOT NULL,
    name VARCHAR(255) NOT NULL,
    supplier_tag_type_id INTEGER NOT NULL,
    type_name VARCHAR(255),
    type_group_name VARCHAR(255),
    icon_url VARCHAR(500),
    hash BIGINT NOT NULL DEFAULT 0,
    last_update TIMESTAMP NOT NULL DEFAULT NOW(),
    PRIMARY KEY (id),
    CONSTRAINT uk_tiqets_tag_supplier_id UNIQUE (supplier_tag_id)
);

3. JPA Entities (tqtiqets) ✓ COMPLETE

Files Created

File Description
db/TagTypeEntity.java JPA entity with initFromRemote(), named queries
db/TagEntity.java JPA entity with initFromRemote(), named queries

4. Canonical Entities (tqapp) ✓ COMPLETE

Files Created

File Fields
entity/product/CTagType.java tagTypeId, name, groupName, iconUrl
entity/product/CTag.java tagId, name, tagTypeId, typeName, typeGroupName, iconUrl

5. Service Layer Updates ✓ COMPLETE

TiqetsCatalogFacade.java ✓

  • syncTagTypes() - fetch from API, persist to DB
  • syncTags() - fetch paginated from API, persist to DB
  • listTagsNative(typeGroupName) - query tags from DB
  • listTagTypesNative() - query tag types from DB

TiqetsDataRefresher.java ✓

  • Added syncTags() helper method
  • Integrated into initialSync()
  • Integrated into refreshAll()
  • Integrated into refreshAllOptimized()

6. API Endpoints ✓ COMPLETE

TiqetsFacade.java ✓

  • listTags(typeGroupName) - returns List<CTag>
  • listTagTypes() - returns List<CTagType>

TiqetsApi.java ✓

  • POST /tiqets/tags - list tags with optional typeGroupName filter
  • POST /tiqets/tag-types - list all tag types
  • POST /tiqets/tags/sync - manually trigger tag sync (admin only)

api-roles.properties ✓

  • tiqets/tags=guest,agent,admin
  • tiqets/tag-types=guest,agent,admin
  • tiqets/tags/sync=admin

7. Front-End (tqweb/pub) ✓ COMPLETE

Implemented in separate repository: tqweb/pub

Tag Strip UI

  • Below hero image, above filter line
  • Scrollable strip with 8 tags visible
  • Left/right arrows for navigation
  • Click tag to filter experiences by tag_ids

Files Modified

  • Experience page HTML - tag strip container
  • js/modules/tickets.js - loadActivityTags(), filterByTag()
  • css/app.css - tag strip styling