Adding Mobilizon (events) as a source: multiple potential fields for the same attribute ?
First of all, thank you for this extension ! We met a few days back and as I told you I'd like to add Mobilizon as a kind of source, which should hopefully convince more people to use Mobilizon. Discoverability is, to me, the biggest problem of the decentralized web and I feel like Meta-press.es can be hacked to tackle this problem. Mobilizon is using GraphQL for its API. This means POSTing a body with a specific structure, and the reply is a JSON. Here's the blurb in the request: ``` {"query":"query SearchEventsAndGroups($location: String, $radius: Float, $tags: String, $term: String, $type: EventType, $category: String, $beginsOn: DateTime, $endsOn: DateTime, $eventPage: Int, $limit: Int) {\n searchEvents(location: $location, radius: $radius, tags: $tags, term: $term, type: $type, category: $category, beginsOn: $beginsOn, endsOn: $endsOn, page: $eventPage, limit: $limit) {\n total\n elements {\n title\n url\n beginsOn\n attributedTo {\n name\n }\n organizerActor {\n name\n }\n }\n }\n}\n","variables":{"term":"concert"},"operationName":"SearchEventsAndGroups"} ``` Basically, a JSON object with a `query` field and `variables`. The query looks like this when formatted: ``` query SearchEventsAndGroups($location: String, $radius: Float, $tags: String, $term: String, $type: EventType, $category: String, $beginsOn: DateTime, $endsOn: DateTime, $eventPage: Int, $limit: Int) { searchEvents(location: $location, radius: $radius, tags: $tags, term: $term, type: $type, category: $category, beginsOn: $beginsOn, endsOn: $endsOn, page: $eventPage, limit: $limit) { total elements { title url beginsOn attributedTo { name } organizerActor { name } } } } ``` (Note: this is not the query used by the actual frontend, which is waaaaaay more complicated. It includes stuff like location, events options etc that might not be relevant for Meta-Press.es) The reply is a standard JSON: ``` { "data": { "searchEvents": { "elements": [ { "attributedTo": null, "beginsOn": "2022-05-01T19:00:00Z", "organizerActor": { "name": "VERO JEAN-LUC" }, "title": "CONCERTS A VENIR ...", "url": "https://mobilizon.fr/events/80c84e36-2155-4fa2-a67f-e900ea49cc86" }, { "attributedTo": null, "beginsOn": "2022-10-01T12:00:00Z", "organizerActor": { "name": "Alternatiba Rennes" }, "title": "Weekend des possibles 2022", "url": "https://mobilizon.fr/events/a114010e-bce1-4547-86e2-d5b230c3c7ed" }, { "attributedTo": null, "beginsOn": "2022-10-01T18:00:00Z", "organizerActor": { "name": "Still Freak" }, "title": "Rudeboy plays Urban Dance Squad en concert @ l'Accordeur", "url": "https://mobilizon.fr/events/10c25817-3f25-4edc-be04-4293addf77ac" }, { "attributedTo": { "name": "Musique sur Nantes ! :D" }, "beginsOn": "2022-10-05T17:30:00Z", "organizerActor": null, "title": "SCENE OUVERTE MUSICALE au Chat Noir", "url": "https://mobilizon.fr/events/c11c3a8a-bc32-450d-b33c-ee385eb866ba" }, { "attributedTo": null, "beginsOn": "2022-10-06T16:00:00Z", "organizerActor": { "name": "Still Freak" }, "title": "Cult of Luna + Caspian + Birds In Row ~ Atabal Biarritz", "url": "https://mobilizon.fr/events/4cc2afc6-7fbb-4b39-ba8b-5770f4130816" }, { "attributedTo": null, "beginsOn": "2022-10-06T16:15:00Z", "organizerActor": { "name": "Still Freak" }, "title": "PUNISH YOURSELF à Toulouse - Pink Paradize 2022", "url": "https://mobilizon.fr/events/46f6b32a-0597-4c0d-8f56-96d418e172ed" }, { "attributedTo": null, "beginsOn": "2022-10-07T18:45:00Z", "organizerActor": { "name": "Will pandarec" }, "title": "LUNCH + CHEAP ENTERTAINMENT @ [L'INTERMEDIAIRE]", "url": "https://mobilizon.fr/events/49073407-9c68-4569-98e7-94bf11bbe032" }, { "attributedTo": { "name": "le Plancher des Chèvres" }, "beginsOn": "2022-10-08T17:30:00Z", "organizerActor": null, "title": "OTTILIE [B] COEUR <3 et LOUISE O'SMAN", "url": "https://mobilizon.fr/events/d03eefd7-368c-457c-9ae1-b0d0cb87b465" }, { "attributedTo": { "name": "Apéros-Discussions SENSIBILIZON Nantes" }, "beginsOn": "2022-10-22T15:00:00Z", "organizerActor": null, "title": "DROITS HUMAINS : ON EN EST OÙ ? Samedi 22/10, 17h-19h", "url": "https://mobilizon.fr/events/56a8307b-f4e6-439a-a7a7-027b2e429e42" }, { "attributedTo": null, "beginsOn": "2022-10-29T17:30:00Z", "organizerActor": { "name": "Still Freak" }, "title": "Goulamas’K - Resaka Sonora", "url": "https://mobilizon.fr/events/37f991f8-2b4b-4e10-9362-b72210682064" } ], "total": 12 } } } ``` To play with the API, here's a very helpful link targeting the main instance directly: https://mobilizon.fr/graphiql So, it seems to be pretty straightforward, but there's an issue: as you can see we need to include both `organizerActor` and `attributedTo` because sometimes one is null and we must use the other. Hence the question: is it possible to indicate two fields and take the first one that is not null ?
issue