diff options
Diffstat (limited to 'src/main/java/com/juick/www/api')
4 files changed, 106 insertions, 14 deletions
diff --git a/src/main/java/com/juick/www/api/Post.java b/src/main/java/com/juick/www/api/Post.java index 9faf883a..63c95f2a 100644 --- a/src/main/java/com/juick/www/api/Post.java +++ b/src/main/java/com/juick/www/api/Post.java @@ -23,9 +23,10 @@ import java.util.List; import java.util.Optional; import javax.inject.Inject; + +import com.juick.www.api.activity.helpers.ProfileUriBuilder; import jakarta.validation.constraints.NotNull; -import com.juick.ActivityPubManager; import com.juick.CommandsManager; import com.juick.model.CommandResult; import com.juick.model.Message; @@ -75,7 +76,7 @@ public class Post { @Inject ApplicationEventPublisher applicationEventPublisher; @Inject - ActivityPubManager activityPubManager; + ProfileUriBuilder profileUriBuilder; @RequestMapping(value = "/api/post", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @ResponseStatus(value = HttpStatus.OK) @@ -236,7 +237,7 @@ public class Post { messagesService.getMessage(mid).orElseThrow(IllegalStateException::new) : messagesService.getReply(mid, rid); applicationEventPublisher.publishEvent( - new UpdateEvent(this, author, activityPubManager.messageUri(mid, rid))); + new UpdateEvent(this, author, profileUriBuilder.messageUri(mid, rid))); return CommandResult.build(result, "Message updated", StringUtils.EMPTY); } throw new HttpBadRequestException(); diff --git a/src/main/java/com/juick/www/api/activity/Profile.java b/src/main/java/com/juick/www/api/activity/Profile.java index ff1227a3..5deba2cf 100644 --- a/src/main/java/com/juick/www/api/activity/Profile.java +++ b/src/main/java/com/juick/www/api/activity/Profile.java @@ -24,6 +24,7 @@ import com.juick.util.formatters.PlainTextFormatter; import com.juick.model.CommandResult; import com.juick.ActivityPubManager; import com.juick.CommandsManager; +import com.juick.www.api.activity.helpers.ProfileUriBuilder; import com.juick.www.api.activity.model.Activity; import com.juick.www.api.activity.model.Context; import com.juick.www.api.activity.model.activities.Announce; @@ -85,6 +86,8 @@ public class Profile { @Inject private ActivityPubManager activityPubManager; @Inject + private ProfileUriBuilder profileUriBuilder; + @Inject private ApplicationEventPublisher applicationEventPublisher; @Inject private CommandsManager commandsManager; @@ -195,7 +198,7 @@ public class Profile { Person follower = new Person(); follower.setName(a.getName()); follower.setPreferredUsername(a.getName()); - follower.setUrl(activityPubManager.personWebUri(a)); + follower.setUrl(profileUriBuilder.personWebUri(a)); return follower; }).collect(Collectors.toList())); boolean hasNext = followers.size() <= 20 * page; @@ -239,7 +242,7 @@ public class Profile { Person follower = new Person(); follower.setName(a.getName()); follower.setPreferredUsername(a.getName()); - follower.setUrl(activityPubManager.personWebUri(a)); + follower.setUrl(profileUriBuilder.personWebUri(a)); return follower; }).collect(Collectors.toList())); boolean hasNext = following.size() <= 20 * page; @@ -301,7 +304,7 @@ public class Profile { String inReplyTo = (String) note.getInReplyTo(); if (StringUtils.isNotBlank(inReplyTo)) { if (inReplyTo.startsWith(baseUri)) { - String postId = activityPubManager.postId(inReplyTo); + String postId = profileUriBuilder.postId(inReplyTo); User user = new User(); user.setUri(URI.create(activity.getActor())); String markdown = remarkConverter.convertFragment((String) note.getContent()); diff --git a/src/main/java/com/juick/www/api/activity/converters/UserToActorConverter.java b/src/main/java/com/juick/www/api/activity/converters/UserToActorConverter.java index 405c27ab..435cb50d 100644 --- a/src/main/java/com/juick/www/api/activity/converters/UserToActorConverter.java +++ b/src/main/java/com/juick/www/api/activity/converters/UserToActorConverter.java @@ -1,8 +1,8 @@ package com.juick.www.api.activity.converters; +import com.juick.www.api.activity.helpers.ProfileUriBuilder; import org.springframework.core.convert.converter.Converter; -import com.juick.ActivityPubManager; import com.juick.KeystoreManager; import com.juick.model.User; import com.juick.www.WebApp; @@ -18,15 +18,15 @@ import lombok.AllArgsConstructor; @AllArgsConstructor public class UserToActorConverter implements Converter<User, Actor> { - private ActivityPubManager activityPubManager; + private ProfileUriBuilder profileUriBuilder; private KeystoreManager keystoreManager; private WebApp webApp; @Override public Actor convert(User user) { Actor profile = user.isService() ? new Application() : new Person(); - profile.setId(activityPubManager.personUri(user)); - profile.setUrl(activityPubManager.personWebUri(user)); + profile.setId(profileUriBuilder.personUri(user)); + profile.setUrl(profileUriBuilder.personWebUri(user)); profile.setName(user.getName()); profile.setPreferredUsername(user.getName()); Key publicKey = new Key(); @@ -34,10 +34,10 @@ public class UserToActorConverter implements Converter<User, Actor> { publicKey.setOwner(profile.getId()); publicKey.setPublicKeyPem(keystoreManager.getPublicKeyPem()); profile.setPublicKey(publicKey); - profile.setInbox(activityPubManager.inboxUri()); - profile.setOutbox(activityPubManager.outboxUri(user)); - profile.setFollowers(activityPubManager.followersUri(user)); - profile.setFollowing(activityPubManager.followingUri(user)); + profile.setInbox(profileUriBuilder.inboxUri()); + profile.setOutbox(profileUriBuilder.outboxUri(user)); + profile.setFollowers(profileUriBuilder.followersUri(user)); + profile.setFollowing(profileUriBuilder.followingUri(user)); Image avatar = new Image(); avatar.setUrl(webApp.getAvatarUrl(user)); avatar.setMediaType("image/png"); diff --git a/src/main/java/com/juick/www/api/activity/helpers/ProfileUriBuilder.java b/src/main/java/com/juick/www/api/activity/helpers/ProfileUriBuilder.java new file mode 100644 index 00000000..8f5e7566 --- /dev/null +++ b/src/main/java/com/juick/www/api/activity/helpers/ProfileUriBuilder.java @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2008-2022, Juick + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package com.juick.www.api.activity.helpers; + +import com.juick.model.Message; +import com.juick.model.Tag; +import com.juick.model.User; +import lombok.AllArgsConstructor; +import org.springframework.web.util.UriComponents; +import org.springframework.web.util.UriComponentsBuilder; + +@AllArgsConstructor +public class ProfileUriBuilder { + private String baseUri; + + public String getBaseUri() { + return baseUri; + } + + public String inboxUri() { + UriComponentsBuilder uri = UriComponentsBuilder.fromUriString(baseUri); + return uri.replacePath("/api/inbox").toUriString(); + } + + public String outboxUri(User user) { + UriComponentsBuilder uri = UriComponentsBuilder.fromUriString(baseUri); + return uri.replacePath(String.format("/u/%s/blog/toc", user.getName())).toUriString(); + } + + public String personUri(User user) { + if (user.getUri().toString().length() > 0) { + return user.getUri().toASCIIString(); + } + UriComponentsBuilder uri = UriComponentsBuilder.fromUriString(baseUri); + return uri.replacePath(String.format("/u/%s", user.getName())).toUriString(); + } + + public String personWebUri(User user) { + UriComponentsBuilder uri = UriComponentsBuilder.fromUriString(baseUri); + return uri.replacePath(String.format("/%s/", user.getName())).toUriString(); + } + + public String followersUri(User user) { + UriComponentsBuilder uri = UriComponentsBuilder.fromUriString(baseUri); + return uri.replacePath(String.format("/u/%s/followers/toc", user.getName())).toUriString(); + } + + public String followingUri(User user) { + UriComponentsBuilder uri = UriComponentsBuilder.fromUriString(baseUri); + return uri.replacePath(String.format("/u/%s/following/toc", user.getName())).toUriString(); + } + + public String messageUri(Message msg) { + return messageUri(msg.getMid(), msg.getRid()); + } + + public String messageUri(int mid, int rid) { + UriComponentsBuilder uri = UriComponentsBuilder.fromUriString(baseUri); + uri.replacePath(String.format("/n/%d-%d", mid, rid)); + return uri.toUriString(); + } + + public String tagUri(Tag tag) { + UriComponentsBuilder uri = UriComponentsBuilder.fromUriString(baseUri); + return uri.replacePath(String.format("/t/%s", tag.getName())).toUriString(); + } + + public String postId(String messageUri) { + UriComponents uri = UriComponentsBuilder.fromUriString(messageUri).build(); + return uri.getPath().substring(uri.getPath().lastIndexOf('/') + 1) + .replace("-", "/"); + } +} |