Skip to content
This repository was archived by the owner on Apr 17, 2023. It is now read-only.

Commit c1cfd84

Browse files
committed
Zatwierdzanie i usuwanie plików
1 parent cc6613a commit c1cfd84

10 files changed

Lines changed: 121 additions & 20 deletions

File tree

src/main/java/pl/edu/pw/ee/pyskp/documentworkflow/controller/FilesMetadataController.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,13 @@ public String getFileInfo(@PathVariable long fileId, @PathVariable long taskId,
5353
return "file";
5454
}
5555

56+
@DeleteMapping("/{fileId}")
57+
@PreAuthorize("@securityService.canDeleteFile(#fileId)")
58+
public String deleteFile(@PathVariable long fileId, @PathVariable long taskId, @PathVariable long projectId) {
59+
filesMetadataService.deleteFile(fileId);
60+
return String.format("redirect:/projects/%d/tasks/%d", projectId, taskId);
61+
}
62+
5663
@GetMapping("/add")
5764
@PreAuthorize("@securityService.isTaskParticipant(#taskId)")
5865
public String getNewFileForm(Model model, @PathVariable long taskId,
@@ -101,4 +108,13 @@ public String markFileToConfirm(@PathVariable long fileId,
101108
filesMetadataService.markFileToConfirm(fileId);
102109
return String.format("redirect:/projects/%d/tasks/%d/files/%d", projectId, taskId, fileId);
103110
}
111+
112+
@PostMapping("/{fileId}/confirm")
113+
@PreAuthorize("@securityService.canConfirmFile(#fileId)")
114+
public String confirmFile(@PathVariable long fileId,
115+
@PathVariable long projectId,
116+
@PathVariable long taskId) {
117+
filesMetadataService.confirmFile(fileId);
118+
return String.format("redirect:/projects/%d/tasks/%d/files/%d", projectId, taskId, fileId);
119+
}
104120
}

src/main/java/pl/edu/pw/ee/pyskp/documentworkflow/controller/VersionController.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ public String getNewVersionForm(Model model,
103103
@PathVariable long taskId) {
104104
addCurrentUserToModel(model);
105105
addTaskToModel(model, taskId);
106+
addFileToModel(model, fileId);
106107
return "addVersion";
107108
}
108109

src/main/java/pl/edu/pw/ee/pyskp/documentworkflow/service/FilesMetadataService.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,10 @@ static List<FileMetadataDTO> mapAllToFileMetadataDTO(Collection<FileMetadata> co
4848
void markFileToConfirm(long fileId);
4949

5050
boolean hasContentTypeAs(long fileId, MultipartFile file);
51+
52+
void confirmFile(long fileId);
53+
54+
void deleteFile(long fileId);
55+
56+
boolean isValidVersionStringForFile(String versionString, long fileId);
5157
}

src/main/java/pl/edu/pw/ee/pyskp/documentworkflow/service/SecurityService.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,8 @@ public interface SecurityService {
1717
boolean hasAccessToFile(long fileId);
1818

1919
boolean canDeleteProject(long projectId);
20+
21+
boolean canConfirmFile(long fileId);
22+
23+
boolean canDeleteFile(long fileId);
2024
}

src/main/java/pl/edu/pw/ee/pyskp/documentworkflow/service/impl/FilesMetadataServiceImpl.java

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
import pl.edu.pw.ee.pyskp.documentworkflow.service.VersionService;
1818

1919
import java.io.IOException;
20-
import java.util.ArrayList;
2120
import java.util.Collections;
2221
import java.util.List;
2322
import java.util.Optional;
@@ -84,6 +83,28 @@ public boolean hasContentTypeAs(long fileId, MultipartFile file) {
8483
return contentType.equals(fileMetadata.getContentType());
8584
}
8685

86+
@Override
87+
public void confirmFile(long fileId) {
88+
FileMetadata fileToConfirm = getOneById(fileId).orElseThrow(() -> new FileNotFoundException(fileId));
89+
fileToConfirm.setConfirmed(true);
90+
fileMetadataRepository.saveAndFlush(fileToConfirm);
91+
}
92+
93+
@Override
94+
public void deleteFile(long fileId) {
95+
fileMetadataRepository.delete(fileId);
96+
}
97+
98+
@Override
99+
public boolean isValidVersionStringForFile(String versionString, long fileId) {
100+
List<Version> versions = getOneById(fileId)
101+
.map(FileMetadata::getVersions)
102+
.orElseThrow(() -> new FileNotFoundException(fileId));
103+
return versions.parallelStream()
104+
.map(Version::getVersionString)
105+
.noneMatch(string -> string.equalsIgnoreCase(versionString));
106+
}
107+
87108
private static ContentType getContentType(MultipartFile multipartFile)
88109
throws UnknownContentType, IOException {
89110
Tika tika = new Tika();

src/main/java/pl/edu/pw/ee/pyskp/documentworkflow/service/impl/SecurityServiceImpl.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,4 +85,22 @@ public boolean canDeleteProject(long projectId) {
8585
.orElseThrow(() -> new ProjectNotFoundException(projectId))
8686
.getAdministrator());
8787
}
88+
89+
@Override
90+
public boolean canConfirmFile(long fileId) {
91+
return isFileTaskAdministrator(fileId);
92+
}
93+
94+
@Override
95+
public boolean canDeleteFile(long fileId) {
96+
return isFileTaskAdministrator(fileId);
97+
}
98+
99+
private boolean isFileTaskAdministrator(long fileId) {
100+
User taskAdministrator = filesMetadataService.getOneById(fileId)
101+
.orElseThrow(() -> new FileNotFoundException(fileId))
102+
.getTask()
103+
.getAdministrator();
104+
return userService.getCurrentUser().equals(taskAdministrator);
105+
}
88106
}

