mirror of
https://github.com/scm-manager/scm-manager.git
synced 2026-03-17 17:50:18 +01:00
Add rest endpoint for import log
This commit is contained in:
@@ -47,6 +47,7 @@ import sonia.scm.importexport.FromBundleImporter;
|
||||
import sonia.scm.importexport.FromUrlImporter;
|
||||
import sonia.scm.importexport.FullScmRepositoryImporter;
|
||||
import sonia.scm.importexport.RepositoryImportExportEncryption;
|
||||
import sonia.scm.importexport.RepositoryImportLoggerFactory;
|
||||
import sonia.scm.repository.Repository;
|
||||
import sonia.scm.repository.RepositoryPermissions;
|
||||
import sonia.scm.repository.api.Command;
|
||||
@@ -59,14 +60,17 @@ import javax.validation.constraints.NotEmpty;
|
||||
import javax.validation.constraints.Pattern;
|
||||
import javax.ws.rs.Consumes;
|
||||
import javax.ws.rs.DefaultValue;
|
||||
import javax.ws.rs.GET;
|
||||
import javax.ws.rs.POST;
|
||||
import javax.ws.rs.Path;
|
||||
import javax.ws.rs.PathParam;
|
||||
import javax.ws.rs.Produces;
|
||||
import javax.ws.rs.QueryParam;
|
||||
import javax.ws.rs.WebApplicationException;
|
||||
import javax.ws.rs.core.Context;
|
||||
import javax.ws.rs.core.MediaType;
|
||||
import javax.ws.rs.core.Response;
|
||||
import javax.ws.rs.core.StreamingOutput;
|
||||
import javax.ws.rs.core.UriInfo;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
@@ -87,6 +91,7 @@ public class RepositoryImportResource {
|
||||
private final RepositoryImportDtoToRepositoryImportParametersMapper importParametersMapper;
|
||||
private final FromUrlImporter fromUrlImporter;
|
||||
private final FromBundleImporter fromBundleImporter;
|
||||
private final RepositoryImportLoggerFactory importLoggerFactory;
|
||||
|
||||
@Inject
|
||||
public RepositoryImportResource(RepositoryDtoToRepositoryMapper mapper,
|
||||
@@ -94,7 +99,8 @@ public class RepositoryImportResource {
|
||||
FullScmRepositoryImporter fullScmRepositoryImporter,
|
||||
RepositoryImportDtoToRepositoryImportParametersMapper importParametersMapper,
|
||||
RepositoryImportExportEncryption repositoryImportExportEncryption, FromUrlImporter fromUrlImporter,
|
||||
FromBundleImporter fromBundleImporter) {
|
||||
FromBundleImporter fromBundleImporter,
|
||||
RepositoryImportLoggerFactory importLoggerFactory) {
|
||||
this.mapper = mapper;
|
||||
this.resourceLinks = resourceLinks;
|
||||
this.fullScmRepositoryImporter = fullScmRepositoryImporter;
|
||||
@@ -102,6 +108,7 @@ public class RepositoryImportResource {
|
||||
this.importParametersMapper = importParametersMapper;
|
||||
this.fromUrlImporter = fromUrlImporter;
|
||||
this.fromBundleImporter = fromBundleImporter;
|
||||
this.importLoggerFactory = importLoggerFactory;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -254,6 +261,13 @@ public class RepositoryImportResource {
|
||||
return Response.created(URI.create(resourceLinks.repository().self(createdRepository.getNamespace(), createdRepository.getName()))).build();
|
||||
}
|
||||
|
||||
@GET
|
||||
@Path("log/{logId}")
|
||||
@Produces(MediaType.TEXT_PLAIN)
|
||||
public StreamingOutput getImportLog(@PathParam("logId") String logId) {
|
||||
return out -> importLoggerFactory.getLog(logId, out);
|
||||
}
|
||||
|
||||
private Repository importFullRepositoryFromInput(MultipartFormDataInput input) {
|
||||
Map<String, List<InputPart>> formParts = input.getFormDataMap();
|
||||
InputStream inputStream = extractInputStream(formParts);
|
||||
|
||||
@@ -35,6 +35,8 @@ import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
import static java.lang.String.format;
|
||||
import static java.util.Arrays.asList;
|
||||
import static java.util.Collections.unmodifiableList;
|
||||
|
||||
@XmlRootElement(name = "import")
|
||||
@@ -65,6 +67,16 @@ class RepositoryImportLog {
|
||||
return unmodifiableList(entries);
|
||||
}
|
||||
|
||||
public List<String> toLogHeader() {
|
||||
return asList(
|
||||
format("Import of repository %s/%s", namespace, name),
|
||||
format("Repository type: %s", repositoryId),
|
||||
format("Imported from: %s", type),
|
||||
format("Imported by %s (%s)", userId, userName),
|
||||
success ? "Finished successful" : "Import failed"
|
||||
);
|
||||
}
|
||||
|
||||
enum ImportType {
|
||||
FULL, URL, DUMP
|
||||
}
|
||||
@@ -82,5 +94,9 @@ class RepositoryImportLog {
|
||||
Entry(String message) {
|
||||
this.message = message;
|
||||
}
|
||||
|
||||
public String toLogMessage() {
|
||||
return time + " - " + message;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,11 +24,14 @@
|
||||
|
||||
package sonia.scm.importexport;
|
||||
|
||||
import sonia.scm.NotFoundException;
|
||||
import sonia.scm.store.DataStoreFactory;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import java.io.OutputStream;
|
||||
import java.io.PrintStream;
|
||||
|
||||
class RepositoryImportLoggerFactory {
|
||||
public class RepositoryImportLoggerFactory {
|
||||
|
||||
private final DataStoreFactory dataStoreFactory;
|
||||
|
||||
@@ -40,4 +43,14 @@ class RepositoryImportLoggerFactory {
|
||||
RepositoryImportLogger createLogger() {
|
||||
return new RepositoryImportLogger(dataStoreFactory.withType(RepositoryImportLog.class).withName("imports").build());
|
||||
}
|
||||
|
||||
public void getLog(String logId, OutputStream out) {
|
||||
RepositoryImportLog log = dataStoreFactory.withType(RepositoryImportLog.class).withName("imports").build().getOptional(logId).orElseThrow(() -> new NotFoundException("Log", logId));
|
||||
PrintStream printStream = new PrintStream(out);
|
||||
log.toLogHeader().forEach(printStream::println);
|
||||
log.getEntries()
|
||||
.stream()
|
||||
.map(RepositoryImportLog.Entry::toLogMessage)
|
||||
.forEach(printStream::println);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -53,6 +53,7 @@ import sonia.scm.importexport.FromUrlImporter;
|
||||
import sonia.scm.importexport.FullScmRepositoryExporter;
|
||||
import sonia.scm.importexport.FullScmRepositoryImporter;
|
||||
import sonia.scm.importexport.RepositoryImportExportEncryption;
|
||||
import sonia.scm.importexport.RepositoryImportLoggerFactory;
|
||||
import sonia.scm.repository.CustomNamespaceStrategy;
|
||||
import sonia.scm.repository.NamespaceAndName;
|
||||
import sonia.scm.repository.NamespaceStrategy;
|
||||
@@ -166,6 +167,8 @@ public class RepositoryRootResourceTest extends RepositoryTestBase {
|
||||
@Mock
|
||||
private ExportFileExtensionResolver fileExtensionResolver;
|
||||
@Mock
|
||||
private RepositoryImportLoggerFactory importLoggerFactory;
|
||||
@Mock
|
||||
private ExportService exportService;
|
||||
|
||||
@Captor
|
||||
@@ -187,7 +190,7 @@ public class RepositoryRootResourceTest extends RepositoryTestBase {
|
||||
super.manager = repositoryManager;
|
||||
RepositoryCollectionToDtoMapper repositoryCollectionToDtoMapper = new RepositoryCollectionToDtoMapper(repositoryToDtoMapper, resourceLinks);
|
||||
super.repositoryCollectionResource = new RepositoryCollectionResource(repositoryManager, repositoryCollectionToDtoMapper, dtoToRepositoryMapper, resourceLinks, repositoryInitializer);
|
||||
super.repositoryImportResource = new RepositoryImportResource(dtoToRepositoryMapper, resourceLinks, fullScmRepositoryImporter, new RepositoryImportDtoToRepositoryImportParametersMapperImpl(), repositoryImportExportEncryption, fromUrlImporter, fromBundleImporter);
|
||||
super.repositoryImportResource = new RepositoryImportResource(dtoToRepositoryMapper, resourceLinks, fullScmRepositoryImporter, new RepositoryImportDtoToRepositoryImportParametersMapperImpl(), repositoryImportExportEncryption, fromUrlImporter, fromBundleImporter, importLoggerFactory);
|
||||
super.repositoryExportResource = new RepositoryExportResource(repositoryManager, serviceFactory, fullScmRepositoryExporter, repositoryImportExportEncryption, exportService, exportInformationToDtoMapper, fileExtensionResolver, resourceLinks);
|
||||
dispatcher.addSingletonResource(getRepositoryRootResource());
|
||||
when(serviceFactory.create(any(Repository.class))).thenReturn(service);
|
||||
|
||||
Reference in New Issue
Block a user