this post was submitted on 31 Jul 2023
71 points (100.0% liked)
Fediverse
28388 readers
712 users here now
A community to talk about the Fediverse and all it's related services using ActivityPub (Mastodon, Lemmy, KBin, etc).
If you wanted to get help with moderating your own community then head over to !moderators@lemmy.world!
Rules
- Posts must be on topic.
- Be respectful of others.
- Cite the sources used for graphs and other statistics.
- Follow the general Lemmy.world rules.
Learn more at these websites: Join The Fediverse Wiki, Fediverse.info, Wikipedia Page, The Federation Info (Stats), FediDB (Stats), Sub Rehab (Reddit Migration), Search Lemmy
founded 1 year ago
MODERATORS
you are viewing a single comment's thread
view the rest of the comments
view the rest of the comments
I've read the discussion on this, IDs are specific to each instance so you'd have to fetch from the instance then translate the ID to your instance's own version. It's in progress but kind of stalled because of that for some reason.
It's actually easy, here's an explanation for one simple way you could do it.
On my instance, this post has the URL: https://lm.williampuckering.com/post/171615
On the instance the post originated on, the URL is: https://lemmings.world/post/175809
So on my instance, the post has the ID: 171615
On the originating instance, the ID is: 175809
In the database on my instance, this query will retrieve the post:
select * from post where id = 171615
Also in the database on my instance, this query will retrieve the post:
select * from post where ap_id = 'https://lemmings.world/post/175809'
Using the second query and finding the post by URL, I can see if the post is federated to my own instance or not. If so, I can look at the
id
field in the database and merely swap it out with the originating instance's ID, and form the URL to access the post as it exists on my own instance. If the post isn't federated on my own instance, then of course this won't work. But that makes total sense, since you won't be able to transform links for external instances to the corresponding entity on your own instance, because it doesn't exist there.tl;dr - You can look up local entities by ID, and you can lookup remote entities by original URL. Then you just need to swap the ID in the URL to the ID (primary key in the table) in the database, if it exists, to convert a remote link to a local link. If a link can't be converted, you can just leave it as-is.
The capability needed to add this functionality is already there. Someone just needs to decide how to handle it on the frontend elegantly from a UI perspective, and decide how the backend will pass what's required to the frontend to drive the functionality. But the plumbing is already there.
One practical way to go about this would be to add one or more API endpoints to transform remote entities (URLs) to local entities, if they exist. Whenever posts/comments/whatever are loaded into the client's browser, Lemmy UI can have code that takes any links that match patterns for Lemmy entities, and use the API endpoints to transform the remote URLs to local URLs, if it can be done. For those that can be done, swap the remote URLs on the frontend for the local ones (at this point it's essentially just find/replace). That's one quick and simple way to do it that shouldn't be all that performance-impacting. There might be more elegant and efficient ways I can think of if I put more effort into thinking about this, but that for sure would work and be a decent first-cut solution. You could even add a caching mechanism (or maybe even a new database table) to persist the mapping as it happens so that you don't need to do it on each request for a given entity, only the first time. Also, doing it this way allows for content that is not yet federated to work if one day it becomes federated (ie. try to do this mapping or each entity, everytime, if it never works, until one day it does).
Neat, thanks!