src/main/java/pl/edu/pw/ee/pyskp/documentworkflow/validator/NewVersionFormValidator.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ public void validate(Object target, Errors errors) {
2828
NewVersionForm form = (NewVersionForm) target;
2929
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "versionString", "NotBlank");
3030
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "message", "NotBlank");
31+
if (!filesMetadataService.isValidVersionStringForFile(form.getVersionString(), form.getFileId())) {
32+
errors.rejectValue("versionString", "Duplicate.versionForm.versionString");
33+
}
3134
if (form.getFile().isEmpty()) {
3235
errors.rejectValue("file", "NotBlank");
3336
}

src/main/resources/META-INF/resources/WEB-INF/jsp/addVersion.jsp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@
6363
</label>
6464
<div class="col-md-5">
6565
<form:textarea path="message" id="message" cssClass="form-control"/>
66-
<p><form:errors path="versionString" cssClass="text-danger"/></p>
66+
<p><form:errors path="message" cssClass="text-danger"/></p>
6767
</div>
6868
</div>
6969

src/main/resources/META-INF/resources/WEB-INF/jsp/file.jsp

Lines changed: 49 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -32,24 +32,55 @@
3232
<div class="row">
3333
<div class="col-md-8">
3434
<div class="toolbar" role="toolbar">
35-
<div class="btn-group">
36-
<button form="markToConfirm" type="submit"
37-
class="btn btn-success" ${file.markedToConfirm ? 'disabled': ''}>
38-
<span class="glyphicon glyphicon-ok-sign"></span>
39-
Zaznacz do zatwierdzenia
40-
</button>
41-
<a href="<spring:url value="/projects/${task.projectId}/tasks/${task.id}/files/${file.id}/versions/add"/>"
42-
class="btn btn-primary">
43-
<span class="glyphicon glyphicon-plus"></span>
44-
Dodaj nową wersję
45-
</a>
46-
</div>
47-
<form id="markToConfirm" method="post"
48-
action="<spring:url value="/projects/${task.projectId}/tasks/${task.id}/files/${file.id}/markToConfirm"/>">
49-
<input type="hidden" name="${_csrf.parameterName}"
50-
value="${_csrf.token}"/>
51-
<input type="hidden" name="_method" value="put"/>
52-
</form>
35+
<c:if test="${not file.confirmed}">
36+
<div class="btn-group">
37+
<c:if test="${currentUser != task.administrator and not file.markedToConfirm}">
38+
<button form="markToConfirm" type="submit"
39+
class="btn btn-success">
40+
<span class="glyphicon glyphicon-ok-sign"></span>
41+
Zaznacz do zatwierdzenia
42+
</button>
43+
</c:if>
44+
<a href="<spring:url value="/projects/${task.projectId}/tasks/${task.id}/files/${file.id}/versions/add"/>"
45+
class="btn btn-primary">
46+
<span class="glyphicon glyphicon-plus"></span>
47+
Dodaj nową wersję
48+
</a>
49+
</div>
50+
<c:if test="${currentUser != task.administrator}">
51+
<form id="markToConfirm" method="post"
52+
action="<spring:url value="/projects/${task.projectId}/tasks/${task.id}/files/${file.id}/markToConfirm"/>">
53+
<input type="hidden" name="${_csrf.parameterName}"
54+
value="${_csrf.token}"/>
55+
<input type="hidden" name="_method" value="put"/>
56+
</form>
57+
</c:if>
58+
</c:if>
59+
<c:if test="${currentUser eq task.administrator}">
60+
<div class="btn-group">
61+
<c:if test="${not file.confirmed}">
62+
<button form="confirm" type="submit" class="btn btn-success">
63+
<span class="glyphicon glyphicon-ok"></span>
64+
Zatwierdź plik
65+
</button>
66+
</c:if>
67+
<button form="delete" type="submit" class="btn btn-danger">
68+
<span class="glyphicon glyphicon-remove"></span>
69+
Usuń plik
70+
</button>
71+
</div>
72+
<c:if test="${not file.confirmed}">
73+
<form id="confirm" method="post"
74+
action="<spring:url value="/projects/${task.projectId}/tasks/${task.id}/files/${file.id}/confirm"/>">
75+
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
76+
</form>
77+
</c:if>
78+
<form id="delete" method="post"
79+
action="<spring:url value="/projects/${task.projectId}/tasks/${task.id}/files/${file.id}"/>">
80+
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
81+
<input type="hidden" name="_method" value="delete"/>
82+
</form>
83+
</c:if>
5384
</div>
5485

5586
<div class="text-center">

src/main/resources/messages.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ NotEmpty=To pole jest wymagane.
2121
NotBlank=To pole jest wymagane.
2222
Duplicate.userForm.username=Podany login jest już używany.
2323
Duplicate.userForm.email=Istnieje już użytkownik z podanym adresem e-mail.
24+
Duplicate.versionForm.versionString=Podana nazwa wersji już istnieje dla danego pliku
2425
Size.userForm.username=Proszę wpisać od 5 do 40 znaków.
2526
Size.userForm.password=Proszę wpisać hasło z przynajmniej 6 znakami.
2627
Size.projectForm.description=Opis projektu nie może zawierać więcej niż 1024 znaki.

0 commit comments

Comments
 (0)