| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216 |
- package postgres
- import (
- "context"
- "fmt"
- )
- type MapExperienceRow struct {
- PlacePublicID string
- PlaceName string
- MapAssetPublicID string
- MapAssetName string
- MapCoverURL *string
- MapSummary *string
- TileBaseURL *string
- TileMetaURL *string
- EventPublicID *string
- EventDisplayName *string
- EventSummary *string
- EventStatus *string
- EventIsDefaultExperience bool
- EventShowInEventList bool
- EventReleasePayloadJSON *string
- EventPresentationID *string
- EventPresentationName *string
- EventPresentationType *string
- EventPresentationSchema *string
- EventContentBundleID *string
- EventContentBundleName *string
- EventContentEntryURL *string
- EventContentAssetRootURL *string
- EventContentMetadataJSON *string
- }
- func (s *Store) ListMapExperienceRows(ctx context.Context, limit int) ([]MapExperienceRow, error) {
- if limit <= 0 || limit > 200 {
- limit = 50
- }
- rows, err := s.pool.Query(ctx, `
- SELECT
- p.place_public_id,
- p.name,
- ma.map_asset_public_id,
- ma.name,
- COALESCE(ma.cover_url, p.cover_url) AS cover_url,
- COALESCE(ma.description, p.description) AS summary,
- tr.tile_base_url,
- tr.meta_url,
- e.event_public_id,
- e.display_name,
- e.summary,
- e.status,
- COALESCE(e.is_default_experience, false),
- COALESCE(e.show_in_event_list, true),
- er.payload_jsonb::text,
- ep.presentation_public_id,
- ep.name,
- ep.presentation_type,
- ep.schema_jsonb::text,
- cb.content_bundle_public_id,
- cb.name,
- cb.entry_url,
- cb.asset_root_url,
- cb.metadata_jsonb::text
- FROM map_assets ma
- JOIN places p ON p.id = ma.place_id
- LEFT JOIN tile_releases tr ON tr.id = ma.current_tile_release_id
- LEFT JOIN map_runtime_bindings mrb
- ON mrb.map_asset_id = ma.id
- AND mrb.status = 'active'
- LEFT JOIN event_releases er
- ON er.runtime_binding_id = mrb.id
- AND er.status = 'published'
- LEFT JOIN events e
- ON e.current_release_id = er.id
- AND e.status = 'active'
- LEFT JOIN event_presentations ep ON ep.id = er.presentation_id
- LEFT JOIN content_bundles cb ON cb.id = er.content_bundle_id
- WHERE ma.status = 'active'
- AND (e.id IS NULL OR e.show_in_event_list = true)
- ORDER BY p.name ASC, ma.name ASC, COALESCE(e.is_default_experience, false) DESC, e.display_name ASC
- LIMIT $1
- `, limit)
- if err != nil {
- return nil, fmt.Errorf("list map experience rows: %w", err)
- }
- defer rows.Close()
- items := make([]MapExperienceRow, 0, limit)
- for rows.Next() {
- var item MapExperienceRow
- if err := rows.Scan(
- &item.PlacePublicID,
- &item.PlaceName,
- &item.MapAssetPublicID,
- &item.MapAssetName,
- &item.MapCoverURL,
- &item.MapSummary,
- &item.TileBaseURL,
- &item.TileMetaURL,
- &item.EventPublicID,
- &item.EventDisplayName,
- &item.EventSummary,
- &item.EventStatus,
- &item.EventIsDefaultExperience,
- &item.EventShowInEventList,
- &item.EventReleasePayloadJSON,
- &item.EventPresentationID,
- &item.EventPresentationName,
- &item.EventPresentationType,
- &item.EventPresentationSchema,
- &item.EventContentBundleID,
- &item.EventContentBundleName,
- &item.EventContentEntryURL,
- &item.EventContentAssetRootURL,
- &item.EventContentMetadataJSON,
- ); err != nil {
- return nil, fmt.Errorf("scan map experience row: %w", err)
- }
- items = append(items, item)
- }
- if err := rows.Err(); err != nil {
- return nil, fmt.Errorf("iterate map experience rows: %w", err)
- }
- return items, nil
- }
- func (s *Store) ListMapExperienceRowsByMapPublicID(ctx context.Context, mapAssetPublicID string) ([]MapExperienceRow, error) {
- rows, err := s.pool.Query(ctx, `
- SELECT
- p.place_public_id,
- p.name,
- ma.map_asset_public_id,
- ma.name,
- COALESCE(ma.cover_url, p.cover_url) AS cover_url,
- COALESCE(ma.description, p.description) AS summary,
- tr.tile_base_url,
- tr.meta_url,
- e.event_public_id,
- e.display_name,
- e.summary,
- e.status,
- COALESCE(e.is_default_experience, false),
- COALESCE(e.show_in_event_list, true),
- er.payload_jsonb::text,
- ep.presentation_public_id,
- ep.name,
- ep.presentation_type,
- ep.schema_jsonb::text,
- cb.content_bundle_public_id,
- cb.name,
- cb.entry_url,
- cb.asset_root_url,
- cb.metadata_jsonb::text
- FROM map_assets ma
- JOIN places p ON p.id = ma.place_id
- LEFT JOIN tile_releases tr ON tr.id = ma.current_tile_release_id
- LEFT JOIN map_runtime_bindings mrb
- ON mrb.map_asset_id = ma.id
- AND mrb.status = 'active'
- LEFT JOIN event_releases er
- ON er.runtime_binding_id = mrb.id
- AND er.status = 'published'
- LEFT JOIN events e
- ON e.current_release_id = er.id
- AND e.status = 'active'
- LEFT JOIN event_presentations ep ON ep.id = er.presentation_id
- LEFT JOIN content_bundles cb ON cb.id = er.content_bundle_id
- WHERE ma.map_asset_public_id = $1
- AND ma.status = 'active'
- AND (e.id IS NULL OR e.show_in_event_list = true)
- ORDER BY COALESCE(e.is_default_experience, false) DESC, e.display_name ASC
- `, mapAssetPublicID)
- if err != nil {
- return nil, fmt.Errorf("list map experience rows by map public id: %w", err)
- }
- defer rows.Close()
- items := make([]MapExperienceRow, 0, 8)
- for rows.Next() {
- var item MapExperienceRow
- if err := rows.Scan(
- &item.PlacePublicID,
- &item.PlaceName,
- &item.MapAssetPublicID,
- &item.MapAssetName,
- &item.MapCoverURL,
- &item.MapSummary,
- &item.TileBaseURL,
- &item.TileMetaURL,
- &item.EventPublicID,
- &item.EventDisplayName,
- &item.EventSummary,
- &item.EventStatus,
- &item.EventIsDefaultExperience,
- &item.EventShowInEventList,
- &item.EventReleasePayloadJSON,
- &item.EventPresentationID,
- &item.EventPresentationName,
- &item.EventPresentationType,
- &item.EventPresentationSchema,
- &item.EventContentBundleID,
- &item.EventContentBundleName,
- &item.EventContentEntryURL,
- &item.EventContentAssetRootURL,
- &item.EventContentMetadataJSON,
- ); err != nil {
- return nil, fmt.Errorf("scan map experience detail row: %w", err)
- }
- items = append(items, item)
- }
- if err := rows.Err(); err != nil {
- return nil, fmt.Errorf("iterate map experience detail rows: %w", err)
- }
- return items, nil
- }
|