Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Archive #51

Open
wants to merge 28 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
48d1bfb
Archive all version history
cjmalloy Jan 12, 2023
f6c2107
Build archive version separately
cjmalloy Jan 12, 2023
9c5ce47
Merge branch 'master' into archive
cjmalloy Jan 19, 2023
8c40614
Merge branch 'master' into archive
cjmalloy Jan 22, 2023
773f291
Merge branch 'master' into archive
cjmalloy Jan 23, 2023
2d03f53
Merge branch 'master' into archive
cjmalloy Jan 23, 2023
2a8c211
Merge branch 'master' into archive
cjmalloy Jan 24, 2023
60f02a2
Merge branch 'master' into archive
cjmalloy Jan 25, 2023
671cd7b
Merge branch 'master' into archive
cjmalloy Jan 27, 2023
4f9fcee
Merge branch 'master' into archive
cjmalloy Jan 29, 2023
5e15e66
Merge branch 'master' into archive
cjmalloy Jan 29, 2023
453954d
Merge branch 'master' into archive
cjmalloy Jan 31, 2023
5575d57
Fixed tests
cjmalloy Feb 2, 2023
3ba663e
Allow editing locked refs in archive mode since we save everythign
cjmalloy Feb 2, 2023
c534431
Merge branch 'master' into archive
cjmalloy Feb 2, 2023
79318c3
Merge branch 'master' into archive
cjmalloy Feb 2, 2023
ca469e5
Fixed tests
cjmalloy Feb 2, 2023
0024c16
Merge branch 'master' into archive
cjmalloy Feb 8, 2023
7cbad20
Better claim filtering for user principal (#3)
cjmalloy Feb 8, 2023
b6a922b
Merge branch 'master' into archive
cjmalloy Feb 13, 2023
7659b3c
Merge branch 'master' into archive
cjmalloy Feb 19, 2023
66bfc17
Merge branch 'master' into archive
cjmalloy Feb 24, 2023
6018ed8
Merge branch 'master' into archive
cjmalloy Feb 26, 2023
9b4e61e
Merge branch 'master' into archive
cjmalloy Feb 28, 2023
9bfaaa7
Merge branch 'master' into archive
cjmalloy Mar 16, 2023
5f533ac
Merge branch 'master' into archive
cjmalloy Apr 8, 2023
66eb3cc
Merge branch 'master' into archive
cjmalloy Apr 8, 2023
966c2f5
Merge branch 'master' into archive
cjmalloy Apr 8, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/docker-image.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ name: Build & Test

on:
push:
branches: [ master ]
branches: [ archive ]
pull_request:
branches: [ master ]
branches: [ archive ]

jobs:

Expand Down
12 changes: 6 additions & 6 deletions .github/workflows/docker-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@ name: Publish Docker

on:
push:
branches: [ master ]
tags: [ 'v*.*.*' ]
branches: [ archive ]
tags: [ 'archive-v*.*.*' ]
pull_request:
branches: [ master ]
branches: [ archive ]

env:
# Use docker.io for Docker Hub if empty
Expand Down Expand Up @@ -57,12 +57,12 @@ jobs:
uses: docker/metadata-action@v4
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
flavor: |
latest=false
tags: |
type=ref,event=branch
type=ref,event=pr
type=semver,pattern=v{{version}}
type=semver,pattern=v{{major}}.{{minor}}
type=semver,pattern=v{{major}}
type=ref,event=tag

# Build and push Docker image with Buildx
# https://github.com/docker/build-push-action
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: Release

on:
push:
tags: [ 'v*.*.*' ]
tags: [ 'archive-v*.*.*' ]

env:
# Use docker.io for Docker Hub if empty
Expand Down
6 changes: 3 additions & 3 deletions src/main/java/jasper/component/Ingest.java
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ public void ingest(Ref ref, boolean force) {

@Timed(value = "jasper.ref", histogram = true)
public void update(Ref ref, boolean force) {
var maybeExisting = refRepository.findOneByUrlAndOrigin(ref.getUrl(), ref.getOrigin());
var maybeExisting = refRepository.findFirstByUrlAndOriginOrderByModifiedDesc(ref.getUrl(), ref.getOrigin());
if (maybeExisting.isEmpty()) throw new NotFoundException("Ref");
ref.addHierarchicalTags();
validate.ref(ref, force);
Expand All @@ -68,7 +68,7 @@ public void update(Ref ref, boolean force) {

@Timed(value = "jasper.ref", histogram = true)
public void push(Ref ref) {
var maybeExisting = refRepository.findOneByUrlAndOrigin(ref.getUrl(), ref.getOrigin());
var maybeExisting = refRepository.findFirstByUrlAndOriginOrderByModifiedDesc(ref.getUrl(), ref.getOrigin());
ref.addHierarchicalTags();
validate.ref(ref, true);
meta.update(ref, maybeExisting.orElse(null), null);
Expand All @@ -93,7 +93,7 @@ private void ensureUniqueModified(Ref ref) {

@Timed(value = "jasper.ref", histogram = true)
public void delete(String url, String origin) {
var maybeExisting = refRepository.findOneByUrlAndOrigin(url, origin);
var maybeExisting = refRepository.findFirstByUrlAndOriginOrderByModifiedDesc(url, origin);
if (maybeExisting.isEmpty()) return;
meta.update(null, maybeExisting.get(), null);
refRepository.deleteByUrlAndOrigin(url, origin);
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/jasper/component/Replicator.java
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ public void pull(Ref remote) {
for (var ref : client.refPull(url, options)) {
pull.migrate(ref, config);
if (pull.isGenerateMetadata()) {
var maybeExisting = refRepository.findOneByUrlAndOrigin(ref.getUrl(), ref.getOrigin());
var maybeExisting = refRepository.findFirstByUrlAndOriginOrderByModifiedDesc(ref.getUrl(), ref.getOrigin());
meta.update(ref, maybeExisting.orElse(null), metadataPlugins);
}
try {
Expand Down
2 changes: 2 additions & 0 deletions src/main/java/jasper/domain/Ext.java
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,8 @@ public class Ext implements Tag {
@Column(columnDefinition = "jsonb")
private JsonNode config;

@Id
@Column(updatable = false)
@LastModifiedDate
private Instant modified = Instant.now();

Expand Down
2 changes: 2 additions & 0 deletions src/main/java/jasper/domain/Plugin.java
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,8 @@ public class Plugin implements Tag {

private boolean userUrl = false;

@Id
@Column(updatable = false)
@LastModifiedDate
private Instant modified = Instant.now();

Expand Down
2 changes: 2 additions & 0 deletions src/main/java/jasper/domain/Ref.java
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,8 @@ public class Ref implements HasTags {
@Column(updatable = false)
private Instant created = Instant.now();

@Id
@Column(updatable = false)
@LastModifiedDate
private Instant modified = Instant.now();

Expand Down
6 changes: 4 additions & 2 deletions src/main/java/jasper/domain/RefId.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import lombok.Setter;

import java.io.Serializable;
import java.time.Instant;
import java.util.Objects;

@Getter
Expand All @@ -15,17 +16,18 @@
public class RefId implements Serializable {
private String url;
private String origin;
private Instant modified;

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
RefId refId = (RefId) o;
return url.equals(refId.url) && origin.equals(refId.origin);
return url.equals(refId.url) && origin.equals(refId.origin) && modified.equals(refId.modified);
}

@Override
public int hashCode() {
return Objects.hash(url, origin);
return Objects.hash(url, origin, modified);
}
}
6 changes: 4 additions & 2 deletions src/main/java/jasper/domain/TagId.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import lombok.Setter;

import java.io.Serializable;
import java.time.Instant;
import java.util.Objects;

@Getter
Expand All @@ -16,17 +17,18 @@ public class TagId implements Serializable {

private String tag;
private String origin;
private Instant modified;

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
TagId tagId = (TagId) o;
return tag.equals(tagId.tag) && origin.equals(tagId.origin);
return tag.equals(tagId.tag) && origin.equals(tagId.origin) && modified.equals(tagId.modified);
}

@Override
public int hashCode() {
return Objects.hash(tag, origin);
return Objects.hash(tag, origin, modified);
}
}
2 changes: 2 additions & 0 deletions src/main/java/jasper/domain/Template.java
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,8 @@ public class Template implements Tag {
@SchemaValid
private ObjectNode schema;

@Id
@Column(updatable = false)
@LastModifiedDate
private Instant modified = Instant.now();

Expand Down
2 changes: 2 additions & 0 deletions src/main/java/jasper/domain/User.java
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,8 @@ public class User implements Tag {
@Column(columnDefinition = "jsonb")
private List<@Length(max = TAG_LEN) @Pattern(regexp = Tag.REGEX) String> tagWriteAccess;

@Id
@Column(updatable = false)
@LastModifiedDate
private Instant modified = Instant.now();

Expand Down
2 changes: 1 addition & 1 deletion src/main/java/jasper/repository/QualifiedTagMixin.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import java.util.Optional;

public interface QualifiedTagMixin<T extends Tag> extends JpaSpecificationExecutor<T> {
Optional<T> findOneByQualifiedTag(String tag);
Optional<T> findFirstByQualifiedTagOrderByModifiedDesc(String tag);
void deleteByQualifiedTag(String tag);
boolean existsByQualifiedTag(String tag);
}
2 changes: 1 addition & 1 deletion src/main/java/jasper/repository/RefRepository.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
@Repository
public interface RefRepository extends JpaRepository<Ref, RefId>, JpaSpecificationExecutor<Ref>, StreamMixin<RefView>, ModifiedCursor, OriginMixin {

Optional<Ref> findOneByUrlAndOrigin(String url, String origin);
Optional<Ref> findFirstByUrlAndOriginOrderByModifiedDesc(String url, String origin);
void deleteByUrlAndOrigin(String url, String origin);
boolean existsByUrlAndOrigin(String url, String origin);

Expand Down
12 changes: 6 additions & 6 deletions src/main/java/jasper/security/Auth.java
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,7 @@ public boolean canReadRef(HasTags ref) {
}

protected boolean canReadRef(String url, String origin) {
var maybeExisting = refRepository.findOneByUrlAndOrigin(url, origin);
var maybeExisting = refRepository.findFirstByUrlAndOriginOrderByModifiedDesc(url, origin);
return maybeExisting.filter(this::canReadRef).isPresent();
}

Expand All @@ -209,7 +209,7 @@ public boolean canWriteRef(Ref ref) {
// If we can write to the existing we are granted permission
// We do not need to check if we have write access to the updated Ref,
// as self revocation is allowed
var maybeExisting = refRepository.findOneByUrlAndOrigin(ref.getUrl(), ref.getOrigin());
var maybeExisting = refRepository.findFirstByUrlAndOriginOrderByModifiedDesc(ref.getUrl(), ref.getOrigin());
// We do need to check if we are allowed to add any of the new tags
// by calling canAddTag on each one
return newTags(ref.getTags(), maybeExisting.map(Ref::getTags)).allMatch(this::canAddTag);
Expand All @@ -223,7 +223,7 @@ public boolean canWriteRef(String url, String origin) {
if (!local(origin)) return false;
// Minimum role for writing Refs is USER
if (!hasRole(USER)) return false;
var maybeExisting = refRepository.findOneByUrlAndOrigin(url, origin);
var maybeExisting = refRepository.findFirstByUrlAndOriginOrderByModifiedDesc(url, origin);
// If we're creating, simply having the role USER is enough
if (maybeExisting.isEmpty()) return true;
var existing = maybeExisting.get();
Expand Down Expand Up @@ -423,7 +423,7 @@ public boolean canWriteUser(String tag) {
if (!local(selector(tag).origin)) return false;
if (hasRole(MOD)) return true;
if (!canWriteTag(tag)) return false;
var role = userRepository.findOneByQualifiedTag(tag).map(User::getRole).orElse(null);
var role = userRepository.findFirstByQualifiedTagOrderByModifiedDesc(tag).map(User::getRole).orElse(null);
return isBlank(role) || hasRole(role);
}

Expand All @@ -436,7 +436,7 @@ public boolean canWriteUser(User user) {
if (!canWriteUser(user.getQualifiedTag())) return false;
if (isNotBlank(user.getRole()) && !hasRole(user.getRole())) return false;
if (hasRole(MOD)) return true;
var maybeExisting = userRepository.findOneByQualifiedTag(user.getQualifiedTag());
var maybeExisting = userRepository.findFirstByQualifiedTagOrderByModifiedDesc(user.getQualifiedTag());
// No public tags in write access
if (user.getWriteAccess() != null && user.getWriteAccess().stream().anyMatch(Auth::isPublicTag)) return false;
// The writing user must already have write access to give read or write access to another user
Expand Down Expand Up @@ -569,7 +569,7 @@ protected Optional<User> getUser() {
var auth = getAuthentication();
user = Optional.ofNullable((User) auth.getDetails());
if (isLoggedIn() && user.isEmpty()) {
user = userRepository.findOneByQualifiedTag(getUserTag().toString());
user = userRepository.findFirstByQualifiedTagOrderByModifiedDesc(getUserTag().toString());
}
}
return user;
Expand Down
6 changes: 3 additions & 3 deletions src/main/java/jasper/service/ExtService.java
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ public void push(Ext ext) {
@PreAuthorize("@auth.canReadTag(#qualifiedTag)")
@Timed(value = "jasper.service", extraTags = {"service", "ext"}, histogram = true)
public Ext get(String qualifiedTag) {
return extRepository.findOneByQualifiedTag(qualifiedTag)
return extRepository.findFirstByQualifiedTagOrderByModifiedDesc(qualifiedTag)
.orElseThrow(() -> new NotFoundException("Ext " + qualifiedTag));
}

Expand All @@ -104,7 +104,7 @@ public Page<Ext> page(TagFilter filter, Pageable pageable) {
@PreAuthorize("@auth.canWriteTag(#ext.qualifiedTag)")
@Timed(value = "jasper.service", extraTags = {"service", "ext"}, histogram = true)
public void update(Ext ext) {
var maybeExisting = extRepository.findOneByQualifiedTag(ext.getQualifiedTag());
var maybeExisting = extRepository.findFirstByQualifiedTagOrderByModifiedDesc(ext.getQualifiedTag());
if (maybeExisting.isEmpty()) throw new NotFoundException("Ext " + ext.getQualifiedTag());
var existing = maybeExisting.get();
if (!ext.getModified().truncatedTo(ChronoUnit.SECONDS).equals(existing.getModified().truncatedTo(ChronoUnit.SECONDS))) throw new ModifiedException("Ext " + ext.getQualifiedTag());
Expand All @@ -121,7 +121,7 @@ public void update(Ext ext) {
@Timed(value = "jasper.service", extraTags = {"service", "ext"}, histogram = true)
public void patch(String qualifiedTag, JsonPatch patch) {
var created = false;
var ext = extRepository.findOneByQualifiedTag(qualifiedTag).orElse(null);
var ext = extRepository.findFirstByQualifiedTagOrderByModifiedDesc(qualifiedTag).orElse(null);
if (ext == null) {
created = true;
ext = new Ext();
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/jasper/service/GraphService.java
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ public class GraphService {
@PostAuthorize("@auth.canReadRef(returnObject)")
@Timed(value = "jasper.service", extraTags = {"service", "graph"}, histogram = true)
public RefNodeDto get(String url, String origin) {
var result = refRepository.findOneByUrlAndOrigin(url, origin)
var result = refRepository.findFirstByUrlAndOriginOrderByModifiedDesc(url, origin)
.or(() -> refRepository.findOne(isUrl(url).and(isOrigin(origin))))
.orElseThrow(() -> new NotFoundException("Ref " + origin + " " + url));
return mapper.domainToNodeDto(result);
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/jasper/service/OriginService.java
Original file line number Diff line number Diff line change
Expand Up @@ -45,15 +45,15 @@ public class OriginService {
@PreAuthorize("hasRole('MOD') and @auth.local(#origin)")
@Timed(value = "jasper.service", extraTags = {"service", "origin"}, histogram = true)
public void push(String url, String origin) throws FeedException, IOException {
var source = refRepository.findOneByUrlAndOrigin(url, origin)
var source = refRepository.findFirstByUrlAndOriginOrderByModifiedDesc(url, origin)
.orElseThrow(() -> new NotFoundException("Ref " + origin + " " + url));
replicator.push(source);
}

@PreAuthorize("@auth.sysMod() and @auth.local(#origin)")
@Timed(value = "jasper.service", extraTags = {"service", "origin"}, histogram = true)
public void pull(String url, String origin) throws FeedException, IOException {
var source = refRepository.findOneByUrlAndOrigin(url, origin)
var source = refRepository.findFirstByUrlAndOriginOrderByModifiedDesc(url, origin)
.orElseThrow(() -> new NotFoundException("Ref " + origin + " " + url));
replicator.pull(source);
}
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/jasper/service/PluginService.java
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ public void push(Plugin plugin) {
@PreAuthorize("@auth.canReadTag(#qualifiedTag)")
@Timed(value = "jasper.service", extraTags = {"service", "plugin"}, histogram = true)
public Plugin get(String qualifiedTag) {
return pluginRepository.findOneByQualifiedTag(qualifiedTag)
return pluginRepository.findFirstByQualifiedTagOrderByModifiedDesc(qualifiedTag)
.orElseThrow(() -> new NotFoundException("Plugin " + qualifiedTag));
}

Expand Down Expand Up @@ -88,7 +88,7 @@ public Page<Plugin> page(TagFilter filter, Pageable pageable) {
@PreAuthorize("@auth.local(#plugin.getOrigin()) and hasRole('ADMIN')")
@Timed(value = "jasper.service", extraTags = {"service", "plugin"}, histogram = true)
public void update(Plugin plugin) {
var maybeExisting = pluginRepository.findOneByQualifiedTag(plugin.getQualifiedTag());
var maybeExisting = pluginRepository.findFirstByQualifiedTagOrderByModifiedDesc(plugin.getQualifiedTag());
if (maybeExisting.isEmpty()) throw new NotFoundException("Plugin " + plugin.getQualifiedTag());
var existing = maybeExisting.get();
if (!plugin.getModified().truncatedTo(ChronoUnit.SECONDS).equals(existing.getModified().truncatedTo(ChronoUnit.SECONDS))) throw new ModifiedException("Plugin " + plugin.getQualifiedTag());
Expand Down
6 changes: 3 additions & 3 deletions src/main/java/jasper/service/RefService.java
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ public void push(Ref ref) {
@PostAuthorize("@auth.canReadRef(returnObject)")
@Timed(value = "jasper.service", extraTags = {"service", "ref"}, histogram = true)
public RefDto get(String url, String origin) {
var result = refRepository.findOneByUrlAndOrigin(url, origin)
var result = refRepository.findFirstByUrlAndOriginOrderByModifiedDesc(url, origin)
.or(() -> refRepository.findOne(isUrl(url).and(isOrigin(origin))))
.orElseThrow(() -> new NotFoundException("Ref " + origin + " " + url));
return mapper.domainToDto(result);
Expand Down Expand Up @@ -127,7 +127,7 @@ public void update(Ref ref, boolean force) {
if (!force) throw new MaxSourcesException(props.getMaxSources(), ref.getSources().size());
ref.getSources().subList(props.getMaxSources(), ref.getSources().size()).clear();
}
var maybeExisting = refRepository.findOneByUrlAndOrigin(ref.getUrl(), ref.getOrigin());
var maybeExisting = refRepository.findFirstByUrlAndOriginOrderByModifiedDesc(ref.getUrl(), ref.getOrigin());
if (maybeExisting.isEmpty()) throw new NotFoundException("Ref " + ref.getOrigin() + " " + ref.getUrl());
var existing = maybeExisting.get();
if (!ref.getModified().truncatedTo(ChronoUnit.SECONDS).equals(existing.getModified().truncatedTo(ChronoUnit.SECONDS))) throw new ModifiedException("Ref");
Expand All @@ -141,7 +141,7 @@ public void update(Ref ref, boolean force) {
@Timed(value = "jasper.service", extraTags = {"service", "ref"}, histogram = true)
public void patch(String url, String origin, JsonPatch patch) {
var created = false;
var ref = refRepository.findOneByUrlAndOrigin(url, origin).orElse(null);
var ref = refRepository.findFirstByUrlAndOriginOrderByModifiedDesc(url, origin).orElse(null);
if (ref == null) {
created = true;
ref = new Ref();
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/jasper/service/ScrapeService.java
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ public class ScrapeService {
@PreAuthorize("hasRole('MOD') and @auth.local(#origin)")
@Timed(value = "jasper.service", extraTags = {"service", "scrape"}, histogram = true)
public void feed(String url, String origin) throws FeedException, IOException {
var source = refRepository.findOneByUrlAndOrigin(url, origin)
var source = refRepository.findFirstByUrlAndOriginOrderByModifiedDesc(url, origin)
.orElseThrow(() -> new NotFoundException("Ref " + origin + " " + url));
rssParser.scrape(source);
}
Expand Down
Loading