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 DBsyncTags()- fetch paginated from API, persist to DBlistTagsNative(typeGroupName)- query tags from DBlistTagTypesNative()- 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)- returnsList<CTag>listTagTypes()- returnsList<CTagType>
TiqetsApi.java ✓¶
POST /tiqets/tags- list tags with optional typeGroupName filterPOST /tiqets/tag-types- list all tag typesPOST /tiqets/tags/sync- manually trigger tag sync (admin only)
api-roles.properties ✓¶
tiqets/tags=guest,agent,admintiqets/tag-types=guest,agent,admintiqets/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