implemented storing selectedweights for logged-in user
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
This commit is contained in:
@@ -3,8 +3,10 @@ package de.srsoftware.umbrella.poll;
|
||||
|
||||
import de.srsoftware.umbrella.core.model.Poll;
|
||||
import de.srsoftware.umbrella.core.model.UmbrellaUser;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Map;
|
||||
|
||||
public interface PollDb {
|
||||
Collection<Poll> listPolls(UmbrellaUser user);
|
||||
@@ -12,4 +14,7 @@ public interface PollDb {
|
||||
Poll loadPoll(String id);
|
||||
|
||||
Poll save(Poll poll);
|
||||
|
||||
void saveSelection(Poll poll, Map<Integer,Integer> optionsToWeights, String guestName);
|
||||
void saveSelection(Poll poll, Map<Integer,Integer> optionsToWeights, UmbrellaUser user);
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ import static de.srsoftware.umbrella.core.constants.Field.ID;
|
||||
import static de.srsoftware.umbrella.core.constants.Path.*;
|
||||
import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.*;
|
||||
import static de.srsoftware.umbrella.poll.Constants.CONFIG_DATABASE;
|
||||
import static java.text.MessageFormat.format;
|
||||
|
||||
import com.sun.net.httpserver.HttpExchange;
|
||||
import de.srsoftware.configuration.Configuration;
|
||||
@@ -25,6 +26,7 @@ import de.srsoftware.umbrella.core.model.UmbrellaUser;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
@@ -81,12 +83,11 @@ public class PollModule extends BaseHandler implements PollService {
|
||||
addCors(ex);
|
||||
try {
|
||||
Optional<Token> token = SessionToken.from(ex).map(Token::of);
|
||||
var user = userService().loadUser(token);
|
||||
if (user.isEmpty()) return unauthorized(ex);
|
||||
var user = userService().loadUser(token).orElse(null );
|
||||
var head = path.pop();
|
||||
return switch (head) {
|
||||
case null -> postNewPoll(ex,user.get());
|
||||
default -> postToPoll(ex,user.get(),head, path);
|
||||
case null -> postNewPoll(ex,user);
|
||||
default -> postToPoll(ex, user, head, path);
|
||||
};
|
||||
} catch (UmbrellaException e){
|
||||
return send(ex,e);
|
||||
@@ -185,6 +186,7 @@ public class PollModule extends BaseHandler implements PollService {
|
||||
}
|
||||
|
||||
private boolean postNewPoll(HttpExchange ex, UmbrellaUser user) throws IOException {
|
||||
if (user == null) return unauthorized(ex);
|
||||
var json = json(ex);
|
||||
if (!json.has(Field.NAME)) throw missingField(Field.NAME);
|
||||
var name = json.getString(Field.NAME);
|
||||
@@ -193,6 +195,7 @@ public class PollModule extends BaseHandler implements PollService {
|
||||
}
|
||||
|
||||
private boolean postToPoll(HttpExchange ex, UmbrellaUser user, String id, Path path) throws IOException {
|
||||
if (user == null) return unauthorized(ex);
|
||||
var poll = pollDb.loadPoll(id);
|
||||
var permitted = user.equals(poll.owner());
|
||||
if (!permitted) {
|
||||
@@ -202,10 +205,33 @@ public class PollModule extends BaseHandler implements PollService {
|
||||
var head = path.pop();
|
||||
return switch (head){
|
||||
case OPTION -> postOption(ex, poll);
|
||||
case SELECT -> postSelection(ex, poll, user);
|
||||
case null, default -> notFound(ex);
|
||||
};
|
||||
}
|
||||
|
||||
private boolean postSelection(HttpExchange ex, Poll poll, UmbrellaUser user) throws IOException {
|
||||
var json = json(ex);
|
||||
if (!json.has(Field.SELECTION)) throw missingField(Field.SELECTION);
|
||||
if (!(json.get(Field.SELECTION) instanceof JSONObject job)) throw invalidField(Field.SELECTION,JSON);
|
||||
var map = new HashMap<Integer,Integer>();
|
||||
for (var key : job.keySet()){
|
||||
var optionId = Integer.parseInt(key);
|
||||
if (!(job.get(key) instanceof Integer weight)) throw invalidField(Field.WEIGHT,Text.NUMBER);
|
||||
map.put(optionId,weight);
|
||||
}
|
||||
if (user != null) {
|
||||
pollDb.saveSelection(poll, map, user);
|
||||
} else {
|
||||
if (!json.has(Field.EDITOR)) throw missingField(Field.EDITOR);
|
||||
if (!(json.get(Field.EDITOR) instanceof JSONObject editor)) throw invalidField(Field.EDITOR,JSON);
|
||||
if (!editor.has(Field.NAME)) throw missingField(format("{0}.{1}}",Field.EDITOR,Field.NAME));
|
||||
if (!(editor.get(Field.NAME) instanceof String name)) throw invalidField(format("{0}.{1}",Field.EDITOR,Field.NAME),Text.STRING);
|
||||
pollDb.saveSelection(poll, map, name);
|
||||
}
|
||||
return notFound(ex);
|
||||
}
|
||||
|
||||
private boolean postOption(HttpExchange ex, Poll poll) throws IOException {
|
||||
var json = json(ex);
|
||||
if (!json.has(Field.NAME) || !(json.get(Field.NAME) instanceof String name)) throw missingField(Field.NAME);
|
||||
|
||||
@@ -15,6 +15,7 @@ import static java.text.MessageFormat.format;
|
||||
import de.srsoftware.umbrella.core.BaseDb;
|
||||
import de.srsoftware.umbrella.core.constants.Field;
|
||||
import de.srsoftware.umbrella.core.constants.Text;
|
||||
import de.srsoftware.umbrella.core.exceptions.UmbrellaException;
|
||||
import de.srsoftware.umbrella.core.model.Poll;
|
||||
import de.srsoftware.umbrella.core.model.UmbrellaUser;
|
||||
|
||||
@@ -206,6 +207,30 @@ public class SqliteDb extends BaseDb implements PollDb {
|
||||
return option;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void saveSelection(Poll poll, Map<Integer, Integer> optionsToWeights, String guestName) {
|
||||
saveSelection(poll.id(), optionsToWeights, guestName);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void saveSelection(Poll poll, Map<Integer, Integer> optionsToWeights, UmbrellaUser user) {
|
||||
saveSelection(poll.id(), optionsToWeights, user.id());
|
||||
}
|
||||
|
||||
private void saveSelection(String pollId, Map<Integer, Integer> optionsToWeights, Object editor) {
|
||||
var query = insertInto(TABLE_SELECTIONS,POLL_ID,OPTION_ID,USER_ID,WEIGHT);
|
||||
for (var entry : optionsToWeights.entrySet()){
|
||||
var optionId = entry.getKey();
|
||||
var weight = entry.getValue();
|
||||
query.values(pollId,optionId,editor,weight);
|
||||
}
|
||||
try {
|
||||
query.execute(db).close();
|
||||
} catch (SQLException sqle){
|
||||
throw UmbrellaException.failedToStoreObject(Text.SELECTIONS);
|
||||
}
|
||||
}
|
||||
|
||||
private Poll update(Poll poll) {
|
||||
if (poll.isDirty(NAME, DESCRIPTION)) try {
|
||||
replaceInto(TABLE_POLLS,ID,Field.USER_ID,NAME,DESCRIPTION).values(poll.id(),poll.owner().id(),poll.name(),poll.description()).execute(db);
|
||||
|
||||
Reference in New Issue
Block a user