show modified information on branches overview

This commit is contained in:
Eduard Heimbuch
2020-09-15 16:40:59 +02:00
parent 4f86beb11e
commit 6454167b0d
7 changed files with 115 additions and 27 deletions

View File

@@ -21,9 +21,10 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package sonia.scm.api.v2.resources;
import com.fasterxml.jackson.annotation.JsonInclude;
import de.otto.edison.hal.Embedded;
import de.otto.edison.hal.HalRepresentation;
import de.otto.edison.hal.Links;
@@ -31,20 +32,29 @@ import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Pattern;
import java.time.Instant;
@Getter @Setter @NoArgsConstructor
@Getter
@Setter
@NoArgsConstructor
public class BranchDto extends HalRepresentation {
private static final String VALID_CHARACTERS_AT_START_AND_END = "\\w-,;\\]{}@&+=$#`|<>";
private static final String VALID_CHARACTERS = VALID_CHARACTERS_AT_START_AND_END + "/.";
static final String VALID_BRANCH_NAMES = "[" + VALID_CHARACTERS_AT_START_AND_END + "]([" + VALID_CHARACTERS + "]*[" + VALID_CHARACTERS_AT_START_AND_END + "])?";
@NotEmpty @Length(min = 1, max=100) @Pattern(regexp = VALID_BRANCH_NAMES)
@NotEmpty
@Length(min = 1, max = 100)
@Pattern(regexp = VALID_BRANCH_NAMES)
private String name;
private String revision;
private boolean defaultBranch;
@JsonInclude(JsonInclude.Include.NON_NULL)
private Instant lastModified;
private PersonDto lastModifier;
BranchDto(Links links, Embedded embedded) {
super(links, embedded);

View File

@@ -21,7 +21,7 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package sonia.scm.api.v2.resources;
import de.otto.edison.hal.Embedded;
@@ -30,11 +30,19 @@ import org.mapstruct.Context;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.ObjectFactory;
import sonia.scm.ContextEntry;
import sonia.scm.repository.Branch;
import sonia.scm.repository.Changeset;
import sonia.scm.repository.InternalRepositoryException;
import sonia.scm.repository.NamespaceAndName;
import sonia.scm.repository.Person;
import sonia.scm.repository.api.RepositoryService;
import sonia.scm.repository.api.RepositoryServiceFactory;
import sonia.scm.web.EdisonHalAppender;
import javax.inject.Inject;
import java.io.IOException;
import java.time.Instant;
import static de.otto.edison.hal.Link.linkBuilder;
import static de.otto.edison.hal.Links.linkingTo;
@@ -45,9 +53,14 @@ public abstract class BranchToBranchDtoMapper extends HalAppenderMapper {
@Inject
private ResourceLinks resourceLinks;
@Inject
private RepositoryServiceFactory serviceFactory;
@Mapping(target = "attributes", ignore = true) // We do not map HAL attributes
public abstract BranchDto map(Branch branch, @Context NamespaceAndName namespaceAndName);
abstract PersonDto map(Person person);
@ObjectFactory
BranchDto createDto(@Context NamespaceAndName namespaceAndName, Branch branch) {
Links.Builder linksBuilder = linkingTo()
@@ -58,7 +71,20 @@ public abstract class BranchToBranchDtoMapper extends HalAppenderMapper {
Embedded.Builder embeddedBuilder = Embedded.embeddedBuilder();
applyEnrichers(new EdisonHalAppender(linksBuilder, embeddedBuilder), branch, namespaceAndName);
BranchDto branchDto = new BranchDto(linksBuilder.build(), embeddedBuilder.build());
return new BranchDto(linksBuilder.build(), embeddedBuilder.build());
try (RepositoryService service = serviceFactory.create(namespaceAndName)) {
Changeset latestChangeset = service.getLogCommand().setBranch(branch.getName()).getChangesets().getChangesets().get(0);
branchDto.setLastModified(Instant.ofEpochMilli(latestChangeset.getDate()));
branchDto.setLastModifier(map(latestChangeset.getAuthor()));
} catch (IOException e) {
throw new InternalRepositoryException(
ContextEntry.ContextBuilder.entity(Branch.class, branch.getName()),
"Could not read latest changeset for branch",
e
);
}
return branchDto;
}
}