From fd0a48b913a07e6a6d1bde08fa3c453f1ee95155 Mon Sep 17 00:00:00 2001 From: Daniel Gerhardt <code@dgerhardt.net> Date: Tue, 5 Sep 2017 14:58:20 +0200 Subject: [PATCH] Refactor API/entities for comments --- .../arsnova/controller/CommentController.java | 6 +- .../java/de/thm/arsnova/entities/Comment.java | 109 +++++--------- .../entities/migration/V2Migrator.java | 17 +++ .../entities/migration/v2/Comment.java | 134 ++++++++++++++++++ .../v2}/CommentReadingCount.java | 2 +- .../CouchDbTypeFieldConverter.java | 2 +- .../transport/ImportExportSession.java | 2 +- .../arsnova/events/DeleteCommentEvent.java | 2 +- .../thm/arsnova/events/NewCommentEvent.java | 2 +- .../persistance/CommentRepository.java | 4 +- .../couchdb/CouchDbCommentRepository.java | 4 +- .../couchdb/CouchDbSessionRepository.java | 2 +- .../ApplicationPermissionEvaluator.java | 2 +- .../thm/arsnova/services/CommentService.java | 4 +- .../arsnova/services/CommentServiceImpl.java | 4 +- .../websocket/ArsnovaSocketioServerImpl.java | 2 +- 16 files changed, 208 insertions(+), 90 deletions(-) create mode 100644 src/main/java/de/thm/arsnova/entities/migration/v2/Comment.java rename src/main/java/de/thm/arsnova/entities/{ => migration/v2}/CommentReadingCount.java (97%) diff --git a/src/main/java/de/thm/arsnova/controller/CommentController.java b/src/main/java/de/thm/arsnova/controller/CommentController.java index b074df1c4..33e0d2e94 100644 --- a/src/main/java/de/thm/arsnova/controller/CommentController.java +++ b/src/main/java/de/thm/arsnova/controller/CommentController.java @@ -17,8 +17,8 @@ */ package de.thm.arsnova.controller; -import de.thm.arsnova.entities.Comment; -import de.thm.arsnova.entities.CommentReadingCount; +import de.thm.arsnova.entities.migration.v2.Comment; +import de.thm.arsnova.entities.migration.v2.CommentReadingCount; import de.thm.arsnova.exceptions.BadRequestException; import de.thm.arsnova.services.CommentService; import de.thm.arsnova.web.DeprecatedApi; @@ -93,7 +93,7 @@ public class CommentController extends PaginationController { @ResponseStatus(HttpStatus.CREATED) public void postInterposedQuestion( @ApiParam(value = "Session-Key from current session", required = true) @RequestParam final String sessionkey, - @ApiParam(value = "the body from the new comment", required = true) @RequestBody final de.thm.arsnova.entities.Comment comment + @ApiParam(value = "the body from the new comment", required = true) @RequestBody final Comment comment ) { if (commentService.save(comment)) { return; diff --git a/src/main/java/de/thm/arsnova/entities/Comment.java b/src/main/java/de/thm/arsnova/entities/Comment.java index 4d69e84cd..4d692bce7 100644 --- a/src/main/java/de/thm/arsnova/entities/Comment.java +++ b/src/main/java/de/thm/arsnova/entities/Comment.java @@ -1,132 +1,99 @@ -/* - * This file is part of ARSnova Backend. - * Copyright (C) 2012-2018 The ARSnova Team and Contributors - * - * ARSnova Backend is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * ARSnova Backend is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ package de.thm.arsnova.entities; import com.fasterxml.jackson.annotation.JsonView; import de.thm.arsnova.entities.serialization.View; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -/** - * A question the user is asking the teacher. Also known as comment, feedback or audience question. - */ -@ApiModel(value = "comment", description = "the comment entity") public class Comment implements Entity { private String id; private String rev; - private String subject; - private String text; - /* FIXME sessionId actually is used to hold the sessionKey. - * This really needs to be changed because it leads to a lot - * of confusion. It can not be easily changed without a lot of - * refactoring since the client application depends on the - * current naming */ private String sessionId; + private String creatorId; + private String subject; + private String body; private long timestamp; private boolean read; - private String creator; + @Override @JsonView({View.Persistence.class, View.Public.class}) public String getId() { return id; } + @Override @JsonView({View.Persistence.class, View.Public.class}) public void setId(final String id) { this.id = id; } + @Override + @JsonView({View.Persistence.class, View.Public.class}) + public String getRevision() { + return rev; + } + + @Override @JsonView({View.Persistence.class, View.Public.class}) public void setRevision(final String rev) { this.rev = rev; } @JsonView({View.Persistence.class, View.Public.class}) - public String getRevision() { - return rev; + public String getSessionId() { + return sessionId; } - @ApiModelProperty(required = true, value = "is read") - @JsonView({View.Persistence.class, View.Public.class}) - public boolean isRead() { - return read; + @JsonView(View.Persistence.class) + public void setSessionId(final String sessionId) { + this.sessionId = sessionId; } - @JsonView({View.Persistence.class, View.Public.class}) - public void setRead(boolean read) { - this.read = read; + @JsonView(View.Persistence.class) + public String getCreatorId() { + return creatorId; + } + + @JsonView(View.Persistence.class) + public void setCreatorId(final String creatorId) { + this.creatorId = creatorId; } - @ApiModelProperty(required = true, value = "the subject") @JsonView({View.Persistence.class, View.Public.class}) public String getSubject() { return subject; } @JsonView({View.Persistence.class, View.Public.class}) - public void setSubject(String subject) { + public void setSubject(final String subject) { this.subject = subject; } - @ApiModelProperty(required = true, value = "the Text") @JsonView({View.Persistence.class, View.Public.class}) - public String getText() { - return text; + public String getBody() { + return body; } @JsonView({View.Persistence.class, View.Public.class}) - public void setText(String text) { - this.text = text; - } - - @ApiModelProperty(required = true, value = "ID of the session, the comment is assigned to") - @JsonView(View.Persistence.class) - public String getSessionId() { - return sessionId; + public void setBody(final String body) { + this.body = body; } - @JsonView({View.Persistence.class, View.Public.class}) - public void setSessionId(String sessionId) { - this.sessionId = sessionId; - } - - @ApiModelProperty(required = true, value = "creation date timestamp") @JsonView({View.Persistence.class, View.Public.class}) public long getTimestamp() { return timestamp; } - @JsonView({View.Persistence.class, View.Public.class}) - public void setTimestamp(long timestamp) { - this.timestamp = timestamp; - } - @JsonView(View.Persistence.class) - public String getCreator() { - return creator; + public void setTimestamp(final long timestamp) { + this.timestamp = timestamp; } - @JsonView(View.Persistence.class) - public void setCreator(String creator) { - this.creator = creator; + @JsonView({View.Persistence.class, View.Public.class}) + public boolean isRead() { + return read; } - public boolean isCreator(User user) { - return user.getUsername().equals(creator); + @JsonView({View.Persistence.class, View.Public.class}) + public void setRead(final boolean read) { + this.read = read; } } diff --git a/src/main/java/de/thm/arsnova/entities/migration/V2Migrator.java b/src/main/java/de/thm/arsnova/entities/migration/V2Migrator.java index 93b6aa898..f12beab19 100644 --- a/src/main/java/de/thm/arsnova/entities/migration/V2Migrator.java +++ b/src/main/java/de/thm/arsnova/entities/migration/V2Migrator.java @@ -7,6 +7,7 @@ import de.thm.arsnova.entities.Entity; import de.thm.arsnova.entities.TextAnswer; import de.thm.arsnova.entities.migration.v2.Answer; import de.thm.arsnova.entities.migration.v2.AnswerOption; +import de.thm.arsnova.entities.migration.v2.Comment; import de.thm.arsnova.entities.migration.v2.Content; import de.thm.arsnova.entities.migration.v2.Session; @@ -103,4 +104,20 @@ public class V2Migrator { return to; } + + public de.thm.arsnova.entities.Comment migrate(final Comment from, final DbUser creator) { + if (!creator.getUsername().equals(from.getCreator())) { + throw new IllegalArgumentException("Username of creator object does not match comment creator."); + } + final de.thm.arsnova.entities.Comment to = new de.thm.arsnova.entities.Comment(); + copyCommonProperties(from, to); + to.setSessionId(from.getSessionId()); + to.setCreatorId(creator.getId()); + to.setSubject(from.getSubject()); + to.setBody(from.getText()); + to.setTimestamp(from.getTimestamp()); + to.setRead(from.isRead()); + + return to; + } } diff --git a/src/main/java/de/thm/arsnova/entities/migration/v2/Comment.java b/src/main/java/de/thm/arsnova/entities/migration/v2/Comment.java new file mode 100644 index 000000000..f0ea862d6 --- /dev/null +++ b/src/main/java/de/thm/arsnova/entities/migration/v2/Comment.java @@ -0,0 +1,134 @@ +/* + * This file is part of ARSnova Backend. + * Copyright (C) 2012-2017 The ARSnova Team + * + * ARSnova Backend is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * ARSnova Backend is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +package de.thm.arsnova.entities.migration.v2; + +import com.fasterxml.jackson.annotation.JsonView; +import de.thm.arsnova.entities.Entity; +import de.thm.arsnova.entities.User; +import de.thm.arsnova.entities.serialization.View; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * A question the user is asking the teacher. Also known as comment, feedback or audience question. + */ +@ApiModel(value = "comment", description = "the comment entity") +public class Comment implements Entity { + private String id; + private String rev; + private String subject; + private String text; + /* FIXME sessionId actually is used to hold the sessionKey. + * This really needs to be changed because it leads to a lot + * of confusion. It can not be easily changed without a lot of + * refactoring since the client application depends on the + * current naming */ + private String sessionId; + private long timestamp; + private boolean read; + private String creator; + + @JsonView({View.Persistence.class, View.Public.class}) + public String getId() { + return id; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setId(final String id) { + this.id = id; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setRevision(final String rev) { + this.rev = rev; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public String getRevision() { + return rev; + } + + @ApiModelProperty(required = true, value = "is read") + @JsonView({View.Persistence.class, View.Public.class}) + public boolean isRead() { + return read; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setRead(boolean read) { + this.read = read; + } + + @ApiModelProperty(required = true, value = "the subject") + @JsonView({View.Persistence.class, View.Public.class}) + public String getSubject() { + return subject; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setSubject(String subject) { + this.subject = subject; + } + + @ApiModelProperty(required = true, value = "the Text") + @JsonView({View.Persistence.class, View.Public.class}) + public String getText() { + return text; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setText(String text) { + this.text = text; + } + + @ApiModelProperty(required = true, value = "ID of the session, the comment is assigned to") + @JsonView(View.Persistence.class) + public String getSessionId() { + return sessionId; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setSessionId(String sessionId) { + this.sessionId = sessionId; + } + + @ApiModelProperty(required = true, value = "creation date timestamp") + @JsonView({View.Persistence.class, View.Public.class}) + public long getTimestamp() { + return timestamp; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setTimestamp(long timestamp) { + this.timestamp = timestamp; + } + + @JsonView(View.Persistence.class) + public String getCreator() { + return creator; + } + + @JsonView(View.Persistence.class) + public void setCreator(String creator) { + this.creator = creator; + } + + public boolean isCreator(User user) { + return user.getUsername().equals(creator); + } +} diff --git a/src/main/java/de/thm/arsnova/entities/CommentReadingCount.java b/src/main/java/de/thm/arsnova/entities/migration/v2/CommentReadingCount.java similarity index 97% rename from src/main/java/de/thm/arsnova/entities/CommentReadingCount.java rename to src/main/java/de/thm/arsnova/entities/migration/v2/CommentReadingCount.java index 169b687aa..ef6d4daf5 100644 --- a/src/main/java/de/thm/arsnova/entities/CommentReadingCount.java +++ b/src/main/java/de/thm/arsnova/entities/migration/v2/CommentReadingCount.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -package de.thm.arsnova.entities; +package de.thm.arsnova.entities.migration.v2; import com.fasterxml.jackson.annotation.JsonView; import de.thm.arsnova.entities.serialization.View; diff --git a/src/main/java/de/thm/arsnova/entities/serialization/CouchDbTypeFieldConverter.java b/src/main/java/de/thm/arsnova/entities/serialization/CouchDbTypeFieldConverter.java index 69c7ae0f6..1844741bd 100644 --- a/src/main/java/de/thm/arsnova/entities/serialization/CouchDbTypeFieldConverter.java +++ b/src/main/java/de/thm/arsnova/entities/serialization/CouchDbTypeFieldConverter.java @@ -21,7 +21,7 @@ import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.type.TypeFactory; import com.fasterxml.jackson.databind.util.Converter; import de.thm.arsnova.entities.migration.v2.Answer; -import de.thm.arsnova.entities.Comment; +import de.thm.arsnova.entities.migration.v2.Comment; import de.thm.arsnova.entities.DbUser; import de.thm.arsnova.entities.Entity; import de.thm.arsnova.entities.LogEntry; diff --git a/src/main/java/de/thm/arsnova/entities/transport/ImportExportSession.java b/src/main/java/de/thm/arsnova/entities/transport/ImportExportSession.java index 3d4e8cccf..88555f38a 100644 --- a/src/main/java/de/thm/arsnova/entities/transport/ImportExportSession.java +++ b/src/main/java/de/thm/arsnova/entities/transport/ImportExportSession.java @@ -19,7 +19,7 @@ package de.thm.arsnova.entities.transport; import com.fasterxml.jackson.annotation.JsonView; import de.thm.arsnova.entities.migration.v2.Answer; -import de.thm.arsnova.entities.Comment; +import de.thm.arsnova.entities.migration.v2.Comment; import de.thm.arsnova.entities.migration.v2.Content; import de.thm.arsnova.entities.Motd; import de.thm.arsnova.entities.migration.v2.Session; diff --git a/src/main/java/de/thm/arsnova/events/DeleteCommentEvent.java b/src/main/java/de/thm/arsnova/events/DeleteCommentEvent.java index 6689ca226..44a5cb644 100644 --- a/src/main/java/de/thm/arsnova/events/DeleteCommentEvent.java +++ b/src/main/java/de/thm/arsnova/events/DeleteCommentEvent.java @@ -17,7 +17,7 @@ */ package de.thm.arsnova.events; -import de.thm.arsnova.entities.Comment; +import de.thm.arsnova.entities.migration.v2.Comment; import de.thm.arsnova.entities.migration.v2.Session; /** diff --git a/src/main/java/de/thm/arsnova/events/NewCommentEvent.java b/src/main/java/de/thm/arsnova/events/NewCommentEvent.java index 5d5c57ff7..345b54c3a 100644 --- a/src/main/java/de/thm/arsnova/events/NewCommentEvent.java +++ b/src/main/java/de/thm/arsnova/events/NewCommentEvent.java @@ -17,7 +17,7 @@ */ package de.thm.arsnova.events; -import de.thm.arsnova.entities.Comment; +import de.thm.arsnova.entities.migration.v2.Comment; import de.thm.arsnova.entities.migration.v2.Session; /** diff --git a/src/main/java/de/thm/arsnova/persistance/CommentRepository.java b/src/main/java/de/thm/arsnova/persistance/CommentRepository.java index 6e97fb98a..8efb72401 100644 --- a/src/main/java/de/thm/arsnova/persistance/CommentRepository.java +++ b/src/main/java/de/thm/arsnova/persistance/CommentRepository.java @@ -1,7 +1,7 @@ package de.thm.arsnova.persistance; -import de.thm.arsnova.entities.Comment; -import de.thm.arsnova.entities.CommentReadingCount; +import de.thm.arsnova.entities.migration.v2.Comment; +import de.thm.arsnova.entities.migration.v2.CommentReadingCount; import de.thm.arsnova.entities.User; import org.springframework.data.repository.CrudRepository; diff --git a/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbCommentRepository.java b/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbCommentRepository.java index 6276c44fb..f8b878d79 100644 --- a/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbCommentRepository.java +++ b/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbCommentRepository.java @@ -1,8 +1,8 @@ package de.thm.arsnova.persistance.couchdb; import com.fasterxml.jackson.databind.JsonNode; -import de.thm.arsnova.entities.Comment; -import de.thm.arsnova.entities.CommentReadingCount; +import de.thm.arsnova.entities.migration.v2.Comment; +import de.thm.arsnova.entities.migration.v2.CommentReadingCount; import de.thm.arsnova.entities.User; import de.thm.arsnova.persistance.CommentRepository; import de.thm.arsnova.persistance.LogEntryRepository; diff --git a/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbSessionRepository.java b/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbSessionRepository.java index 0d55949d1..678027b29 100644 --- a/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbSessionRepository.java +++ b/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbSessionRepository.java @@ -18,7 +18,7 @@ package de.thm.arsnova.persistance.couchdb; import de.thm.arsnova.connector.model.Course; -import de.thm.arsnova.entities.Comment; +import de.thm.arsnova.entities.migration.v2.Comment; import de.thm.arsnova.entities.LoggedIn; import de.thm.arsnova.entities.migration.v2.Session; import de.thm.arsnova.entities.migration.v2.SessionInfo; diff --git a/src/main/java/de/thm/arsnova/security/ApplicationPermissionEvaluator.java b/src/main/java/de/thm/arsnova/security/ApplicationPermissionEvaluator.java index ce58a7803..e6640a2d7 100644 --- a/src/main/java/de/thm/arsnova/security/ApplicationPermissionEvaluator.java +++ b/src/main/java/de/thm/arsnova/security/ApplicationPermissionEvaluator.java @@ -17,7 +17,7 @@ */ package de.thm.arsnova.security; -import de.thm.arsnova.entities.Comment; +import de.thm.arsnova.entities.migration.v2.Comment; import de.thm.arsnova.entities.migration.v2.Content; import de.thm.arsnova.entities.migration.v2.Session; import de.thm.arsnova.entities.User; diff --git a/src/main/java/de/thm/arsnova/services/CommentService.java b/src/main/java/de/thm/arsnova/services/CommentService.java index 4713dfb8d..1525981ec 100644 --- a/src/main/java/de/thm/arsnova/services/CommentService.java +++ b/src/main/java/de/thm/arsnova/services/CommentService.java @@ -1,7 +1,7 @@ package de.thm.arsnova.services; -import de.thm.arsnova.entities.Comment; -import de.thm.arsnova.entities.CommentReadingCount; +import de.thm.arsnova.entities.migration.v2.Comment; +import de.thm.arsnova.entities.migration.v2.CommentReadingCount; import de.thm.arsnova.entities.User; import java.util.List; diff --git a/src/main/java/de/thm/arsnova/services/CommentServiceImpl.java b/src/main/java/de/thm/arsnova/services/CommentServiceImpl.java index 4678aff6e..c0fd1fbc0 100644 --- a/src/main/java/de/thm/arsnova/services/CommentServiceImpl.java +++ b/src/main/java/de/thm/arsnova/services/CommentServiceImpl.java @@ -1,7 +1,7 @@ package de.thm.arsnova.services; -import de.thm.arsnova.entities.Comment; -import de.thm.arsnova.entities.CommentReadingCount; +import de.thm.arsnova.entities.migration.v2.Comment; +import de.thm.arsnova.entities.migration.v2.CommentReadingCount; import de.thm.arsnova.entities.migration.v2.Session; import de.thm.arsnova.entities.User; import de.thm.arsnova.events.DeleteCommentEvent; diff --git a/src/main/java/de/thm/arsnova/websocket/ArsnovaSocketioServerImpl.java b/src/main/java/de/thm/arsnova/websocket/ArsnovaSocketioServerImpl.java index a343a7230..00e52aa8f 100644 --- a/src/main/java/de/thm/arsnova/websocket/ArsnovaSocketioServerImpl.java +++ b/src/main/java/de/thm/arsnova/websocket/ArsnovaSocketioServerImpl.java @@ -28,7 +28,7 @@ import com.corundumstudio.socketio.listener.DataListener; import com.corundumstudio.socketio.listener.DisconnectListener; import com.corundumstudio.socketio.protocol.Packet; import com.corundumstudio.socketio.protocol.PacketType; -import de.thm.arsnova.entities.Comment; +import de.thm.arsnova.entities.migration.v2.Comment; import de.thm.arsnova.entities.ScoreOptions; import de.thm.arsnova.entities.User; import de.thm.arsnova.entities.migration.v2.SessionFeature; -- GitLab