map_experience_store.go 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. package postgres
  2. import (
  3. "context"
  4. "fmt"
  5. )
  6. type MapExperienceRow struct {
  7. PlacePublicID string
  8. PlaceName string
  9. MapAssetPublicID string
  10. MapAssetName string
  11. MapCoverURL *string
  12. MapSummary *string
  13. TileBaseURL *string
  14. TileMetaURL *string
  15. EventPublicID *string
  16. EventDisplayName *string
  17. EventSummary *string
  18. EventStatus *string
  19. EventIsDefaultExperience bool
  20. EventShowInEventList bool
  21. EventReleasePayloadJSON *string
  22. EventPresentationID *string
  23. EventPresentationName *string
  24. EventPresentationType *string
  25. EventPresentationSchema *string
  26. EventContentBundleID *string
  27. EventContentBundleName *string
  28. EventContentEntryURL *string
  29. EventContentAssetRootURL *string
  30. EventContentMetadataJSON *string
  31. }
  32. func (s *Store) ListMapExperienceRows(ctx context.Context, limit int) ([]MapExperienceRow, error) {
  33. if limit <= 0 || limit > 200 {
  34. limit = 50
  35. }
  36. rows, err := s.pool.Query(ctx, `
  37. SELECT
  38. p.place_public_id,
  39. p.name,
  40. ma.map_asset_public_id,
  41. ma.name,
  42. COALESCE(ma.cover_url, p.cover_url) AS cover_url,
  43. COALESCE(ma.description, p.description) AS summary,
  44. tr.tile_base_url,
  45. tr.meta_url,
  46. e.event_public_id,
  47. e.display_name,
  48. e.summary,
  49. e.status,
  50. COALESCE(e.is_default_experience, false),
  51. COALESCE(e.show_in_event_list, true),
  52. er.payload_jsonb::text,
  53. ep.presentation_public_id,
  54. ep.name,
  55. ep.presentation_type,
  56. ep.schema_jsonb::text,
  57. cb.content_bundle_public_id,
  58. cb.name,
  59. cb.entry_url,
  60. cb.asset_root_url,
  61. cb.metadata_jsonb::text
  62. FROM map_assets ma
  63. JOIN places p ON p.id = ma.place_id
  64. LEFT JOIN tile_releases tr ON tr.id = ma.current_tile_release_id
  65. LEFT JOIN map_runtime_bindings mrb
  66. ON mrb.map_asset_id = ma.id
  67. AND mrb.status = 'active'
  68. LEFT JOIN event_releases er
  69. ON er.runtime_binding_id = mrb.id
  70. AND er.status = 'published'
  71. LEFT JOIN events e
  72. ON e.current_release_id = er.id
  73. AND e.status = 'active'
  74. LEFT JOIN event_presentations ep ON ep.id = er.presentation_id
  75. LEFT JOIN content_bundles cb ON cb.id = er.content_bundle_id
  76. WHERE ma.status = 'active'
  77. AND (e.id IS NULL OR e.show_in_event_list = true)
  78. ORDER BY p.name ASC, ma.name ASC, COALESCE(e.is_default_experience, false) DESC, e.display_name ASC
  79. LIMIT $1
  80. `, limit)
  81. if err != nil {
  82. return nil, fmt.Errorf("list map experience rows: %w", err)
  83. }
  84. defer rows.Close()
  85. items := make([]MapExperienceRow, 0, limit)
  86. for rows.Next() {
  87. var item MapExperienceRow
  88. if err := rows.Scan(
  89. &item.PlacePublicID,
  90. &item.PlaceName,
  91. &item.MapAssetPublicID,
  92. &item.MapAssetName,
  93. &item.MapCoverURL,
  94. &item.MapSummary,
  95. &item.TileBaseURL,
  96. &item.TileMetaURL,
  97. &item.EventPublicID,
  98. &item.EventDisplayName,
  99. &item.EventSummary,
  100. &item.EventStatus,
  101. &item.EventIsDefaultExperience,
  102. &item.EventShowInEventList,
  103. &item.EventReleasePayloadJSON,
  104. &item.EventPresentationID,
  105. &item.EventPresentationName,
  106. &item.EventPresentationType,
  107. &item.EventPresentationSchema,
  108. &item.EventContentBundleID,
  109. &item.EventContentBundleName,
  110. &item.EventContentEntryURL,
  111. &item.EventContentAssetRootURL,
  112. &item.EventContentMetadataJSON,
  113. ); err != nil {
  114. return nil, fmt.Errorf("scan map experience row: %w", err)
  115. }
  116. items = append(items, item)
  117. }
  118. if err := rows.Err(); err != nil {
  119. return nil, fmt.Errorf("iterate map experience rows: %w", err)
  120. }
  121. return items, nil
  122. }
  123. func (s *Store) ListMapExperienceRowsByMapPublicID(ctx context.Context, mapAssetPublicID string) ([]MapExperienceRow, error) {
  124. rows, err := s.pool.Query(ctx, `
  125. SELECT
  126. p.place_public_id,
  127. p.name,
  128. ma.map_asset_public_id,
  129. ma.name,
  130. COALESCE(ma.cover_url, p.cover_url) AS cover_url,
  131. COALESCE(ma.description, p.description) AS summary,
  132. tr.tile_base_url,
  133. tr.meta_url,
  134. e.event_public_id,
  135. e.display_name,
  136. e.summary,
  137. e.status,
  138. COALESCE(e.is_default_experience, false),
  139. COALESCE(e.show_in_event_list, true),
  140. er.payload_jsonb::text,
  141. ep.presentation_public_id,
  142. ep.name,
  143. ep.presentation_type,
  144. ep.schema_jsonb::text,
  145. cb.content_bundle_public_id,
  146. cb.name,
  147. cb.entry_url,
  148. cb.asset_root_url,
  149. cb.metadata_jsonb::text
  150. FROM map_assets ma
  151. JOIN places p ON p.id = ma.place_id
  152. LEFT JOIN tile_releases tr ON tr.id = ma.current_tile_release_id
  153. LEFT JOIN map_runtime_bindings mrb
  154. ON mrb.map_asset_id = ma.id
  155. AND mrb.status = 'active'
  156. LEFT JOIN event_releases er
  157. ON er.runtime_binding_id = mrb.id
  158. AND er.status = 'published'
  159. LEFT JOIN events e
  160. ON e.current_release_id = er.id
  161. AND e.status = 'active'
  162. LEFT JOIN event_presentations ep ON ep.id = er.presentation_id
  163. LEFT JOIN content_bundles cb ON cb.id = er.content_bundle_id
  164. WHERE ma.map_asset_public_id = $1
  165. AND ma.status = 'active'
  166. AND (e.id IS NULL OR e.show_in_event_list = true)
  167. ORDER BY COALESCE(e.is_default_experience, false) DESC, e.display_name ASC
  168. `, mapAssetPublicID)
  169. if err != nil {
  170. return nil, fmt.Errorf("list map experience rows by map public id: %w", err)
  171. }
  172. defer rows.Close()
  173. items := make([]MapExperienceRow, 0, 8)
  174. for rows.Next() {
  175. var item MapExperienceRow
  176. if err := rows.Scan(
  177. &item.PlacePublicID,
  178. &item.PlaceName,
  179. &item.MapAssetPublicID,
  180. &item.MapAssetName,
  181. &item.MapCoverURL,
  182. &item.MapSummary,
  183. &item.TileBaseURL,
  184. &item.TileMetaURL,
  185. &item.EventPublicID,
  186. &item.EventDisplayName,
  187. &item.EventSummary,
  188. &item.EventStatus,
  189. &item.EventIsDefaultExperience,
  190. &item.EventShowInEventList,
  191. &item.EventReleasePayloadJSON,
  192. &item.EventPresentationID,
  193. &item.EventPresentationName,
  194. &item.EventPresentationType,
  195. &item.EventPresentationSchema,
  196. &item.EventContentBundleID,
  197. &item.EventContentBundleName,
  198. &item.EventContentEntryURL,
  199. &item.EventContentAssetRootURL,
  200. &item.EventContentMetadataJSON,
  201. ); err != nil {
  202. return nil, fmt.Errorf("scan map experience detail row: %w", err)
  203. }
  204. items = append(items, item)
  205. }
  206. if err := rows.Err(); err != nil {
  207. return nil, fmt.Errorf("iterate map experience detail rows: %w", err)
  208. }
  209. return items, nil
  210. }