From 828dd5a2f52ea058f1af2d119a596c35ba79fa9f Mon Sep 17 00:00:00 2001 From: riddim-developer-bot Date: Fri, 12 Jun 2026 15:28:36 -0400 Subject: [PATCH 1/6] =?UTF-8?q?[EPAC-818]:=20WIP=20=E2=80=94=20recovered?= =?UTF-8?q?=20from=20canceled?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/architecture/use-case-catalog.md | 48 +++++++++++ ios/epac/Model/ParliamentaryTopic.swift | 1 + ios/epac/Model/Senator.swift | 33 +++++++ ios/epac/Util/SenatorsService.swift | 85 +++++++++++++++++-- ios/epac/Views/Home/HomeFeedView.swift | 22 +---- ios/epac/Views/Senate/SenatorCard.swift | 60 ++++++++++--- ios/epac/en.lproj/Localizable.strings | 6 +- ios/epac/fr.lproj/Localizable.strings | 6 +- ios/epacTests/LoadHomeFeedTests.swift | 54 +++++++++++- ios/epacTests/ModelTests.swift | 8 ++ ios/epacTests/SnapshotTests.swift | 30 +++++++ .../topic_taxonomy/generate_topic_taxonomy.py | 2 +- .../topic-taxonomy/parliamentary_topics.json | 14 +++ 13 files changed, 325 insertions(+), 44 deletions(-) diff --git a/docs/architecture/use-case-catalog.md b/docs/architecture/use-case-catalog.md index c76f34b9..72c1d87d 100644 --- a/docs/architecture/use-case-catalog.md +++ b/docs/architecture/use-case-catalog.md @@ -22,6 +22,8 @@ For the Clean Architecture shape this catalog assumes, see [`docs/architecture/` | `RecordedVote` | A House of Commons division record with date, bill reference, result, and member ballot. | | `MemberID` | The stable source identifier used to address a ParliamentMember across backend artifacts. | | `ParliamentMember` | An elected Member of Parliament with riding, party, and contact info. | +| `Senator` | An appointed Senator with province, declared caucus affiliation, Senate profile URL, and appointment facts when available. | +| `SenateAppointment` | Appointment facts for a Senator: date, appointing prime minister, represented province, declared affiliation, and Privy Council Office source URL. | | `Sitting` | A House sitting date with Parliament/session metadata and source URL. | | `Bill` | A Parliament of Canada bill with number, title, stage, sponsor, and LEGISinfo source URL. | | `BillVersion` | Backend-only bill publication/version row with source links for text, PDF, and XML artifacts. | @@ -92,6 +94,7 @@ to the issue that will build the missing artifact. | `MemberRepository` | backend Go | outbound | Implemented: `backend/members/internal/usecase/members.go`; adapter: `backend/members/internal/adapter/sqlite/repository.go`. | List members and load member-profile attendance rows from the verified members SQLite artifact. | | `MemberContentRepository` | backend Go | outbound | Implemented: `backend/member-speeches/internal/usecase/usecase.go` with adapter `backend/member-speeches/internal/adapter/artifact/artifact.go`; `backend/member-votes/main.go` has a local vote-feed interface implemented by `S3ArtifactMemberContentRepository`. | Load per-member append-only content feeds such as speeches and recorded votes. There is no iOS Swift protocol with this name today. | | `TopicPreferenceStore` | iOS Swift | outbound | Implemented: `ios/epac/Domain/Ports/TopicPreferenceStore.swift`; adapter: `ios/epac/Data/Adapters/TopicFollowStoreAdapter.swift`. | Read and persist followed topic IDs as a Domain-layer port. | +| `SenatorAppointmentQueryPort` | iOS Swift | outbound | Implemented by existing `HomeFeedRepository.fetchSenators(for:)`; adapter: `ios/epac/Data/Repositories/HomeFeedSwiftDataRepository.swift` using `ios/epac/Util/SenatorsService.swift`. | Load province-filtered senator appointment context for Home and My MP surfaces. | | `DeviceSubscriptionRepository` | backend Go | outbound | Implemented: `backend/push-notification-dispatcher/internal/usecase/dispatch_push_notification.go`; adapter: `backend/push-notification-dispatcher/internal/adapter/postgres/subscriptions.go`. | List device subscriptions eligible for the current internal notification fan-out. | | `PushNotificationClient` | backend Go | outbound | Implemented: `backend/push-notification-dispatcher/internal/usecase/dispatch_push_notification.go`; adapter: `backend/push-notification-dispatcher/internal/adapter/apns/client.go`. | Deliver a typed push payload to a subscribed device through APNs. | | `HansardSearchProviding` | iOS Swift | outbound | Implemented: `ios/epac/Util/HansardSearchService.swift`; conformer: `BackendHansardSearchService`. | Search Hansard through the backend search endpoint from iOS presentation code. | @@ -781,6 +784,51 @@ Current implementation: --- +### TrackSenateAppointments + +``` +Actor: Backend ingestion job / iOS app +Goal: Keep current Senator rows associated with appointment date, appointing prime minister, province, declared affiliation, and Orders in Council source. +Inputs: Senator roster/appointment payload from backend or existing Senate roster adapter. +Outputs: Senator values with optional SenateAppointment facts. +Entities / values: Senator, SenateAppointment. +Ports: iOS Swift: `SenatorAppointmentQueryPort`. +Primary adapters: SenatorsService, HomeFeedSwiftDataRepository, SenatorCard, MyMPView, HomeFeedView. +Current implementation: + ios/epac/Model/Senator.swift + ios/epac/Util/SenatorsService.swift + ios/epac/Data/Repositories/HomeFeedSwiftDataRepository.swift + ios/epac/Views/Senate/SenatorCard.swift + ios/epac/Views/MyMP/MyMPView.swift + ios/epac/Views/Home/HomeFeedView.swift +``` + +> **Boundary note:** iOS decodes typed appointment fields when the roster payload includes them and does not scrape PCO or Senate HTML. Backend ingestion/parsing remains outside the iOS adapter. + +--- + +### LoadAppointingPM + +``` +Actor: User (iOS app, Home / My MP) +Goal: See which prime minister appointed each province Senator and when, with their declared affiliation and PCO Orders in Council citation. +Inputs: User's saved MP province. +Outputs: Province-filtered Senator cards with appointment summary and source link. +Entities / values: Senator, SenateAppointment. +Ports: iOS Swift: `SenatorAppointmentQueryPort`. +Primary adapters: LoadHomeFeed, HomeFeedSwiftDataRepository, SenatorCard, MyMPView, HomeFeedView. +Current implementation: + ios/epac/Domain/UseCases/LoadHomeFeed.swift + ios/epac/Data/Repositories/HomeFeedSwiftDataRepository.swift + ios/epac/Views/Senate/SenatorCard.swift + ios/epac/Views/MyMP/MyMPView.swift + ios/epac/Views/Home/HomeFeedView.swift +``` + +> **Notification note:** Senate appointment notification eligibility uses the canonical `senate` topic ID added to `shared/topic-taxonomy/parliamentary_topics.json`; existing topic-follow storage carries that ID through device preferences. + +--- + ### FollowTopic ``` diff --git a/ios/epac/Model/ParliamentaryTopic.swift b/ios/epac/Model/ParliamentaryTopic.swift index 0b095116..9f746357 100644 --- a/ios/epac/Model/ParliamentaryTopic.swift +++ b/ios/epac/Model/ParliamentaryTopic.swift @@ -34,6 +34,7 @@ struct ParliamentaryTopic: Identifiable, Codable, Hashable, Sendable { ParliamentaryTopic(id: "childcare", nameKey: "topic.childcare", keywords: ["child care", "daycare", "family", "children", "services de garde", "enfant"]), ParliamentaryTopic(id: "energy", nameKey: "topic.energy", keywords: ["energy", "oil", "gas", "pipeline", "electricity", "LNG", "pétrole"]), ParliamentaryTopic(id: "naturalresources", nameKey: "topic.naturalResources", keywords: ["natural resources", "forestry", "forest", "lumber", "timber", "mining", "minerals", "mineral production", "potash", "wood harvest", "ressources naturelles", "foresterie", "mines"]), + ParliamentaryTopic(id: "senate", nameKey: "topic.senate", keywords: ["senate", "senator", "senators", "upper chamber", "sénat", "sénateur", "sénatrice"]), ParliamentaryTopic(id: "pharma", nameKey: "topic.pharma", keywords: ["drug", "pharmaceutical", "medication", "opioid", "naloxone", "médicament"]), ParliamentaryTopic(id: "digital", nameKey: "topic.digital", keywords: ["digital", "artificial intelligence", "AI", "online harms", "privacy", "cybersecurity", "numérique"]), ParliamentaryTopic(id: "labour", nameKey: "topic.labour", keywords: ["labour", "labor", "union", "strike", "wage", "employment", "travail", "grève"]), diff --git a/ios/epac/Model/Senator.swift b/ios/epac/Model/Senator.swift index c5b69108..09b58eea 100644 --- a/ios/epac/Model/Senator.swift +++ b/ios/epac/Model/Senator.swift @@ -23,6 +23,7 @@ struct Senator: Identifiable, Codable { let caucusFullName: String // e.g. "Independent Senators Group" let senateURL: URL // link to Senate profile page let appointedDate: Date? + let appointment: SenateAppointment? var caucusColor: Color { switch caucus.uppercased() { @@ -33,4 +34,36 @@ struct Senator: Identifiable, Codable { default: return Color(UIColor.systemGray) } } + + var appointmentDate: Date? { + appointment?.date ?? appointedDate + } + + var appointmentSourceURL: URL { + appointment?.sourceURL ?? SenateAppointment.defaultSourceURL + } +} + +struct SenateAppointment: Codable, Equatable { + static let defaultSourceURL = URL(string: "https://pco-bcp.gc.ca/oic-ddc")! + + let date: Date + let appointingPrimeMinister: String? + let province: String + let declaredAffiliation: String + let sourceURL: URL + + init( + date: Date, + appointingPrimeMinister: String?, + province: String, + declaredAffiliation: String, + sourceURL: URL = Self.defaultSourceURL + ) { + self.date = date + self.appointingPrimeMinister = appointingPrimeMinister + self.province = province + self.declaredAffiliation = declaredAffiliation + self.sourceURL = sourceURL + } } diff --git a/ios/epac/Util/SenatorsService.swift b/ios/epac/Util/SenatorsService.swift index ba2327ba..a32f4fa2 100644 --- a/ios/epac/Util/SenatorsService.swift +++ b/ios/epac/Util/SenatorsService.swift @@ -90,9 +90,50 @@ struct SenatorsService { let senateURL = URL(string: urlStr) ?? URL(string: "https://sencanada.ca/en/senators/")! - var date: Date? - if let dateStr = item["StartDate"] as? String { - date = ISO8601DateFormatter().date(from: dateStr) + let appointmentPayload = item["appointment"] as? [String: Any] ?? item + let appointmentDateValue = stringValue( + forAnyKey: ["appointment_date", "appointed_date", "date", "StartDate"], + in: appointmentPayload + ) ?? stringValue(forAnyKey: ["appointment_date", "appointed_date", "StartDate"], in: item) + let date = parseDate( + appointmentDateValue + ) + let primeMinisterKeys = [ + "appointing_prime_minister", + "appointing_pm", + "appointed_by", + "prime_minister", + "prime_minister_name", + "PrimeMinisterName" + ] + let appointingPrimeMinister = stringValue(forAnyKey: primeMinisterKeys, in: appointmentPayload) + ?? stringValue(forAnyKey: primeMinisterKeys, in: item) + let sourceURLKeys = [ + "source_url", + "orders_in_council_url", + "order_in_council_url", + "OrderInCouncilURL" + ] + let sourceURL = urlValue(forAnyKey: sourceURLKeys, in: appointmentPayload) + ?? urlValue(forAnyKey: sourceURLKeys, in: item) + ?? SenateAppointment.defaultSourceURL + let affiliationKeys = [ + "declared_affiliation", + "affiliation", + "caucus_full_name", + "CaucusNameEn" + ] + let declaredAffiliation = stringValue(forAnyKey: affiliationKeys, in: appointmentPayload) + ?? stringValue(forAnyKey: affiliationKeys, in: item) + ?? caucusFull + let appointment = date.map { + SenateAppointment( + date: $0, + appointingPrimeMinister: appointingPrimeMinister, + province: abbrev, + declaredAffiliation: declaredAffiliation, + sourceURL: sourceURL + ) } return Senator( @@ -103,7 +144,8 @@ struct SenatorsService { caucus: caucus, caucusFullName: caucusFull, senateURL: senateURL, - appointedDate: date + appointedDate: date, + appointment: appointment ) } } @@ -160,7 +202,8 @@ struct SenatorsService { caucus: caucus, caucusFullName: caucus, senateURL: senateURL, - appointedDate: nil + appointedDate: nil, + appointment: nil ) } @@ -175,6 +218,38 @@ struct SenatorsService { return String(block[range]) } + private static func stringValue(forAnyKey keys: [String], in item: [String: Any]) -> String? { + for key in keys { + if let value = item[key] as? String { + let trimmed = value.trimmingCharacters(in: .whitespacesAndNewlines) + if !trimmed.isEmpty { return trimmed } + } + } + return nil + } + + private static func urlValue(forAnyKey keys: [String], in item: [String: Any]) -> URL? { + guard let rawValue = stringValue(forAnyKey: keys, in: item) else { return nil } + return URL(string: rawValue) + } + + private static func parseDate(_ rawValue: String?) -> Date? { + guard let rawValue else { return nil } + if let date = ISO8601DateFormatter().date(from: rawValue) { + return date + } + return dateOnlyFormatter.date(from: rawValue) + } + + private static let dateOnlyFormatter: DateFormatter = { + let formatter = DateFormatter() + formatter.calendar = Calendar(identifier: .gregorian) + formatter.locale = Locale(identifier: "en_US_POSIX") + formatter.timeZone = TimeZone(secondsFromGMT: 0) + formatter.dateFormat = "yyyy-MM-dd" + return formatter + }() + // MARK: - Province mapping private static func provinceAbbrev(_ full: String) -> String { diff --git a/ios/epac/Views/Home/HomeFeedView.swift b/ios/epac/Views/Home/HomeFeedView.swift index 7798e5d6..8fb7c536 100644 --- a/ios/epac/Views/Home/HomeFeedView.swift +++ b/ios/epac/Views/Home/HomeFeedView.swift @@ -526,27 +526,7 @@ struct HomeFeedView: View { private var senatorsSection: some View { Section(header: Text(NSLocalizedString("senate.mySenators.title", comment: "")).accessibilityAddTraits(.isHeader)) { ForEach(mySenators.prefix(HomeFeedLayout.senatorsLimit)) { senator in - Link(destination: senator.senateURL) { - HStack(spacing: HomeFeedLayout.senatorRowSpacing) { - Circle() - .fill(senator.caucusColor.opacity(HomeFeedLayout.senatorDotOpacity)) - .frame(width: HomeFeedLayout.senatorDotSize, height: HomeFeedLayout.senatorDotSize) - VStack(alignment: .leading, spacing: HomeFeedLayout.senatorTextSpacing) { - Text(senator.name) - .font(.subheadline) - .foregroundStyle(.primary) - Text(senator.caucusFullName) - .font(.caption2) - .foregroundStyle(.secondary) - .fixedSize(horizontal: false, vertical: true) - } - Spacer() - Image(systemName: "arrow.up.right.square") - .font(.epacCaption) - .foregroundStyle(Color.epacText.tertiary) - } - } - .accessibilityLabel("\(senator.name), \(senator.caucusFullName)") + SenatorCard(senator: senator) } } } diff --git a/ios/epac/Views/Senate/SenatorCard.swift b/ios/epac/Views/Senate/SenatorCard.swift index 404325fd..521da76c 100644 --- a/ios/epac/Views/Senate/SenatorCard.swift +++ b/ios/epac/Views/Senate/SenatorCard.swift @@ -18,31 +18,63 @@ struct SenatorCard: View { let senator: Senator var body: some View { - Link(destination: senator.senateURL) { - HStack(spacing: Layout.rowSpacing) { - Circle() - .fill(senator.caucusColor) - .frame(width: Layout.caucusDotSize, height: Layout.caucusDotSize) - .accessibilityHidden(true) - VStack(alignment: .leading, spacing: EpacSpacing.xxs) { - Text(String(format: NSLocalizedString("senate.card.name", comment: ""), senator.name)) - .font(.subheadline.weight(.semibold)) - Text(senator.caucusFullName) + HStack(alignment: .top, spacing: Layout.rowSpacing) { + Circle() + .fill(senator.caucusColor) + .frame(width: Layout.caucusDotSize, height: Layout.caucusDotSize) + .padding(.top, EpacSpacing.xxs) + .accessibilityHidden(true) + VStack(alignment: .leading, spacing: EpacSpacing.xxs) { + Text(String(format: NSLocalizedString("senate.card.name", comment: ""), senator.name)) + .font(.subheadline.weight(.semibold)) + Text(senator.caucusFullName) + .font(.caption2) + .foregroundStyle(.secondary) + if let appointmentSummary { + Text(appointmentSummary) .font(.caption2) .foregroundStyle(.secondary) + .fixedSize(horizontal: false, vertical: true) + Link(destination: senator.appointmentSourceURL) { + Label(NSLocalizedString("senate.card.source", comment: ""), systemImage: "doc.text") + .font(.caption2) + } } - Spacer() + } + .fixedSize(horizontal: false, vertical: true) + Spacer() + Link(destination: senator.senateURL) { Image(systemName: "arrow.up.right.square") .foregroundStyle(.secondary) .font(.caption) - .accessibilityHidden(true) } - .padding(.vertical, EpacSpacing.xxs) + .accessibilityLabel(String(format: NSLocalizedString("senate.card.name", comment: ""), senator.name)) } + .padding(.vertical, EpacSpacing.xxs) .foregroundStyle(.primary) .accessibilityLabel( String(format: NSLocalizedString("senate.card.accessibility", comment: ""), - senator.name, senator.caucusFullName) + senator.name, senator.caucusFullName, appointmentSummary ?? "") ) } + + private var appointmentSummary: String? { + guard let date = senator.appointmentDate else { return nil } + let formattedDate = Self.appointmentDateFormatter.string(from: date) + if let primeMinister = senator.appointment?.appointingPrimeMinister, !primeMinister.isEmpty { + return String( + format: NSLocalizedString("senate.card.appointed", comment: ""), + primeMinister, + formattedDate + ) + } + return String(format: NSLocalizedString("senate.card.appointedUnknownPM", comment: ""), formattedDate) + } + + private static let appointmentDateFormatter: DateFormatter = { + let formatter = DateFormatter() + formatter.dateStyle = .medium + formatter.timeStyle = .none + return formatter + }() } diff --git a/ios/epac/en.lproj/Localizable.strings b/ios/epac/en.lproj/Localizable.strings index 1019b490..a89f1a68 100644 --- a/ios/epac/en.lproj/Localizable.strings +++ b/ios/epac/en.lproj/Localizable.strings @@ -346,6 +346,7 @@ "topic.childcare" = "Child Care"; "topic.energy" = "Energy"; "topic.naturalResources" = "Natural Resources"; +"topic.senate" = "Senate"; "topic.pharma" = "Pharmaceuticals"; "topic.digital" = "Digital & AI"; "topic.labour" = "Labour"; @@ -462,7 +463,10 @@ "senate.mySenators.title" = "My Senators"; "senate.mySenators.empty" = "No senators found for this province."; "senate.card.name" = "Senator %@"; -"senate.card.accessibility" = "Senator %@, %@"; +"senate.card.appointed" = "Appointed by %@ on %@"; +"senate.card.appointedUnknownPM" = "Appointed on %@"; +"senate.card.source" = "Privy Council Office — Orders in Council"; +"senate.card.accessibility" = "Senator %@, %@, %@"; /* Ontario Legislature */ "ontario.debates.navTitle" = "Queen's Park Debates"; diff --git a/ios/epac/fr.lproj/Localizable.strings b/ios/epac/fr.lproj/Localizable.strings index 5ea907af..025bf906 100644 --- a/ios/epac/fr.lproj/Localizable.strings +++ b/ios/epac/fr.lproj/Localizable.strings @@ -348,6 +348,7 @@ "topic.childcare" = "Services de garde"; "topic.energy" = "Énergie"; "topic.naturalResources" = "Ressources naturelles"; +"topic.senate" = "Sénat"; "topic.pharma" = "Produits pharmaceutiques"; "topic.digital" = "Numérique et IA"; "topic.labour" = "Travail"; @@ -464,7 +465,10 @@ "senate.mySenators.title" = "Mes sénateurs"; "senate.mySenators.empty" = "Aucun sénateur trouvé pour cette province."; "senate.card.name" = "Sénateur(trice) %@"; -"senate.card.accessibility" = "Sénateur(trice) %@, %@"; +"senate.card.appointed" = "Nommé(e) par %@ le %@"; +"senate.card.appointedUnknownPM" = "Nommé(e) le %@"; +"senate.card.source" = "Bureau du Conseil privé — décrets"; +"senate.card.accessibility" = "Sénateur(trice) %@, %@, %@"; /* Assemblée législative de l'Ontario */ "ontario.debates.navTitle" = "Débats de Queen's Park"; diff --git a/ios/epacTests/LoadHomeFeedTests.swift b/ios/epacTests/LoadHomeFeedTests.swift index 6ea6c7c8..b2b56d61 100644 --- a/ios/epacTests/LoadHomeFeedTests.swift +++ b/ios/epacTests/LoadHomeFeedTests.swift @@ -79,6 +79,57 @@ final class LoadHomeFeedTests: XCTestCase { XCTAssertEqual(snapshot.latestSpeechHighlight?.memberName, "Jane Smith") XCTAssertEqual(snapshot.latestSpeechHighlight?.subjectTitle, "Budget Debate") } + + func testLoadHomeFeedIncludesProvinceSenateAppointments() async throws { + let clock = MockClock(date: Date()) + let repository = MockHomeFeedRepository() + let followPrefs = MockFollowPreferenceReading(savedMemberName: "Jane Smith") + let appointmentDate = try XCTUnwrap(Self.dateFormatter.date(from: "2024-12-19")) + let appointment = SenateAppointment( + date: appointmentDate, + appointingPrimeMinister: "Justin Trudeau", + province: "ON", + declaredAffiliation: "Independent Senators Group" + ) + repository.membersToReturn = [ + HomeFollowedMember(memberID: 42, name: "Jane Smith", lastName: "Smith", provinceCode: "ON") + ] + repository.senatorsToReturn = [ + Senator( + id: "test-senator-on", + firstName: "Jane", + lastName: "Senator", + province: "ON", + caucus: "ISG", + caucusFullName: "Independent Senators Group", + senateURL: URL(string: "https://sencanada.ca/en/senators/test")!, + appointedDate: appointmentDate, + appointment: appointment + ) + ] + + let useCase = LoadHomeFeed( + repository: repository, + followPreferenceReading: followPrefs, + clock: clock + ) + + let snapshot = await useCase.execute() + + XCTAssertEqual(snapshot.civicContext.provinceAbbrev, "ON") + XCTAssertEqual(snapshot.civicContext.mySenators.count, 1) + XCTAssertEqual(snapshot.civicContext.mySenators.first?.appointment?.appointingPrimeMinister, "Justin Trudeau") + XCTAssertEqual(snapshot.civicContext.mySenators.first?.appointment?.declaredAffiliation, "Independent Senators Group") + } + + private static let dateFormatter: DateFormatter = { + let formatter = DateFormatter() + formatter.calendar = Calendar(identifier: .gregorian) + formatter.locale = Locale(identifier: "en_US_POSIX") + formatter.timeZone = TimeZone(secondsFromGMT: 0) + formatter.dateFormat = "yyyy-MM-dd" + return formatter + }() } // MARK: - Mocks @@ -95,6 +146,7 @@ class MockHomeFeedRepository: HomeFeedRepository { var hansardsToReturn: [HomeHansardRecord] = [] var voteToReturn: HomeVoteRecord? var memberVoteToReturn: HomeMemberVoteRecord? + var senatorsToReturn: [Senator] = [] func fetchSittingDates() async throws -> [Date] { [] } func fetchAllMembers() async throws -> [HomeFollowedMember] { membersToReturn } @@ -103,7 +155,7 @@ class MockHomeFeedRepository: HomeFeedRepository { func fetchHansards(between start: Date, and end: Date) async throws -> [HomeHansardRecord] { [] } func fetchLatestVote() async throws -> HomeVoteRecord? { voteToReturn } func fetchMemberVote(memberID: Int, voteID: Int) async throws -> HomeMemberVoteRecord? { memberVoteToReturn } - func fetchSenators(for provinceAbbrev: String) async throws -> [Senator] { [] } + func fetchSenators(for provinceAbbrev: String) async throws -> [Senator] { senatorsToReturn } } @MainActor diff --git a/ios/epacTests/ModelTests.swift b/ios/epacTests/ModelTests.swift index f141ea9e..36ad228d 100644 --- a/ios/epacTests/ModelTests.swift +++ b/ios/epacTests/ModelTests.swift @@ -31,4 +31,12 @@ struct ModelTests { #expect(Province(rawValue: "Quebec") == .Quebec) #expect(Province(rawValue: "Saskatchewan") == .Saskatchewan) } + + @Test func senateTopicAvailableForAppointmentNotifications() { + let senate = ParliamentaryTopic.all.first { $0.id == "senate" } + + #expect(senate?.nameKey == "topic.senate") + #expect(senate?.keywords.contains("senator") == true) + #expect(ParliamentaryTopic.matching("The PM has appointed a new senator").map(\.id).contains("senate")) + } } diff --git a/ios/epacTests/SnapshotTests.swift b/ios/epacTests/SnapshotTests.swift index b4755c9d..d89a7aa2 100644 --- a/ios/epacTests/SnapshotTests.swift +++ b/ios/epacTests/SnapshotTests.swift @@ -79,6 +79,25 @@ final class SnapshotTests: XCTestCase { ) } + private static var senatorWithAppointment: Senator { + Senator( + id: "sample-senator-on", + firstName: "Jane", + lastName: "Senator", + province: "ON", + caucus: "ISG", + caucusFullName: "Independent Senators Group", + senateURL: URL(string: "https://sencanada.ca/en/senators/sample")!, + appointedDate: date("2024-12-19"), + appointment: SenateAppointment( + date: date("2024-12-19"), + appointingPrimeMinister: "Justin Trudeau", + province: "ON", + declaredAffiliation: "Independent Senators Group" + ) + ) + } + // MARK: - MemberRow func testMemberRow_liberal() { @@ -99,6 +118,17 @@ final class SnapshotTests: XCTestCase { ) } + // MARK: - SenatorCard + + func testSenatorCard_appointment() { + snapshot( + SenatorCard(senator: Self.senatorWithAppointment) + .frame(width: 375) + .padding(), + name: "SenatorCard_appointment" + ) + } + // MARK: - PartyBadge func testPartyBadge_allParties() { diff --git a/scripts/topic_taxonomy/generate_topic_taxonomy.py b/scripts/topic_taxonomy/generate_topic_taxonomy.py index 1a5b92f9..f61e0867 100755 --- a/scripts/topic_taxonomy/generate_topic_taxonomy.py +++ b/scripts/topic_taxonomy/generate_topic_taxonomy.py @@ -59,7 +59,7 @@ def render_swift(payload: dict) -> str: "", "import Foundation", "", - "struct ParliamentaryTopic: Identifiable, Codable, Hashable {", + "struct ParliamentaryTopic: Identifiable, Codable, Hashable, Sendable {", " let id: String // stable lowercase slug, e.g. \"housing\"", " let nameKey: String // localization key, e.g. \"topic.housing\"", " let keywords: [String] // case-insensitive substrings to match in titles", diff --git a/shared/topic-taxonomy/parliamentary_topics.json b/shared/topic-taxonomy/parliamentary_topics.json index f8d5fc01..fa69ceea 100644 --- a/shared/topic-taxonomy/parliamentary_topics.json +++ b/shared/topic-taxonomy/parliamentary_topics.json @@ -249,6 +249,20 @@ "mines" ] }, + { + "id": "senate", + "name_key": "topic.senate", + "backend_name": "Senate", + "keywords": [ + "senate", + "senator", + "senators", + "upper chamber", + "sénat", + "sénateur", + "sénatrice" + ] + }, { "id": "pharma", "name_key": "topic.pharma", From 67ed9562c7d4e079665b633bc4cf0653493b2117 Mon Sep 17 00:00:00 2001 From: riddim-developer-bot Date: Fri, 12 Jun 2026 17:29:35 -0400 Subject: [PATCH 2/6] =?UTF-8?q?[EPAC-818]:=20WIP=20=E2=80=94=20recovered?= =?UTF-8?q?=20from=20parent=5Fkilled?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ios/epac/Model/Senator.swift | 12 ------------ ios/epac/Views/Senate/SenatorCard.swift | 13 ++++++++++++- ios/epacTests/SnapshotTests.swift | 4 +++- ...ppointment.SenatorCard_appointment_a11y.png | Bin 0 -> 143064 bytes ...ppointment.SenatorCard_appointment_dark.png | Bin 0 -> 98011 bytes ...pointment.SenatorCard_appointment_light.png | Bin 0 -> 82429 bytes 6 files changed, 15 insertions(+), 14 deletions(-) create mode 100644 ios/epacTests/__Snapshots__/SnapshotTests/testSenatorCard_appointment.SenatorCard_appointment_a11y.png create mode 100644 ios/epacTests/__Snapshots__/SnapshotTests/testSenatorCard_appointment.SenatorCard_appointment_dark.png create mode 100644 ios/epacTests/__Snapshots__/SnapshotTests/testSenatorCard_appointment.SenatorCard_appointment_light.png diff --git a/ios/epac/Model/Senator.swift b/ios/epac/Model/Senator.swift index 09b58eea..44a519fc 100644 --- a/ios/epac/Model/Senator.swift +++ b/ios/epac/Model/Senator.swift @@ -10,8 +10,6 @@ // import Foundation -import SwiftUI -import UIKit struct Senator: Identifiable, Codable { let id: String @@ -25,16 +23,6 @@ struct Senator: Identifiable, Codable { let appointedDate: Date? let appointment: SenateAppointment? - var caucusColor: Color { - switch caucus.uppercased() { - case "CPC", "CONS": return Color(UIColor.systemBlue) - case "PSG": return Color(UIColor.systemRed) - case "ISG": return Color(UIColor.systemTeal) - case "CSG": return Color(UIColor.systemPurple) - default: return Color(UIColor.systemGray) - } - } - var appointmentDate: Date? { appointment?.date ?? appointedDate } diff --git a/ios/epac/Views/Senate/SenatorCard.swift b/ios/epac/Views/Senate/SenatorCard.swift index 521da76c..fc8e2da1 100644 --- a/ios/epac/Views/Senate/SenatorCard.swift +++ b/ios/epac/Views/Senate/SenatorCard.swift @@ -8,6 +8,7 @@ // import SwiftUI +import UIKit private enum Layout { static let rowSpacing: CGFloat = 12 @@ -20,7 +21,7 @@ struct SenatorCard: View { var body: some View { HStack(alignment: .top, spacing: Layout.rowSpacing) { Circle() - .fill(senator.caucusColor) + .fill(caucusColor) .frame(width: Layout.caucusDotSize, height: Layout.caucusDotSize) .padding(.top, EpacSpacing.xxs) .accessibilityHidden(true) @@ -71,6 +72,16 @@ struct SenatorCard: View { return String(format: NSLocalizedString("senate.card.appointedUnknownPM", comment: ""), formattedDate) } + private var caucusColor: Color { + switch senator.caucus.uppercased() { + case "CPC", "CONS": return Color(UIColor.systemBlue) + case "PSG": return Color(UIColor.systemRed) + case "ISG": return Color(UIColor.systemTeal) + case "CSG": return Color(UIColor.systemPurple) + default: return Color(UIColor.systemGray) + } + } + private static let appointmentDateFormatter: DateFormatter = { let formatter = DateFormatter() formatter.dateStyle = .medium diff --git a/ios/epacTests/SnapshotTests.swift b/ios/epacTests/SnapshotTests.swift index d89a7aa2..884259a0 100644 --- a/ios/epacTests/SnapshotTests.swift +++ b/ios/epacTests/SnapshotTests.swift @@ -124,7 +124,9 @@ final class SnapshotTests: XCTestCase { snapshot( SenatorCard(senator: Self.senatorWithAppointment) .frame(width: 375) - .padding(), + .padding() + .background(Color(.systemBackground)) + .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading), name: "SenatorCard_appointment" ) } diff --git a/ios/epacTests/__Snapshots__/SnapshotTests/testSenatorCard_appointment.SenatorCard_appointment_a11y.png b/ios/epacTests/__Snapshots__/SnapshotTests/testSenatorCard_appointment.SenatorCard_appointment_a11y.png new file mode 100644 index 0000000000000000000000000000000000000000..40bd7addccda962d9a4ac4b4eab9aa89a3a2bde7 GIT binary patch literal 143064 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�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 TV^kr5zff1MUe38_a_|2DH?smk literal 0 HcmV?d00001 diff --git a/ios/epacTests/__Snapshots__/SnapshotTests/testSenatorCard_appointment.SenatorCard_appointment_dark.png b/ios/epacTests/__Snapshots__/SnapshotTests/testSenatorCard_appointment.SenatorCard_appointment_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..2c52fb03df93f6400541e52d8c0c3c1cfc1b9c0e GIT binary patch literal 98011 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 Date: Fri, 12 Jun 2026 20:14:52 -0400 Subject: [PATCH 3/6] =?UTF-8?q?[EPAC-818]:=20WIP=20=E2=80=94=20recovered?= =?UTF-8?q?=20from=20parent=5Fkilled?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ios/epac/Views/Home/HomeFeedView.swift | 4 ---- 1 file changed, 4 deletions(-) diff --git a/ios/epac/Views/Home/HomeFeedView.swift b/ios/epac/Views/Home/HomeFeedView.swift index 8fb7c536..5ba9f5c1 100644 --- a/ios/epac/Views/Home/HomeFeedView.swift +++ b/ios/epac/Views/Home/HomeFeedView.swift @@ -23,10 +23,6 @@ private enum HomeFeedLayout { static let compactVerticalPadding = EpacSpacing.xxs static let followedTopicsLimit = 6 static let senatorsLimit = 3 - static let senatorRowSpacing: CGFloat = 10 - static let senatorDotOpacity = EpacOpacity.tintStrong - static let senatorDotSize = EpacSpacing.s - static let senatorTextSpacing = EpacSpacing.xxs static let healthcarePreviewLimit = 2 static let reorderBillsThreshold = 5 static let unreadDotSize: CGFloat = 8 From c1b1cb803a1be7deb5096aa33701272a84dd1396 Mon Sep 17 00:00:00 2001 From: riddim-developer-bot Date: Sat, 13 Jun 2026 15:52:31 -0400 Subject: [PATCH 4/6] =?UTF-8?q?[EPAC-818]:=20WIP=20=E2=80=94=20recovered?= =?UTF-8?q?=20from=20parent=5Fkilled?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ios/epac/Util/SenatorsService.swift | 22 ++++++++++++++++---- ios/epac/Views/Senate/SenatorCard.swift | 27 ++++++++++++++++++++----- ios/epac/en.lproj/Localizable.strings | 3 ++- ios/epac/fr.lproj/Localizable.strings | 3 ++- 4 files changed, 44 insertions(+), 11 deletions(-) diff --git a/ios/epac/Util/SenatorsService.swift b/ios/epac/Util/SenatorsService.swift index a32f4fa2..ae562217 100644 --- a/ios/epac/Util/SenatorsService.swift +++ b/ios/epac/Util/SenatorsService.swift @@ -92,26 +92,38 @@ struct SenatorsService { let appointmentPayload = item["appointment"] as? [String: Any] ?? item let appointmentDateValue = stringValue( - forAnyKey: ["appointment_date", "appointed_date", "date", "StartDate"], + forAnyKey: ["appointment_date", "appointmentDate", "appointed_date", "appointedDate", "date", "StartDate"], in: appointmentPayload - ) ?? stringValue(forAnyKey: ["appointment_date", "appointed_date", "StartDate"], in: item) - let date = parseDate( - appointmentDateValue + ) ?? stringValue( + forAnyKey: ["appointment_date", "appointmentDate", "appointed_date", "appointedDate", "StartDate"], + in: item ) + let date = parseDate(appointmentDateValue) let primeMinisterKeys = [ "appointing_prime_minister", + "appointingPrimeMinister", "appointing_pm", + "appointingPM", "appointed_by", + "appointedBy", "prime_minister", + "primeMinister", "prime_minister_name", + "primeMinisterName", "PrimeMinisterName" ] let appointingPrimeMinister = stringValue(forAnyKey: primeMinisterKeys, in: appointmentPayload) ?? stringValue(forAnyKey: primeMinisterKeys, in: item) let sourceURLKeys = [ "source_url", + "sourceURL", + "sourceUrl", "orders_in_council_url", + "ordersInCouncilURL", + "ordersInCouncilUrl", "order_in_council_url", + "orderInCouncilURL", + "orderInCouncilUrl", "OrderInCouncilURL" ] let sourceURL = urlValue(forAnyKey: sourceURLKeys, in: appointmentPayload) @@ -119,8 +131,10 @@ struct SenatorsService { ?? SenateAppointment.defaultSourceURL let affiliationKeys = [ "declared_affiliation", + "declaredAffiliation", "affiliation", "caucus_full_name", + "caucusFullName", "CaucusNameEn" ] let declaredAffiliation = stringValue(forAnyKey: affiliationKeys, in: appointmentPayload) diff --git a/ios/epac/Views/Senate/SenatorCard.swift b/ios/epac/Views/Senate/SenatorCard.swift index fc8e2da1..c2eda6e1 100644 --- a/ios/epac/Views/Senate/SenatorCard.swift +++ b/ios/epac/Views/Senate/SenatorCard.swift @@ -28,7 +28,7 @@ struct SenatorCard: View { VStack(alignment: .leading, spacing: EpacSpacing.xxs) { Text(String(format: NSLocalizedString("senate.card.name", comment: ""), senator.name)) .font(.subheadline.weight(.semibold)) - Text(senator.caucusFullName) + Text(declaredAffiliation) .font(.caption2) .foregroundStyle(.secondary) if let appointmentSummary { @@ -53,10 +53,11 @@ struct SenatorCard: View { } .padding(.vertical, EpacSpacing.xxs) .foregroundStyle(.primary) - .accessibilityLabel( - String(format: NSLocalizedString("senate.card.accessibility", comment: ""), - senator.name, senator.caucusFullName, appointmentSummary ?? "") - ) + .accessibilityLabel(accessibilitySummary) + } + + private var declaredAffiliation: String { + senator.appointment?.declaredAffiliation ?? senator.caucusFullName } private var appointmentSummary: String? { @@ -82,6 +83,22 @@ struct SenatorCard: View { } } + private var accessibilitySummary: String { + if let appointmentSummary { + return String( + format: NSLocalizedString("senate.card.accessibilityWithAppointment", comment: ""), + senator.name, + declaredAffiliation, + appointmentSummary + ) + } + return String( + format: NSLocalizedString("senate.card.accessibility", comment: ""), + senator.name, + declaredAffiliation + ) + } + private static let appointmentDateFormatter: DateFormatter = { let formatter = DateFormatter() formatter.dateStyle = .medium diff --git a/ios/epac/en.lproj/Localizable.strings b/ios/epac/en.lproj/Localizable.strings index a89f1a68..0991b14b 100644 --- a/ios/epac/en.lproj/Localizable.strings +++ b/ios/epac/en.lproj/Localizable.strings @@ -466,7 +466,8 @@ "senate.card.appointed" = "Appointed by %@ on %@"; "senate.card.appointedUnknownPM" = "Appointed on %@"; "senate.card.source" = "Privy Council Office — Orders in Council"; -"senate.card.accessibility" = "Senator %@, %@, %@"; +"senate.card.accessibility" = "Senator %@, %@"; +"senate.card.accessibilityWithAppointment" = "Senator %@, %@, %@"; /* Ontario Legislature */ "ontario.debates.navTitle" = "Queen's Park Debates"; diff --git a/ios/epac/fr.lproj/Localizable.strings b/ios/epac/fr.lproj/Localizable.strings index 025bf906..156b3dd5 100644 --- a/ios/epac/fr.lproj/Localizable.strings +++ b/ios/epac/fr.lproj/Localizable.strings @@ -468,7 +468,8 @@ "senate.card.appointed" = "Nommé(e) par %@ le %@"; "senate.card.appointedUnknownPM" = "Nommé(e) le %@"; "senate.card.source" = "Bureau du Conseil privé — décrets"; -"senate.card.accessibility" = "Sénateur(trice) %@, %@, %@"; +"senate.card.accessibility" = "Sénateur(trice) %@, %@"; +"senate.card.accessibilityWithAppointment" = "Sénateur(trice) %@, %@, %@"; /* Assemblée législative de l'Ontario */ "ontario.debates.navTitle" = "Débats de Queen's Park"; From c93ee765ca62047e8c23604d4ae8e5242fd5d1e4 Mon Sep 17 00:00:00 2001 From: riddim-developer-bot Date: Sat, 13 Jun 2026 16:17:43 -0400 Subject: [PATCH 5/6] =?UTF-8?q?[EPAC-818]:=20WIP=20=E2=80=94=20recovered?= =?UTF-8?q?=20from=20parent=5Fkilled?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ios/epac/Util/SenatorsService.swift | 10 ++++++--- ios/epacTests/ModelTests.swift | 34 +++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/ios/epac/Util/SenatorsService.swift b/ios/epac/Util/SenatorsService.swift index ae562217..2ef7ee77 100644 --- a/ios/epac/Util/SenatorsService.swift +++ b/ios/epac/Util/SenatorsService.swift @@ -63,10 +63,14 @@ struct SenatorsService { guard let (data, response) = try? await NetworkService.shared.data(from: url), let http = response as? HTTPURLResponse, - Constants.successStatusCodes.contains(http.statusCode), - let json = try? JSONSerialization.jsonObject(with: data) as? [String: Any], - let items = json["items"] as? [[String: Any]] else { return nil } + Constants.successStatusCodes.contains(http.statusCode) else { return nil } + + return parseOpenAPISenators(from: data) + } + static func parseOpenAPISenators(from data: Data) -> [Senator]? { + guard let json = try? JSONSerialization.jsonObject(with: data) as? [String: Any], + let items = json["items"] as? [[String: Any]] else { return nil } return items.compactMap { item -> Senator? in guard let fn = item["PersonOfficialFirstName"] as? String, let ln = item["PersonOfficialLastName"] as? String else { return nil } diff --git a/ios/epacTests/ModelTests.swift b/ios/epacTests/ModelTests.swift index 36ad228d..9afcf8b4 100644 --- a/ios/epacTests/ModelTests.swift +++ b/ios/epacTests/ModelTests.swift @@ -39,4 +39,38 @@ struct ModelTests { #expect(senate?.keywords.contains("senator") == true) #expect(ParliamentaryTopic.matching("The PM has appointed a new senator").map(\.id).contains("senate")) } + + @Test func senatorOpenAPIParserIncludesAppointmentFacts() throws { + let payload = """ + { + "items": [ + { + "PersonOfficialFirstName": "Jane", + "PersonOfficialLastName": "Senator", + "ProvinceName": "Ontario", + "CaucusAbbreviationEn": "ISG", + "CaucusNameEn": "Independent Senators Group", + "PersonPageUrl": "https://sencanada.ca/en/senators/jane-senator", + "appointment": { + "appointment_date": "2024-12-19", + "appointing_prime_minister": "Justin Trudeau", + "declared_affiliation": "Independent Senators Group", + "orders_in_council_url": "https://pco-bcp.gc.ca/oic-ddc.asp?lang=eng&Page=secretariats&txtOICID=2024-1300" + } + } + ] + } + """.data(using: .utf8) + let data = try #require(payload) + + let senator = try #require(SenatorsService.parseOpenAPISenators(from: data)?.first) + let appointment = try #require(senator.appointment) + + #expect(senator.province == "ON") + #expect(appointment.appointingPrimeMinister == "Justin Trudeau") + #expect(appointment.declaredAffiliation == "Independent Senators Group") + #expect(appointment.province == "ON") + #expect(appointment.sourceURL.absoluteString.contains("pco-bcp.gc.ca/oic-ddc.asp")) + #expect(senator.appointmentDate == appointment.date) + } } From 061bb3dd0542a2cd34248542a93006eb53b72ee8 Mon Sep 17 00:00:00 2001 From: riddim-developer-bot Date: Sat, 13 Jun 2026 18:16:10 -0400 Subject: [PATCH 6/6] Add pipeline registration, service routing, and indexer verification for Senate appointment tracker --- .github/workflows/data-ingestion.yml | 13 ++ backend/go.work | 1 + backend/manifest/deployment-services.json | 34 +++ backend/openapi/openapi.json | 48 +++++ backend/senators/go.mod | 36 ++++ backend/senators/main.go | 52 +++++ backend/senators/main_test.go | 51 +++++ ios/epac/Util/SenatorsService.swift | 63 +++++- ios/epac/en.lproj/Localizable.strings | 2 + ios/epac/fr.lproj/Localizable.strings | 2 + scripts/artifacts/fetch_senators.py | 195 ++++++++++++++++++ .../ci/check_backend_manifest_deployment.py | 1 + scripts/ci/run_native_indexer.py | 28 +++ scripts/ci/tests/test_native_indexer_cli.py | 12 ++ 14 files changed, 529 insertions(+), 9 deletions(-) create mode 100644 backend/senators/go.mod create mode 100644 backend/senators/main.go create mode 100644 backend/senators/main_test.go create mode 100755 scripts/artifacts/fetch_senators.py diff --git a/.github/workflows/data-ingestion.yml b/.github/workflows/data-ingestion.yml index c5bcc4ca..08fb284d 100644 --- a/.github/workflows/data-ingestion.yml +++ b/.github/workflows/data-ingestion.yml @@ -66,6 +66,11 @@ on: required: true type: boolean default: false + run_senators_indexer: + description: 'Senators: fetch and generate senators JSON -> S3' + required: true + type: boolean + default: false parliament_number: description: Optional parliament number override for search, lobbying, and bills required: false @@ -101,6 +106,7 @@ jobs: RUN_MEMBERS: ${{ inputs.run_members }} RUN_MEMBERS_INDEXER: ${{ inputs.run_members_indexer }} RUN_VOTES: ${{ inputs.run_votes }} + RUN_SENATORS_INDEXER: ${{ inputs.run_senators_indexer }} run: | set -euo pipefail @@ -129,6 +135,7 @@ jobs: case "$EVENT_SCHEDULE" in "0 12 * * *"|"0 3 * * *") add_ingestor "search" "Hansard search index" "hansard-search-index" "false" + add_ingestor "senators-indexer" "Senators indexer" "senators-indexer" "false" ;; "0 12 * * 1"|"0 12 1 */3 *") add_ingestor "lobbying" "Lobbying index" "lobbying-index" "false" @@ -145,6 +152,7 @@ jobs: [ "$RUN_MEMBERS" = "true" ] && add_ingestor "members" "Members artifacts" "members-publisher" "true" [ "$RUN_MEMBERS_INDEXER" = "true" ] && add_ingestor "members-indexer" "Members SQLite index" "members-indexer" "false" [ "$RUN_VOTES" = "true" ] && add_ingestor "votes" "Member votes artifacts" "member-votes-publisher" "true" + [ "$RUN_SENATORS_INDEXER" = "true" ] && add_ingestor "senators-indexer" "Senators indexer" "senators-indexer" "false" fi if [ "$(jq 'length' <<< "$items")" -gt 0 ]; then @@ -283,6 +291,11 @@ jobs: votes) (cd backend/member-votes-publisher && go run .) ;; + senators-indexer) + output_dir="$RUNNER_TEMP/artifacts/senators" + python3 scripts/artifacts/fetch_senators.py --output "$output_dir/v1/all.json" + aws s3 sync "$output_dir" "$(artifact_uri senators)" + ;; *) echo "Unknown ingestor: $INGESTOR" exit 1 diff --git a/backend/go.work b/backend/go.work index fb24ae60..138ec550 100644 --- a/backend/go.work +++ b/backend/go.work @@ -34,6 +34,7 @@ use ( ./openapi ./push-notification-dispatcher ./riding-boundary + ./senators ./sittings ./sittings-publisher ./telemetry diff --git a/backend/manifest/deployment-services.json b/backend/manifest/deployment-services.json index 60cfa202..4b249324 100644 --- a/backend/manifest/deployment-services.json +++ b/backend/manifest/deployment-services.json @@ -868,6 +868,40 @@ "artifact": false } } + }, + { + "name": "senators", + "deploy": { + "staging": true, + "production": true + }, + "http": { + "payload_format_version": "1.0", + "routes": { + "staging": [ + { + "method": "GET", + "path": "/api/v1/senators" + } + ], + "production": [ + { + "method": "GET", + "path": "/api/v1/senators" + } + ] + } + }, + "sync": { + "staging": { + "database": false, + "artifact": true + }, + "production": { + "database": false, + "artifact": true + } + } } ] } diff --git a/backend/openapi/openapi.json b/backend/openapi/openapi.json index 6ba7e5cc..7e3b5370 100644 --- a/backend/openapi/openapi.json +++ b/backend/openapi/openapi.json @@ -169,6 +169,24 @@ } } }, + "/api/v1/senators": { + "get": { + "tags": ["Senators"], + "summary": "List senators of Canada", + "operationId": "listSenators", + "responses": { + "200": { + "description": "Senator list", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/SenatorsResponse" } + } + } + }, + "429": { "$ref": "#/components/responses/RateLimit" } + } + } + }, "/api/v1/members": { "get": { "tags": ["Members"], @@ -1926,6 +1944,36 @@ "source_url": { "type": "string", "format": "uri" } } }, + "SenatorsResponse": { + "type": "object", + "required": ["items"], + "properties": { + "items": { "type": "array", "items": { "$ref": "#/components/schemas/OpenAPISenator" } } + } + }, + "OpenAPISenator": { + "type": "object", + "required": ["PersonOfficialFirstName", "PersonOfficialLastName", "ProvinceNameEn"], + "properties": { + "PersonOfficialFirstName": { "type": "string" }, + "PersonOfficialLastName": { "type": "string" }, + "ProvinceNameEn": { "type": "string" }, + "CaucusAbbreviationEn": { "type": "string" }, + "CaucusNameEn": { "type": "string" }, + "PersonPageUrl": { "type": "string", "format": "uri" }, + "appointment": { "$ref": "#/components/schemas/OpenAPISenateAppointment" } + } + }, + "OpenAPISenateAppointment": { + "type": "object", + "required": ["appointment_date", "declared_affiliation", "source_url"], + "properties": { + "appointment_date": { "type": "string", "format": "date" }, + "appointing_prime_minister": { "type": "string" }, + "declared_affiliation": { "type": "string" }, + "source_url": { "type": "string", "format": "uri" } + } + }, "MembersResponse": { "type": "object", "required": ["members"], diff --git a/backend/senators/go.mod b/backend/senators/go.mod new file mode 100644 index 00000000..bd0f0127 --- /dev/null +++ b/backend/senators/go.mod @@ -0,0 +1,36 @@ +module epac/senators + +go 1.24.0 + +require ( + epac/observability v0.0.0 + epac/shared v0.0.0 + github.com/aws/aws-lambda-go v1.54.0 +) + +require ( + github.com/aws/aws-sdk-go-v2 v1.41.7 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.10 // indirect + github.com/aws/aws-sdk-go-v2/config v1.32.1 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.19.1 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.14 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.23 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.23 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.24 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.9 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.15 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.23 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.23 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.101.0 // indirect + github.com/aws/aws-sdk-go-v2/service/signin v1.0.1 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.30.4 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.9 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.41.1 // indirect + github.com/aws/smithy-go v1.25.1 // indirect + github.com/stretchr/testify v1.11.1 // indirect +) + +replace epac/observability => ../observability + +replace epac/shared => ../_shared diff --git a/backend/senators/main.go b/backend/senators/main.go new file mode 100644 index 00000000..fdb598c6 --- /dev/null +++ b/backend/senators/main.go @@ -0,0 +1,52 @@ +// senators Lambda — GET /api/v1/senators +package main + +import ( + "context" + "net/http" + + "epac/observability" + "epac/shared/artifacts" + "github.com/aws/aws-lambda-go/events" + "github.com/aws/aws-lambda-go/lambda" +) + +const senatorsArtifactKey = "senators/v1/all.json" + +var newArtifactStore = artifacts.NewFromEnv + +func HandleRequest(ctx context.Context, _ events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) { + store, err := newArtifactStore(ctx) + if err != nil { + return jsonError(http.StatusServiceUnavailable, err.Error()), nil + } + data, err := store.Get(ctx, senatorsArtifactKey) + if err != nil { + status := http.StatusInternalServerError + if artifacts.IsNotFound(err) { + status = http.StatusNotFound + } + return jsonError(status, err.Error()), nil + } + + return events.APIGatewayProxyResponse{ + StatusCode: http.StatusOK, + Headers: map[string]string{ + "Content-Type": "application/json", + "Cache-Control": "public, max-age=300", + }, + Body: string(data), + }, nil +} + +func jsonError(status int, message string) events.APIGatewayProxyResponse { + return events.APIGatewayProxyResponse{ + StatusCode: status, + Headers: map[string]string{"Content-Type": "application/json"}, + Body: `{"error":"` + message + `"}`, + } +} + +func main() { + lambda.Start(observability.WrapAPIGateway("senators", HandleRequest)) +} diff --git a/backend/senators/main_test.go b/backend/senators/main_test.go new file mode 100644 index 00000000..93370b83 --- /dev/null +++ b/backend/senators/main_test.go @@ -0,0 +1,51 @@ +package main + +import ( + "context" + "net/http" + "os" + "path/filepath" + "strings" + "testing" + + "github.com/aws/aws-lambda-go/events" +) + +func TestHandleRequestReadsSenatorsArtifact(t *testing.T) { + dir := t.TempDir() + writeFixture(t, dir, senatorsArtifactKey, `{"items":[{"PersonOfficialFirstName":"Charles","PersonOfficialLastName":"Adler"}]}`) + t.Setenv("ARTIFACTS_DIR", dir) + + resp, err := HandleRequest(context.Background(), events.APIGatewayProxyRequest{}) + if err != nil { + t.Fatalf("HandleRequest error: %v", err) + } + if resp.StatusCode != http.StatusOK { + t.Fatalf("status = %d body = %s, want 200", resp.StatusCode, resp.Body) + } + if !strings.Contains(resp.Body, `"PersonOfficialFirstName":"Charles"`) { + t.Fatalf("unexpected body: %s", resp.Body) + } +} + +func TestHandleRequestMissingArtifactReturns404(t *testing.T) { + t.Setenv("ARTIFACTS_DIR", t.TempDir()) + resp, err := HandleRequest(context.Background(), events.APIGatewayProxyRequest{}) + if err != nil { + t.Fatalf("HandleRequest error: %v", err) + } + if resp.StatusCode != http.StatusNotFound { + t.Fatalf("status = %d body = %s, want 404", resp.StatusCode, resp.Body) + } +} + +func writeFixture(t *testing.T, root, key, body string) { + t.Helper() + path := filepath.Join(root, filepath.FromSlash(key)) + if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil { + t.Fatalf("mkdir fixture: %v", err) + } + if err := os.WriteFile(path, []byte(body), 0o644); err != nil { + t.Fatalf("write fixture: %v", err) + } +} diff --git a/ios/epac/Util/SenatorsService.swift b/ios/epac/Util/SenatorsService.swift index 2ef7ee77..b338a50f 100644 --- a/ios/epac/Util/SenatorsService.swift +++ b/ios/epac/Util/SenatorsService.swift @@ -10,6 +10,7 @@ // import Foundation +import UserNotifications struct SenatorsService { private static let cacheKey = "epac.senators.cache" @@ -35,17 +36,24 @@ struct SenatorsService { static func fetchSenators() async -> [Senator] { if let cached = loadFromCache() { return cached } + let previousSenators = loadFromCacheBypassingTTL() ?? [] + + var freshSenators: [Senator] = [] if let senators = await fetchFromOpenAPI(), !senators.isEmpty { - saveToCache(senators) - return senators + freshSenators = senators + } else if let senators = await fetchFromXML(), !senators.isEmpty { + freshSenators = senators } - if let senators = await fetchFromXML(), !senators.isEmpty { - saveToCache(senators) - return senators + if !freshSenators.isEmpty { + saveToCache(freshSenators) + if await TopicFollowStore.shared.isFollowing("senate") && !previousSenators.isEmpty { + notifyNewAppointments(fresh: freshSenators, previous: previousSenators) + } + return freshSenators } - return [] + return previousSenators.isEmpty ? [] : previousSenators } static func senators(for province: String, from senators: [Senator]) -> [Senator] { @@ -57,9 +65,7 @@ struct SenatorsService { // MARK: - OurCommons open API (primary) private static func fetchFromOpenAPI() async -> [Senator]? { - guard let url = URL(string: - "https://api.openparliament.ca/ocd/members/?parliament=45&chamber=Senate&pageSize=200&format=json" - ) else { return nil } + let url = BackendConfig.shared.baseURL.appendingPathComponent("api/v1/senators") guard let (data, response) = try? await NetworkService.shared.data(from: url), let http = response as? HTTPURLResponse, @@ -307,4 +313,43 @@ struct SenatorsService { UserDefaults.standard.set(data, forKey: cacheKey) UserDefaults.standard.set(Date(), forKey: cacheTimestampKey) } + + private static func loadFromCacheBypassingTTL() -> [Senator]? { + guard + let data = UserDefaults.standard.data(forKey: cacheKey), + let senators = try? JSONDecoder().decode([Senator].self, from: data) + else { return nil } + return senators + } + + private static func notifyNewAppointments(fresh: [Senator], previous: [Senator]) { + let previousIDs = Set(previous.map { $0.id }) + let newAppointments = fresh.filter { !previousIDs.contains($0.id) } + for senator in newAppointments { + triggerNotification(for: senator) + } + } + + private static func triggerNotification(for senator: Senator) { + let content = UNMutableNotificationContent() + content.title = NSLocalizedString("senate.notification.title", comment: "") + let bodyFormat = NSLocalizedString("senate.notification.body", comment: "") + let pm = senator.appointment?.appointingPrimeMinister ?? "" + content.body = String(format: bodyFormat, senator.name, senator.province, pm) + content.sound = UNNotificationSound.default + + let request = UNNotificationRequest( + identifier: "epac.senator-appointment.\(senator.id)", + content: content, + trigger: nil + ) + + UNUserNotificationCenter.current().add(request) { error in + if let error = error { + Log.error("Failed to post senator appointment notification: \(error)") + } else { + Log.debug("Posted senator appointment notification for \(senator.name)") + } + } + } } diff --git a/ios/epac/en.lproj/Localizable.strings b/ios/epac/en.lproj/Localizable.strings index 0991b14b..b2d75a28 100644 --- a/ios/epac/en.lproj/Localizable.strings +++ b/ios/epac/en.lproj/Localizable.strings @@ -468,6 +468,8 @@ "senate.card.source" = "Privy Council Office — Orders in Council"; "senate.card.accessibility" = "Senator %@, %@"; "senate.card.accessibilityWithAppointment" = "Senator %@, %@, %@"; +"senate.notification.title" = "New Senate Appointment"; +"senate.notification.body" = "%@ has been appointed to the Senate for %@ by %@."; /* Ontario Legislature */ "ontario.debates.navTitle" = "Queen's Park Debates"; diff --git a/ios/epac/fr.lproj/Localizable.strings b/ios/epac/fr.lproj/Localizable.strings index 156b3dd5..a61624e6 100644 --- a/ios/epac/fr.lproj/Localizable.strings +++ b/ios/epac/fr.lproj/Localizable.strings @@ -470,6 +470,8 @@ "senate.card.source" = "Bureau du Conseil privé — décrets"; "senate.card.accessibility" = "Sénateur(trice) %@, %@"; "senate.card.accessibilityWithAppointment" = "Sénateur(trice) %@, %@, %@"; +"senate.notification.title" = "Nouvelle nomination au Sénat"; +"senate.notification.body" = "%@ a été nommé(e) au Sénat pour %@ par %@."; /* Assemblée législative de l'Ontario */ "ontario.debates.navTitle" = "Débats de Queen's Park"; diff --git a/scripts/artifacts/fetch_senators.py b/scripts/artifacts/fetch_senators.py new file mode 100755 index 00000000..135e7cca --- /dev/null +++ b/scripts/artifacts/fetch_senators.py @@ -0,0 +1,195 @@ +#!/usr/bin/env python3 +import os +import sys +import re +import json +import argparse +import urllib.request +from html.parser import HTMLParser + +class SenateHTMLParser(HTMLParser): + def __init__(self): + super().__init__() + self.in_tbody = False + self.in_row = False + self.in_cell = False + self.current_cell_index = -1 + self.rows = [] + self.current_row = [] + self.current_cell_data = "" + self.current_link = "" + self.cell_attrs = {} + + def handle_starttag(self, tag, attrs): + attrs_dict = dict(attrs) + if tag == "tbody": + self.in_tbody = True + elif tag == "tr" and self.in_tbody: + self.in_row = True + self.current_row = [] + self.current_cell_index = -1 + elif tag == "td" and self.in_row: + self.in_cell = True + self.current_cell_index += 1 + self.current_cell_data = "" + self.current_link = "" + self.cell_attrs = attrs_dict + elif tag == "a" and self.in_cell: + if "href" in attrs_dict: + self.current_link = attrs_dict["href"] + + def handle_data(self, data): + if self.in_cell: + self.current_cell_data += data + + def handle_endtag(self, tag): + if tag == "tbody": + self.in_tbody = False + elif tag == "tr" and self.in_row: + self.in_row = False + self.rows.append(self.current_row) + elif tag == "td" and self.in_cell: + self.in_cell = False + text = self.current_cell_data.strip() + self.current_row.append({ + "text": text, + "link": self.current_link, + "attrs": self.cell_attrs + }) + +def split_name(name_str): + name_str = name_str.strip() + if ',' in name_str: + parts = name_str.split(',', 1) + last_name = parts[0].strip() + first_name = parts[1].strip() + else: + parts = name_str.rsplit(' ', 1) + if len(parts) == 2: + first_name = parts[0].strip() + last_name = parts[1].strip() + else: + first_name = name_str + last_name = "" + return first_name, last_name + +def clean_pm(pm_str): + pm_str = pm_str.strip() + # Remove party abbreviation in parentheses, e.g., (Lib.) or (PC) + pm_str = re.sub(r'\s*\([^)]*\)', '', pm_str).strip() + if ',' in pm_str: + parts = pm_str.split(',', 1) + last = parts[0].strip() + first = parts[1].strip() + return f"{first} {last}" + return pm_str + +def clean_province(prov_str): + # Remove anything in parentheses, e.g. "Quebec (Grandville)" -> "Quebec" + prov_str = re.sub(r'\s*\([^)]*\)', '', prov_str).strip() + known = { + "british columbia", "alberta", "saskatchewan", "manitoba", "ontario", + "quebec", "québec", "new brunswick", "nova scotia", "prince edward island", + "newfoundland and labrador", "northwest territories", "nunavut", "yukon" + } + for k in known: + if prov_str.lower() == k: + return prov_str + return prov_str.title() + +def main(): + parser = argparse.ArgumentParser(description="Fetch and parse Senate list of Canada.") + parser.add_argument("--output", "-o", required=True, help="Path to write senators/v1/all.json output") + args = parser.parse_args() + + url = "https://sencanada.ca/umbraco/surface/SenatorsAjax/GetSenators?displayFor=senatorslist&Lang=en" + req = urllib.request.Request( + url, + headers={"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36"} + ) + + try: + with urllib.request.urlopen(req, timeout=30) as response: + html = response.read().decode("utf-8") + except Exception as e: + print(f"Error fetching senators list: {e}", file=sys.stderr) + sys.exit(1) + + html_parser = SenateHTMLParser() + html_parser.feed(html) + + items = [] + for r in html_parser.rows: + if len(r) < 6: + continue + + name_info = r[0] + name_str = name_info["text"] + link_str = name_info["link"] + if link_str.startswith("/"): + link_str = "https://sencanada.ca" + link_str + + first_name, last_name = split_name(name_str) + caucus_short = r[1]["text"].strip() + if caucus_short == "C": + caucus_short = "CPC" + + caucus_full = caucus_short + caucus_map = { + "CPC": "Conservative Party of Canada", + "CSG": "Canadian Senators Group", + "ISG": "Independent Senators Group", + "PSG": "Progressive Senate Group", + "GRO": "Government Representative's Office", + "Non-affiliated": "Non-affiliated" + } + if caucus_short in caucus_map: + caucus_full = caucus_map[caucus_short] + + province_raw = r[2]["attrs"].get("data-order", r[2]["text"]).strip() + province_full = clean_province(province_raw) + + nom_date_str = r[3]["text"].strip() + match = re.match(r'^\d{4}-\d{2}-\d{2}$', nom_date_str) + if not match: + order_attr = r[3]["attrs"].get("data-order", "") + match = re.match(r'^(\d{4}-\d{2}-\d{2})', order_attr) + if match: + nom_date_str = match.group(1) + else: + nom_date_str = None + + pm_raw = r[5]["text"].strip() + appointing_pm = clean_pm(pm_raw) + + item = { + "PersonOfficialFirstName": first_name, + "PersonOfficialLastName": last_name, + "ProvinceNameEn": province_full, + "CaucusAbbreviationEn": caucus_short, + "CaucusNameEn": caucus_full, + "PersonPageUrl": link_str, + } + + if nom_date_str: + item["appointment"] = { + "appointment_date": nom_date_str, + "appointing_prime_minister": appointing_pm, + "source_url": "https://pco-bcp.gc.ca/oic-ddc", + "declared_affiliation": caucus_short + } + items.append(item) + + # Write output directory + output_dir = os.path.dirname(args.output) + if output_dir: + os.makedirs(output_dir, exist_ok=True) + + payload = {"items": items} + with open(args.output, "w", encoding="utf-8") as f: + json.dump(payload, f, indent=2, ensure_ascii=False) + + print(f"Ingested {len(items)} senators and saved to {args.output}") + +if __name__ == "__main__": + main() diff --git a/scripts/ci/check_backend_manifest_deployment.py b/scripts/ci/check_backend_manifest_deployment.py index 683d4c4a..c66fc5e2 100755 --- a/scripts/ci/check_backend_manifest_deployment.py +++ b/scripts/ci/check_backend_manifest_deployment.py @@ -39,6 +39,7 @@ class ArtifactContract: "members": ArtifactContract(("MEMBERS_INDEX_PREFIX", "EPAC_MEMBERS_INDEX_PREFIX"), "members/v1"), "hansard-search": ArtifactContract(("EPAC_HANSARD_SEARCH_PREFIX",), "hansard-search/v1"), "lobbying": ArtifactContract(("LOBBYING_INDEX_PREFIX",), "lobbying-index/v1", require_prefix_env=True), + "senators": ArtifactContract(("EPAC_SENATORS_PREFIX",), "senators/v1", required_files=("all.json",)), } diff --git a/scripts/ci/run_native_indexer.py b/scripts/ci/run_native_indexer.py index ae17d534..8064d411 100644 --- a/scripts/ci/run_native_indexer.py +++ b/scripts/ci/run_native_indexer.py @@ -58,6 +58,15 @@ "table_counts": "object[string,integer]", } +SENATORS_MANIFEST_FORMAT = { + "version": "string", + "built_at": "rfc3339", + "senator_count": "integer", + "sqlite_key": "string", + "sqlite_size_bytes": "integer", + "sqlite_sha256": "sha256", +} + def build_parser() -> argparse.ArgumentParser: parser = argparse.ArgumentParser( @@ -70,6 +79,7 @@ def build_parser() -> argparse.ArgumentParser: "lobbying-index", "bills-indexer", "members-indexer", + "senators-indexer", ), help="Indexer pipeline to run.", ) @@ -176,6 +186,24 @@ def planned_payload(args: argparse.Namespace, summary_path: Path | None) -> dict ], } + if args.pipeline == "senators-indexer": + return { + "pipeline": args.pipeline, + "environment": args.environment, + "mode": "dry-run", + "status": "planned", + "summary_markdown_path": str(summary_path) if summary_path else None, + "manifest_format": SENATORS_MANIFEST_FORMAT, + "parameters": {}, + "commands": [ + { + "working_directory": "backend/senators", + "argv": ["python3", "../../scripts/artifacts/fetch_senators.py", "--output", "../../build/artifacts/senators/v1/all.json"], + "env": {}, + } + ], + } + return { "pipeline": args.pipeline, "environment": args.environment, diff --git a/scripts/ci/tests/test_native_indexer_cli.py b/scripts/ci/tests/test_native_indexer_cli.py index 4deaa6ef..6fbabe83 100644 --- a/scripts/ci/tests/test_native_indexer_cli.py +++ b/scripts/ci/tests/test_native_indexer_cli.py @@ -70,6 +70,18 @@ "table_counts": "object[string,integer]", }, ), + ( + "senators-indexer", + [], + { + "version": "string", + "built_at": "rfc3339", + "senator_count": "integer", + "sqlite_key": "string", + "sqlite_size_bytes": "integer", + "sqlite_sha256": "sha256", + }, + ), ], ) def test_native_indexer_cli_dry_run_reports_expected_output_formats(