From c9617232d5eeced643b510c108384619a7fc79b0 Mon Sep 17 00:00:00 2001
From: Vitaly Takmazov
Date: Thu, 15 Dec 2022 19:51:49 +0300
Subject: Extract user to actor conversion code into Converter
---
src/main/java/com/juick/ActivityPubManager.java | 1 -
.../java/com/juick/config/ActivityPubConfig.java | 13 +-
src/main/java/com/juick/config/AppConfig.java | 201 +++++++++++++++++++++
src/main/java/com/juick/config/SecurityConfig.java | 1 -
src/main/java/com/juick/config/WebConfig.java | 199 ++------------------
src/main/java/com/juick/config/XMPPConfig.java | 10 +-
src/main/java/com/juick/model/User.java | 8 +
.../com/juick/service/PushQueriesServiceImpl.java | 1 -
.../juick/service/activities/ActivityListener.java | 4 +-
.../com/juick/service/component/SystemEvent.java | 1 +
.../java/com/juick/www/api/activity/Profile.java | 37 +---
.../activity/converters/UserToActorConverter.java | 48 +++++
12 files changed, 297 insertions(+), 227 deletions(-)
create mode 100644 src/main/java/com/juick/config/AppConfig.java
create mode 100644 src/main/java/com/juick/www/api/activity/converters/UserToActorConverter.java
(limited to 'src/main/java/com/juick')
diff --git a/src/main/java/com/juick/ActivityPubManager.java b/src/main/java/com/juick/ActivityPubManager.java
index 7691aa6c..c909bd9b 100644
--- a/src/main/java/com/juick/ActivityPubManager.java
+++ b/src/main/java/com/juick/ActivityPubManager.java
@@ -70,7 +70,6 @@ import com.juick.www.api.activity.model.objects.Hashtag;
import com.juick.www.api.activity.model.objects.Image;
import com.juick.www.api.activity.model.objects.Mention;
import com.juick.www.api.activity.model.objects.Note;
-import com.juick.www.api.activity.model.objects.Person;
import io.pebbletemplates.pebble.PebbleEngine;
import io.pebbletemplates.pebble.template.PebbleTemplate;
diff --git a/src/main/java/com/juick/config/ActivityPubConfig.java b/src/main/java/com/juick/config/ActivityPubConfig.java
index c93c035b..786e19c4 100644
--- a/src/main/java/com/juick/config/ActivityPubConfig.java
+++ b/src/main/java/com/juick/config/ActivityPubConfig.java
@@ -19,7 +19,10 @@ package com.juick.config;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.juick.ActivityPubManager;
+import com.juick.KeystoreManager;
import com.juick.util.ActivityPubRequestInterceptor;
+import com.juick.www.WebApp;
+import com.juick.www.api.activity.converters.UserToActorConverter;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.springframework.context.annotation.Bean;
@@ -28,7 +31,6 @@ import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.client.RestTemplate;
-
import javax.inject.Inject;
import java.nio.charset.StandardCharsets;
@@ -39,6 +41,10 @@ public class ActivityPubConfig {
ActivityPubClientErrorHandler activityPubClientErrorHandler;
@Inject
ObjectMapper jsonMapper;
+ @Inject
+ KeystoreManager keystoreManager;
+ @Inject
+ WebApp webApp;
@Bean
MappingJackson2HttpMessageConverter mappingJacksonHttpMessageConverter() {
@@ -71,4 +77,9 @@ public class ActivityPubConfig {
restTemplate.getInterceptors().add(new ActivityPubRequestInterceptor());
return restTemplate;
}
+
+ @Bean
+ UserToActorConverter userToActorConverter() {
+ return new UserToActorConverter(activityPubManager(), keystoreManager, webApp);
+ }
}
diff --git a/src/main/java/com/juick/config/AppConfig.java b/src/main/java/com/juick/config/AppConfig.java
new file mode 100644
index 00000000..d54bc675
--- /dev/null
+++ b/src/main/java/com/juick/config/AppConfig.java
@@ -0,0 +1,201 @@
+/*
+ * Copyright (C) 2008-2020, 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 .
+ */
+
+package com.juick.config;
+
+import com.juick.*;
+import com.juick.model.User;
+import com.juick.service.HelpService;
+import com.juick.service.StorageService;
+import com.juick.service.FileSystemStorageService;
+import com.juick.service.UserService;
+import com.mitchellbosecke.pebble.extension.FormatterExtension;
+import com.overzealous.remark.Options;
+import com.overzealous.remark.Remark;
+
+import io.pebbletemplates.pebble.PebbleEngine;
+import io.pebbletemplates.pebble.loader.ClasspathLoader;
+import io.pebbletemplates.pebble.loader.Loader;
+import io.pebbletemplates.spring.extension.SpringExtension;
+import io.pebbletemplates.spring.servlet.PebbleViewResolver;
+
+import org.apache.commons.codec.CharEncoding;
+import org.commonmark.ext.autolink.AutolinkExtension;
+import org.commonmark.node.Link;
+import org.commonmark.parser.Parser;
+import org.commonmark.renderer.html.HtmlRenderer;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.Resource;
+import org.springframework.security.web.firewall.HttpStatusRequestRejectedHandler;
+import org.springframework.security.web.firewall.RequestRejectedHandler;
+import org.springframework.web.servlet.ViewResolver;
+import org.springframework.web.servlet.resource.ResourceUrlEncodingFilter;
+import org.springframework.web.servlet.resource.ResourceUrlProvider;
+
+import java.util.Collections;
+import javax.inject.Inject;
+
+/**
+ * Created by aalexeev on 11/22/16.
+ */
+@Configuration
+public class AppConfig {
+ @Value("${upload_tmp_dir:#{systemProperties['java.io.tmpdir']}}")
+ private String tmpDir;
+ @Value("${storage_path:#{systemProperties['java.io.tmpdir']}}")
+ private String baseDir;
+ @Value("${keystore:classpath:juick-test-key.p12}")
+ private Resource keystore;
+ @Value("${keystore_password:secret}")
+ private String keystorePassword;
+
+ @Bean
+ KeystoreManager keystoreManager() {
+ return new KeystoreManager(keystore, keystorePassword);
+ }
+
+ @Bean
+ StorageService storageService() {
+ return new FileSystemStorageService(baseDir, tmpDir);
+ }
+
+ @Bean
+ HelpService helpService() {
+ return new HelpService("help");
+ }
+
+ @Bean
+ Parser cmParser() {
+ return Parser.builder().extensions(Collections.singletonList(AutolinkExtension.create())).build();
+ }
+
+ @Bean
+ HtmlRenderer helpRenderer() {
+ return HtmlRenderer.builder()
+ .attributeProviderFactory(context -> (node, tagName, attributes) -> {
+ if (node instanceof Link) {
+ Link link = (Link) node;
+ if (link.getDestination().startsWith("/")) {
+ String destination = "/" + helpService().getHelpPath() + link.getDestination();
+ link.setDestination(destination);
+ attributes.put("href", destination);
+ }
+ }
+ })
+ .build();
+ }
+
+ @Bean
+ Loader> templateLoader() {
+ return new ClasspathLoader();
+ }
+
+ @Bean
+ SpringExtension springExtension() {
+ return new SpringExtension(null);
+ }
+
+ @Bean
+ PebbleEngine pebbleEngine() {
+ boolean devToolsArePresent = false;
+ try {
+ Class.forName("org.springframework.boot.devtools.livereload.Connection");
+ devToolsArePresent = true;
+ } catch (ClassNotFoundException e) {
+ // release mode
+ }
+ return new PebbleEngine.Builder()
+ .loader(this.templateLoader())
+ .cacheActive(!devToolsArePresent)
+ .extension(springExtension())
+ .extension(new FormatterExtension())
+ .newLineTrimming(false)
+ .strictVariables(true)
+ .build();
+ }
+
+ @Bean
+ ResourceUrlProvider resourceUrlProvider() {
+ return new ResourceUrlProvider();
+ }
+
+ @Bean
+ ResourceUrlEncodingFilter resourceUrlEncodingFilter() {
+ return new ResourceUrlEncodingFilter();
+ }
+
+ @Bean
+ Remark remarkConverter() {
+ Options options = new Options();
+ options.inlineLinks = true;
+ return new Remark(options);
+ }
+
+ @Bean
+ CommandsManager commandsManager() {
+ return new CommandsManager();
+ }
+
+ @Bean
+ ServerManager serverManager() {
+ return new ServerManager();
+ }
+
+ @Bean
+ SignatureManager signatureManager() {
+ return new SignatureManager();
+ }
+
+ @Bean
+ TopManager topManager() {
+ return new TopManager();
+ }
+
+ @Bean
+ ViewResolver viewResolver() {
+ PebbleViewResolver viewResolver = new PebbleViewResolver(pebbleEngine());
+ viewResolver.setPrefix("templates");
+ viewResolver.setSuffix(".html");
+ viewResolver.setCharacterEncoding(CharEncoding.UTF_8);
+ viewResolver.setExposeRequestAttributes(true);
+ return viewResolver;
+ }
+
+ @Inject
+ private UserService userService;
+ @Value("${service_user:juick}")
+ private String serviceUsername;
+ @Value("${archive_user:archive}")
+ private String archiveUsername;
+
+ @Bean
+ User serviceUser() {
+ return userService.getUserByName(serviceUsername);
+ }
+
+ @Bean
+ User archiveUser() {
+ return userService.getUserByName(archiveUsername);
+ }
+
+ @Bean
+ RequestRejectedHandler requestRejectedHandler() {
+ return new HttpStatusRequestRejectedHandler();
+ }
+}
diff --git a/src/main/java/com/juick/config/SecurityConfig.java b/src/main/java/com/juick/config/SecurityConfig.java
index dce44b5e..0d570dc7 100644
--- a/src/main/java/com/juick/config/SecurityConfig.java
+++ b/src/main/java/com/juick/config/SecurityConfig.java
@@ -29,7 +29,6 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
-import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.web.AuthenticationEntryPoint;
diff --git a/src/main/java/com/juick/config/WebConfig.java b/src/main/java/com/juick/config/WebConfig.java
index f2890bcd..7202c85b 100644
--- a/src/main/java/com/juick/config/WebConfig.java
+++ b/src/main/java/com/juick/config/WebConfig.java
@@ -1,192 +1,41 @@
-/*
- * Copyright (C) 2008-2020, 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 .
- */
-
package com.juick.config;
-import com.juick.*;
-import com.juick.model.User;
-import com.juick.service.HelpService;
-import com.juick.service.StorageService;
-import com.juick.service.FileSystemStorageService;
-import com.juick.service.UserService;
-import com.mitchellbosecke.pebble.extension.FormatterExtension;
-import com.overzealous.remark.Options;
-import com.overzealous.remark.Remark;
+import java.net.MalformedURLException;
+import java.nio.file.Paths;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
-import io.pebbletemplates.pebble.PebbleEngine;
-import io.pebbletemplates.pebble.loader.ClasspathLoader;
-import io.pebbletemplates.pebble.loader.Loader;
-import io.pebbletemplates.spring.extension.SpringExtension;
-import io.pebbletemplates.spring.servlet.PebbleViewResolver;
+import javax.inject.Inject;
-import org.apache.commons.codec.CharEncoding;
-import org.commonmark.ext.autolink.AutolinkExtension;
-import org.commonmark.node.Link;
-import org.commonmark.parser.Parser;
-import org.commonmark.renderer.html.HtmlRenderer;
import org.springframework.beans.factory.annotation.Value;
-import org.springframework.boot.web.servlet.FilterRegistrationBean;
-import org.springframework.boot.web.servlet.support.ErrorPageFilter;
import org.springframework.cache.annotation.EnableCaching;
-import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
-import org.springframework.core.io.Resource;
+import org.springframework.core.convert.converter.Converter;
+import org.springframework.format.FormatterRegistry;
import org.springframework.http.CacheControl;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
-import org.springframework.security.web.firewall.HttpStatusRequestRejectedHandler;
-import org.springframework.security.web.firewall.RequestRejectedHandler;
-import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
-import org.springframework.web.servlet.resource.ResourceUrlEncodingFilter;
import org.springframework.web.servlet.resource.VersionResourceResolver;
-import java.net.MalformedURLException;
-import java.nio.file.Paths;
-import java.util.Collections;
-import java.util.concurrent.TimeUnit;
-
-import javax.inject.Inject;
-
-/**
- * Created by aalexeev on 11/22/16.
- */
@Configuration
@EnableCaching
@EnableAsync(proxyTargetClass = true)
@EnableScheduling
public class WebConfig implements WebMvcConfigurer {
- @Value("${upload_tmp_dir:#{systemProperties['java.io.tmpdir']}}")
- private String tmpDir;
@Value("${storage_path:#{systemProperties['java.io.tmpdir']}}")
private String baseDir;
+ @Inject
+ private List extends Converter, ?>> converters;
- @Bean
- StorageService storageService() {
- return new FileSystemStorageService(baseDir, tmpDir);
- }
-
- @Bean
- HelpService helpService() {
- return new HelpService("help");
- }
-
- @Bean
- Parser cmParser() {
- return Parser.builder().extensions(Collections.singletonList(AutolinkExtension.create())).build();
- }
-
- @Bean
- HtmlRenderer helpRenderer() {
- return HtmlRenderer.builder()
- .attributeProviderFactory(context -> (node, tagName, attributes) -> {
- if (node instanceof Link) {
- Link link = (Link) node;
- if (link.getDestination().startsWith("/")) {
- String destination = "/" + helpService().getHelpPath() + link.getDestination();
- link.setDestination(destination);
- attributes.put("href", destination);
- }
- }
- })
- .build();
- }
-
- @Bean
- Loader> templateLoader() {
- return new ClasspathLoader();
- }
-
- @Bean
- SpringExtension springExtension() {
- return new SpringExtension(null);
- }
-
- @Bean
- PebbleEngine pebbleEngine() {
- boolean devToolsArePresent = false;
- try {
- Class.forName("org.springframework.boot.devtools.livereload.Connection");
- devToolsArePresent = true;
- } catch (ClassNotFoundException e) {
- // release mode
+ @Override
+ public void addFormatters(FormatterRegistry registry) {
+ for (Converter, ?> converter : converters) {
+ registry.addConverter(converter);
}
- return new PebbleEngine.Builder()
- .loader(this.templateLoader())
- .cacheActive(!devToolsArePresent)
- .extension(springExtension())
- .extension(new FormatterExtension())
- .newLineTrimming(false)
- .strictVariables(true)
- .build();
- }
-
- @Value("${keystore:classpath:juick-test-key.p12}")
- private Resource keystore;
- @Value("${keystore_password:secret}")
- private String keystorePassword;
-
- @Bean
- ResourceUrlEncodingFilter resourceUrlEncodingFilter() {
- return new ResourceUrlEncodingFilter();
- }
-
- @Bean
- KeystoreManager keystoreManager() {
- return new KeystoreManager(keystore, keystorePassword);
- }
-
- @Bean
- Remark remarkConverter() {
- Options options = new Options();
- options.inlineLinks = true;
- return new Remark(options);
- }
-
- @Bean
- CommandsManager commandsManager() {
- return new CommandsManager();
- }
-
- @Bean
- ServerManager serverManager() {
- return new ServerManager();
}
- @Bean
- SignatureManager signatureManager() {
- return new SignatureManager();
- }
-
- @Bean
- TopManager topManager() {
- return new TopManager();
- }
-
- @Bean
- ViewResolver viewResolver() {
- PebbleViewResolver viewResolver = new PebbleViewResolver(pebbleEngine());
- viewResolver.setPrefix("templates");
- viewResolver.setSuffix(".html");
- viewResolver.setCharacterEncoding(CharEncoding.UTF_8);
- viewResolver.setExposeRequestAttributes(true);
- return viewResolver;
- }
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
try {
@@ -200,26 +49,4 @@ public class WebConfig implements WebMvcConfigurer {
e.printStackTrace();
}
}
-
- @Inject
- private UserService userService;
- @Value("${service_user:juick}")
- private String serviceUsername;
- @Value("${archive_user:archive}")
- private String archiveUsername;
-
- @Bean
- User serviceUser() {
- return userService.getUserByName(serviceUsername);
- }
-
- @Bean
- User archiveUser() {
- return userService.getUserByName(archiveUsername);
- }
-
- @Bean
- RequestRejectedHandler requestRejectedHandler() {
- return new HttpStatusRequestRejectedHandler();
- }
}
diff --git a/src/main/java/com/juick/config/XMPPConfig.java b/src/main/java/com/juick/config/XMPPConfig.java
index cde4c0dc..8604b52b 100644
--- a/src/main/java/com/juick/config/XMPPConfig.java
+++ b/src/main/java/com/juick/config/XMPPConfig.java
@@ -19,20 +19,18 @@ package com.juick.config;
import com.juick.XMPPManager;
import com.juick.util.xmpp.JidConverter;
+
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
-import org.springframework.core.convert.ConversionService;
-import org.springframework.format.support.DefaultFormattingConversionService;
@Configuration
@ConditionalOnProperty("xmppbot_jid")
public class XMPPConfig {
+
@Bean
- static ConversionService conversionService() {
- DefaultFormattingConversionService cs = new DefaultFormattingConversionService();
- cs.addConverter(new JidConverter());
- return cs;
+ JidConverter jidConverter() {
+ return new JidConverter();
}
@Bean
diff --git a/src/main/java/com/juick/model/User.java b/src/main/java/com/juick/model/User.java
index 5cc0d125..131ec1b1 100644
--- a/src/main/java/com/juick/model/User.java
+++ b/src/main/java/com/juick/model/User.java
@@ -56,6 +56,7 @@ public class User implements Serializable {
private URI uri;
private Instant seen;
private boolean verified;
+ private boolean service;
private String country;
private String url;
private String description;
@@ -243,6 +244,13 @@ public class User implements Serializable {
public void setVerified(boolean verified) {
this.verified = verified;
}
+ @XmlTransient
+ public boolean isService() {
+ return service;
+ }
+ public void setService(boolean service) {
+ this.service = service;
+ }
public String getCountry() {
return country;
diff --git a/src/main/java/com/juick/service/PushQueriesServiceImpl.java b/src/main/java/com/juick/service/PushQueriesServiceImpl.java
index 7f066ad7..0dfa59df 100644
--- a/src/main/java/com/juick/service/PushQueriesServiceImpl.java
+++ b/src/main/java/com/juick/service/PushQueriesServiceImpl.java
@@ -19,7 +19,6 @@ package com.juick.service;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.dao.DataIntegrityViolationException;
-import org.springframework.dao.DuplicateKeyException;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
diff --git a/src/main/java/com/juick/service/activities/ActivityListener.java b/src/main/java/com/juick/service/activities/ActivityListener.java
index 3dcd123c..badda8a3 100644
--- a/src/main/java/com/juick/service/activities/ActivityListener.java
+++ b/src/main/java/com/juick/service/activities/ActivityListener.java
@@ -20,10 +20,12 @@ package com.juick.service.activities;
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
+import jakarta.annotation.Nonnull;
+
public interface ActivityListener {
@Async
@EventListener
- void processFollowEvent(FollowEvent event);
+ void processFollowEvent(@Nonnull FollowEvent event);
@Async
@EventListener
void undoFollowEvent(UndoFollowEvent event);
diff --git a/src/main/java/com/juick/service/component/SystemEvent.java b/src/main/java/com/juick/service/component/SystemEvent.java
index f4e3ff90..830813ad 100644
--- a/src/main/java/com/juick/service/component/SystemEvent.java
+++ b/src/main/java/com/juick/service/component/SystemEvent.java
@@ -23,6 +23,7 @@ import com.juick.www.api.SystemActivity;
import org.springframework.context.ApplicationEvent;
public class SystemEvent extends ApplicationEvent {
+ @Nonnull
private final SystemActivity activity;
/**
* Create a new ApplicationEvent.
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 95fd2fc1..ff1227a3 100644
--- a/src/main/java/com/juick/www/api/activity/Profile.java
+++ b/src/main/java/com/juick/www/api/activity/Profile.java
@@ -24,7 +24,6 @@ import com.juick.util.formatters.PlainTextFormatter;
import com.juick.model.CommandResult;
import com.juick.ActivityPubManager;
import com.juick.CommandsManager;
-import com.juick.KeystoreManager;
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;
@@ -36,16 +35,11 @@ import com.juick.www.api.activity.model.activities.Like;
import com.juick.www.api.activity.model.activities.Undo;
import com.juick.www.api.activity.model.activities.Update;
import com.juick.www.api.activity.model.objects.Actor;
-import com.juick.www.api.activity.model.objects.Application;
-import com.juick.www.api.activity.model.objects.Image;
-import com.juick.www.api.activity.model.objects.Key;
import com.juick.www.api.activity.model.objects.Note;
import com.juick.www.api.activity.model.objects.OrderedCollection;
import com.juick.www.api.activity.model.objects.OrderedCollectionPage;
import com.juick.www.api.activity.model.objects.Person;
-import com.juick.www.api.activity.model.objects.Tombstone;
import com.juick.util.HttpNotFoundException;
-import com.juick.www.WebApp;
import com.juick.service.MessagesService;
import com.juick.service.UserService;
import com.juick.service.activities.AnnounceEvent;
@@ -61,8 +55,8 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationEventPublisher;
+import org.springframework.core.convert.ConversionService;
import org.springframework.http.HttpStatus;
-import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@@ -89,8 +83,6 @@ public class Profile {
@Inject
private MessagesService messagesService;
@Inject
- private KeystoreManager keystoreManager;
- @Inject
private ActivityPubManager activityPubManager;
@Inject
private ApplicationEventPublisher applicationEventPublisher;
@@ -103,36 +95,21 @@ public class Profile {
@Inject
private ObjectMapper jsonMapper;
@Inject
- private WebApp webApp;
- @Inject
private Remark remarkConverter;
@Inject
private User serviceUser;
+ @Inject
+ private ConversionService conversionService;
@GetMapping(value = "/u/{userName}", produces = { Context.LD_JSON_MEDIA_TYPE,
Context.ACTIVITYSTREAMS_PROFILE_MEDIA_TYPE, Context.FALLBACK_JSON_MEDIA_TYPE })
public Actor getUser(@PathVariable String userName) {
User user = userService.getUserByName(userName);
if (!user.isAnonymous()) {
- Actor profile = user.equals(serviceUser) ? new Application() : new Person();
- profile.setId(activityPubManager.personUri(user));
- profile.setUrl(activityPubManager.personWebUri(user));
- profile.setName(userName);
- profile.setPreferredUsername(userName);
- Key publicKey = new Key();
- publicKey.setId(profile.getId() + "#main-key");
- 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));
- Image avatar = new Image();
- avatar.setUrl(webApp.getAvatarUrl(user));
- avatar.setMediaType("image/png");
- profile.setIcon(avatar);
- return (Actor) Context.build(profile);
+ if (user.equals(serviceUser)) {
+ user.setService(true);
+ }
+ return conversionService.convert(user, Actor.class);
}
throw new HttpNotFoundException();
}
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
new file mode 100644
index 00000000..405c27ab
--- /dev/null
+++ b/src/main/java/com/juick/www/api/activity/converters/UserToActorConverter.java
@@ -0,0 +1,48 @@
+package com.juick.www.api.activity.converters;
+
+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;
+import com.juick.www.api.activity.model.Context;
+import com.juick.www.api.activity.model.objects.Actor;
+import com.juick.www.api.activity.model.objects.Application;
+import com.juick.www.api.activity.model.objects.Image;
+import com.juick.www.api.activity.model.objects.Key;
+import com.juick.www.api.activity.model.objects.Person;
+
+import lombok.AllArgsConstructor;
+
+@AllArgsConstructor
+public class UserToActorConverter implements Converter {
+
+ private ActivityPubManager activityPubManager;
+ 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.setName(user.getName());
+ profile.setPreferredUsername(user.getName());
+ Key publicKey = new Key();
+ publicKey.setId(profile.getId() + "#main-key");
+ 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));
+ Image avatar = new Image();
+ avatar.setUrl(webApp.getAvatarUrl(user));
+ avatar.setMediaType("image/png");
+ profile.setIcon(avatar);
+ return (Actor) Context.build(profile);
+ }
+
+}
--
cgit v1.2.3