mirror of
https://github.com/scm-manager/scm-manager.git
synced 2025-11-13 00:45:44 +01:00
move rename logic to repository manager
This commit is contained in:
@@ -24,19 +24,13 @@
|
||||
|
||||
package sonia.scm.api.v2.resources;
|
||||
|
||||
import com.google.common.base.Strings;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.media.Content;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import io.swagger.v3.oas.annotations.responses.ApiResponse;
|
||||
import sonia.scm.HandlerEventType;
|
||||
import sonia.scm.config.ScmConfiguration;
|
||||
import sonia.scm.event.ScmEventBus;
|
||||
import sonia.scm.repository.NamespaceAndName;
|
||||
import sonia.scm.repository.Repository;
|
||||
import sonia.scm.repository.RepositoryManager;
|
||||
import sonia.scm.repository.RepositoryPermissions;
|
||||
import sonia.scm.repository.RepositoryRenamedEvent;
|
||||
import sonia.scm.web.VndMediaType;
|
||||
|
||||
import javax.inject.Inject;
|
||||
@@ -65,22 +59,17 @@ public class RepositoryResource {
|
||||
private final RepositoryManager manager;
|
||||
private final SingleResourceManagerAdapter<Repository, RepositoryDto> adapter;
|
||||
private final RepositoryBasedResourceProvider resourceProvider;
|
||||
private final ScmConfiguration scmConfiguration;
|
||||
private final ScmEventBus scmEventBus;
|
||||
|
||||
@Inject
|
||||
public RepositoryResource(
|
||||
RepositoryToRepositoryDtoMapper repositoryToDtoMapper,
|
||||
RepositoryDtoToRepositoryMapper dtoToRepositoryMapper, RepositoryManager manager,
|
||||
RepositoryBasedResourceProvider resourceProvider,
|
||||
ScmConfiguration scmConfiguration, ScmEventBus scmEventBus) {
|
||||
RepositoryBasedResourceProvider resourceProvider) {
|
||||
this.dtoToRepositoryMapper = dtoToRepositoryMapper;
|
||||
this.manager = manager;
|
||||
this.repositoryToDtoMapper = repositoryToDtoMapper;
|
||||
this.adapter = new SingleResourceManagerAdapter<>(manager, Repository.class);
|
||||
this.resourceProvider = resourceProvider;
|
||||
this.scmConfiguration = scmConfiguration;
|
||||
this.scmEventBus = scmEventBus;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -210,48 +199,11 @@ public class RepositoryResource {
|
||||
))
|
||||
@ApiResponse(responseCode = "500", description = "internal server error")
|
||||
public Response rename(@PathParam("namespace") String namespace, @PathParam("name") String name, @Valid RepositoryRenameDto renameDto) {
|
||||
Supplier<Repository> repoSupplier = loadBy(namespace, name);
|
||||
Repository unchangedRepo = repoSupplier.get();
|
||||
Repository changedRepo = unchangedRepo.clone();
|
||||
|
||||
if (isRenameForbidden(unchangedRepo, renameDto)) {
|
||||
return Response.status(403).build();
|
||||
}
|
||||
|
||||
if (hasNamespaceOrNameNotChanged(unchangedRepo, renameDto)) {
|
||||
return Response.status(400).build();
|
||||
}
|
||||
|
||||
if (!Strings.isNullOrEmpty(renameDto.getName())) {
|
||||
changedRepo.setName(renameDto.getName());
|
||||
}
|
||||
if (!Strings.isNullOrEmpty(renameDto.getNamespace())) {
|
||||
changedRepo.setNamespace(renameDto.getNamespace());
|
||||
}
|
||||
|
||||
return adapter.update(
|
||||
repoSupplier,
|
||||
existing -> {
|
||||
scmEventBus.post(new RepositoryRenamedEvent(HandlerEventType.MODIFY, changedRepo, unchangedRepo));
|
||||
return changedRepo;
|
||||
},
|
||||
changed -> true,
|
||||
r -> r.getNamespaceAndName().logString()
|
||||
);
|
||||
Repository repository = loadBy(namespace, name).get();
|
||||
manager.rename(repository, renameDto.getNamespace(), renameDto.getName());
|
||||
return Response.status(204).build();
|
||||
}
|
||||
|
||||
private boolean hasNamespaceOrNameNotChanged(Repository repo, @Valid RepositoryRenameDto renameDto) {
|
||||
return repo.getName().equals(renameDto.getName())
|
||||
&& repo.getNamespace().equals(renameDto.getNamespace());
|
||||
}
|
||||
|
||||
private boolean isRenameForbidden(Repository repo, RepositoryRenameDto renameDto) {
|
||||
return !scmConfiguration.getNamespaceStrategy().equals("CustomNamespaceStrategy")
|
||||
&& !repo.getNamespace().equals(renameDto.getNamespace())
|
||||
|| !RepositoryPermissions.rename(repo).isPermitted();
|
||||
}
|
||||
|
||||
|
||||
private Repository processUpdate(RepositoryDto repositoryDto, Repository existing) {
|
||||
Repository changedRepository = dtoToRepositoryMapper.map(repositoryDto, existing.getId());
|
||||
changedRepository.setPermissions(existing.getPermissions());
|
||||
|
||||
@@ -21,10 +21,11 @@
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
|
||||
package sonia.scm.repository;
|
||||
|
||||
import com.github.sdorra.ssp.PermissionActionCheck;
|
||||
import com.google.common.base.Strings;
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.common.util.concurrent.ThreadFactoryBuilder;
|
||||
import com.google.inject.Inject;
|
||||
@@ -35,6 +36,7 @@ import org.slf4j.LoggerFactory;
|
||||
import sonia.scm.ConfigurationException;
|
||||
import sonia.scm.HandlerEventType;
|
||||
import sonia.scm.ManagerDaoAdapter;
|
||||
import sonia.scm.NoChangesMadeException;
|
||||
import sonia.scm.NotFoundException;
|
||||
import sonia.scm.SCMContextProvider;
|
||||
import sonia.scm.Type;
|
||||
@@ -83,7 +85,6 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager {
|
||||
private final Provider<NamespaceStrategy> namespaceStrategyProvider;
|
||||
private final ManagerDaoAdapter<Repository> managerDaoAdapter;
|
||||
|
||||
|
||||
@Inject
|
||||
public DefaultRepositoryManager(ScmConfiguration configuration,
|
||||
SCMContextProvider contextProvider, KeyGenerator keyGenerator,
|
||||
@@ -154,7 +155,7 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void delete(Repository repository){
|
||||
public void delete(Repository repository) {
|
||||
logger.info("delete repository {}/{} of type {}", repository.getNamespace(), repository.getName(), repository.getType());
|
||||
managerDaoAdapter.delete(
|
||||
repository,
|
||||
@@ -179,7 +180,7 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void modify(Repository repository){
|
||||
public void modify(Repository repository) {
|
||||
logger.info("modify repository {}/{} of type {}", repository.getNamespace(), repository.getName(), repository.getType());
|
||||
|
||||
managerDaoAdapter.modify(
|
||||
@@ -243,6 +244,40 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager {
|
||||
return repository;
|
||||
}
|
||||
|
||||
public Repository rename(Repository repository, String newNamespace, String newName) {
|
||||
|
||||
if (!configuration.getNamespaceStrategy().equals("CustomNamespaceStrategy")
|
||||
&& !repository.getNamespace().equals(newNamespace)) {
|
||||
throw new ChangeNamespaceNotAllowedException(repository);
|
||||
}
|
||||
|
||||
if (hasNamespaceOrNameNotChanged(repository, newNamespace, newName)) {
|
||||
throw new NoChangesMadeException(repository);
|
||||
}
|
||||
|
||||
Repository changedRepository = repository.clone();
|
||||
if (!Strings.isNullOrEmpty(newName)) {
|
||||
changedRepository.setName(newName);
|
||||
}
|
||||
if (!Strings.isNullOrEmpty(newNamespace)) {
|
||||
changedRepository.setNamespace(newNamespace);
|
||||
}
|
||||
|
||||
managerDaoAdapter.modify(
|
||||
changedRepository,
|
||||
RepositoryPermissions::rename,
|
||||
notModified -> {
|
||||
},
|
||||
notModified -> fireEvent(HandlerEventType.MODIFY, changedRepository, repository));
|
||||
|
||||
return changedRepository;
|
||||
}
|
||||
|
||||
private boolean hasNamespaceOrNameNotChanged(Repository repository, String newNamespace, String newName) {
|
||||
return repository.getName().equals(newName)
|
||||
&& repository.getNamespace().equals(newNamespace);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<Repository> getAll(Predicate<Repository> filter, Comparator<Repository> comparator) {
|
||||
List<Repository> repositories = Lists.newArrayList();
|
||||
@@ -345,8 +380,7 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager {
|
||||
types.add(type);
|
||||
}
|
||||
|
||||
private RepositoryHandler getHandler(Repository repository)
|
||||
{
|
||||
private RepositoryHandler getHandler(Repository repository) {
|
||||
String type = repository.getType();
|
||||
RepositoryHandler handler = handlerMap.get(type);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user