working on editor for polls
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
This commit is contained in:
@@ -102,6 +102,7 @@ public class Field {
|
|||||||
|
|
||||||
public static final String OBJECT = "object";
|
public static final String OBJECT = "object";
|
||||||
public static final String OFFSET = "offset";
|
public static final String OFFSET = "offset";
|
||||||
|
public static final String OPTIONS = "options";
|
||||||
public static final String OPTIONAL = "optional";
|
public static final String OPTIONAL = "optional";
|
||||||
public static final String OPTION_ID = "option_id";
|
public static final String OPTION_ID = "option_id";
|
||||||
public static final String OWNER = "owner";
|
public static final String OWNER = "owner";
|
||||||
@@ -133,6 +134,7 @@ public class Field {
|
|||||||
public static final String SENDER = "sender";
|
public static final String SENDER = "sender";
|
||||||
public static final String SENDER_USER_ID = "sender_user_id";
|
public static final String SENDER_USER_ID = "sender_user_id";
|
||||||
public static final String SETTINGS = "settings";
|
public static final String SETTINGS = "settings";
|
||||||
|
public static final String SHARES = "shares";
|
||||||
public static final String SHOW_CLOSED = "show_closed";
|
public static final String SHOW_CLOSED = "show_closed";
|
||||||
public static final String SILENT = "silent";
|
public static final String SILENT = "silent";
|
||||||
public static final String SOURCE = "source";
|
public static final String SOURCE = "source";
|
||||||
@@ -182,4 +184,5 @@ public class Field {
|
|||||||
public static final String VERSIONS = "versions";
|
public static final String VERSIONS = "versions";
|
||||||
|
|
||||||
public static final String WEIGHT = "weight";
|
public static final String WEIGHT = "weight";
|
||||||
|
public static final String WEIGHTS = "weights";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ public class Text {
|
|||||||
public static final String NUMBER = "number";
|
public static final String NUMBER = "number";
|
||||||
|
|
||||||
public static final String PATH = "path";
|
public static final String PATH = "path";
|
||||||
|
public static final String POLL = "poll";
|
||||||
public static final String POLLS = "polls";
|
public static final String POLLS = "polls";
|
||||||
public static final String PROJECTS = "projects";
|
public static final String PROJECTS = "projects";
|
||||||
public static final String PROJECT_WITH_ID = "project ({id})";
|
public static final String PROJECT_WITH_ID = "project ({id})";
|
||||||
|
|||||||
@@ -8,30 +8,75 @@ import de.srsoftware.umbrella.core.constants.Field;
|
|||||||
|
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import static de.srsoftware.umbrella.core.constants.Field.*;
|
||||||
|
|
||||||
|
public record Poll(String id, Owner owner, String name, String description, boolean isPrivate, List<Option> options, Map<Integer,String> weights, Map<UmbrellaUser,Long> shares) implements Mappable {
|
||||||
|
public record Option(Integer id, String name, String description, Integer status) implements Mappable{
|
||||||
|
public static Option of(ResultSet rs) throws SQLException {
|
||||||
|
var id = rs.getInt(ID);
|
||||||
|
var name = rs.getString(NAME);
|
||||||
|
var description = rs.getString(DESCRIPTION);
|
||||||
|
var status = rs.getInt(STATUS);
|
||||||
|
|
||||||
|
return new Option(id,name,description,status);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Map<String, Object> toMap() {
|
||||||
|
return Map.of(
|
||||||
|
ID,id,
|
||||||
|
NAME,name,
|
||||||
|
DESCRIPTION, Map.of(
|
||||||
|
SOURCE,description,
|
||||||
|
RENDERED,Util.markdown(description)
|
||||||
|
),
|
||||||
|
STATUS,status
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public record Poll(String id, Owner owner, String name, String description, boolean isPrivate) implements Mappable {
|
|
||||||
public static Poll of(ResultSet rs) throws SQLException {
|
public static Poll of(ResultSet rs) throws SQLException {
|
||||||
var id = rs.getString(Field.ID);
|
var id = rs.getString(ID);
|
||||||
var userId = rs.getLong(Field.USER_ID);
|
var userId = rs.getLong(Field.USER_ID);
|
||||||
var name = rs.getString(Field.NAME);
|
var name = rs.getString(NAME);
|
||||||
var description = rs.getString(Field.DESCRIPTION);
|
var description = rs.getString(Field.DESCRIPTION);
|
||||||
var isPrivate = rs.getBoolean(Field.PRIVATE);
|
var isPrivate = rs.getBoolean(Field.PRIVATE);
|
||||||
var owner = ModuleRegistry.userService().loadUser(userId);
|
var owner = ModuleRegistry.userService().loadUser(userId);
|
||||||
return new Poll(id,owner,name,description,isPrivate);
|
|
||||||
|
return new Poll(id,owner,name,description,isPrivate,new ArrayList<>(),new HashMap<>(),new HashMap<>());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<String, Object> toMap() {
|
public Map<String, Object> toMap() {
|
||||||
return Map.of(
|
return Map.of(
|
||||||
Field.ID, id,
|
ID, id,
|
||||||
Field.OWNER, owner.toMap(),
|
Field.OWNER, owner.toMap(),
|
||||||
Field.NAME,name,
|
NAME,name,
|
||||||
Field.DESCRIPTION, Map.of(
|
Field.DESCRIPTION, Map.of(
|
||||||
Field.SOURCE,description,
|
Field.SOURCE,description,
|
||||||
Field.RENDERED,Util.markdown(description)
|
Field.RENDERED,Util.markdown(description)
|
||||||
),
|
),
|
||||||
Field.PRIVATE, isPrivate
|
Field.OPTIONS, options.stream().map(Option::toMap).toList(),
|
||||||
|
Field.SHARES, mapShares(),
|
||||||
|
Field.PRIVATE, isPrivate,
|
||||||
|
Field.WEIGHTS, weights
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Map<Long, Map<String, Object>> mapShares() {
|
||||||
|
var result = new HashMap<Long,Map<String,Object>>();
|
||||||
|
for (var entry : shares.entrySet()){
|
||||||
|
var user = entry.getKey();
|
||||||
|
var data = user.toMap();
|
||||||
|
data.put(Field.PERMISSION,entry.getValue());
|
||||||
|
result.put(user.id(),data);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,6 +14,7 @@
|
|||||||
import ContactList from "./routes/contact/Index.svelte";
|
import ContactList from "./routes/contact/Index.svelte";
|
||||||
import DocList from "./routes/document/List.svelte";
|
import DocList from "./routes/document/List.svelte";
|
||||||
import EasyList from "./routes/task/EasyList.svelte";
|
import EasyList from "./routes/task/EasyList.svelte";
|
||||||
|
import EditPoll from "./routes/poll/Edit.svelte";
|
||||||
import EditService from "./routes/user/EditService.svelte";
|
import EditService from "./routes/user/EditService.svelte";
|
||||||
import EditUser from "./routes/user/EditUser.svelte";
|
import EditUser from "./routes/user/EditUser.svelte";
|
||||||
import FileIndex from "./routes/files/Index.svelte";
|
import FileIndex from "./routes/files/Index.svelte";
|
||||||
@@ -25,6 +26,7 @@
|
|||||||
import Menu from "./Components/Menu.svelte";
|
import Menu from "./Components/Menu.svelte";
|
||||||
import NewPage from "./routes/wiki/AddPage.svelte";
|
import NewPage from "./routes/wiki/AddPage.svelte";
|
||||||
import Notes from "./routes/notes/Index.svelte";
|
import Notes from "./routes/notes/Index.svelte";
|
||||||
|
import PollList from "./routes/poll/Index.svelte";
|
||||||
import ProjectList from "./routes/project/List.svelte";
|
import ProjectList from "./routes/project/List.svelte";
|
||||||
import ProjectAdd from "./routes/project/Create.svelte";
|
import ProjectAdd from "./routes/project/Create.svelte";
|
||||||
import ResetPw from "./routes/user/ResetPw.svelte";
|
import ResetPw from "./routes/user/ResetPw.svelte";
|
||||||
@@ -95,6 +97,8 @@
|
|||||||
<Route path="/message" component={Messages} />
|
<Route path="/message" component={Messages} />
|
||||||
<Route path="/message/settings" component={MsgSettings} />
|
<Route path="/message/settings" component={MsgSettings} />
|
||||||
<Route path="/notes" component={Notes} />
|
<Route path="/notes" component={Notes} />
|
||||||
|
<Route path="/poll" component={PollList} />
|
||||||
|
<Route path="/poll/:id/edit" component={EditPoll} />
|
||||||
<Route path="/project" component={ProjectList} />
|
<Route path="/project" component={ProjectList} />
|
||||||
<Route path="/project/add" component={ProjectAdd} />
|
<Route path="/project/add" component={ProjectAdd} />
|
||||||
<Route path="/project/:project_id/add_task" component={AddTask} />
|
<Route path="/project/:project_id/add_task" component={AddTask} />
|
||||||
|
|||||||
88
frontend/src/routes/poll/Edit.svelte
Normal file
88
frontend/src/routes/poll/Edit.svelte
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
<script>
|
||||||
|
import { onMount } from 'svelte';
|
||||||
|
import { useTinyRouter } from 'svelte-tiny-router';
|
||||||
|
|
||||||
|
import LineEditor from '../../Components/LineEditor.svelte';
|
||||||
|
import MarkdownEditor from '../../Components/MarkdownEditor.svelte';
|
||||||
|
|
||||||
|
import { api, get } from '../../urls.svelte';
|
||||||
|
import { error, yikes } from '../../warn.svelte';
|
||||||
|
import { t } from '../../translations.svelte';
|
||||||
|
import { user } from '../../user.svelte.js';
|
||||||
|
|
||||||
|
let { id } = $props();
|
||||||
|
let poll = $state(null);
|
||||||
|
|
||||||
|
async function load(){
|
||||||
|
let url = api('poll/'+id);
|
||||||
|
let res = await get(url);
|
||||||
|
if (res.ok){
|
||||||
|
poll = await res.json();
|
||||||
|
yikes();
|
||||||
|
} else error(res);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
onMount(load);
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<fieldset>
|
||||||
|
<legend>{t('edit poll',{id:id})}</legend>
|
||||||
|
{#if poll && poll.name}
|
||||||
|
<fieldset>
|
||||||
|
<legend>{t('name')}</legend>
|
||||||
|
<LineEditor bind:value={poll.name} editable={true} />
|
||||||
|
</fieldset>
|
||||||
|
<fieldset>
|
||||||
|
<legend>{t('description')}</legend>
|
||||||
|
<MarkdownEditor bind:value={poll.description} />
|
||||||
|
</fieldset>
|
||||||
|
<fieldset>
|
||||||
|
<legend>{t('options')}</legend>
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>{t('name')}</th>
|
||||||
|
<th>{t('description')}</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{#each poll.options as option}
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<input type="text" value={option.name} />
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<MarkdownEditor bind:value={option.description} />
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{/each}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</fieldset>
|
||||||
|
<fieldset>
|
||||||
|
<legend>{t('weights')}</legend>
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>{t('weight')}</th>
|
||||||
|
<th>{t('description')}</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{#each Object.entries(poll.weights) as [weight,descr]}
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<input type="number" value={weight} />
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<input type="text" value={descr} />
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{/each}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</fieldset>
|
||||||
|
{/if}
|
||||||
|
</fieldset>
|
||||||
66
frontend/src/routes/poll/Index.svelte
Normal file
66
frontend/src/routes/poll/Index.svelte
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
<script>
|
||||||
|
import { onMount } from 'svelte';
|
||||||
|
import { useTinyRouter } from 'svelte-tiny-router';
|
||||||
|
import { api, get } from '../../urls.svelte';
|
||||||
|
import { error, yikes } from '../../warn.svelte';
|
||||||
|
import { t } from '../../translations.svelte';
|
||||||
|
import { user } from '../../user.svelte.js';
|
||||||
|
|
||||||
|
let polls = [];
|
||||||
|
let router = useTinyRouter();
|
||||||
|
|
||||||
|
function edit(poll){
|
||||||
|
router.navigate(`/poll/${poll.id}/edit`);
|
||||||
|
}
|
||||||
|
|
||||||
|
function evaluate(poll){
|
||||||
|
router.navigate(`/poll/${poll.id}/evaluate`);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function load(){
|
||||||
|
let url = api('poll/list');
|
||||||
|
let res = await get(url);
|
||||||
|
if (res.ok){
|
||||||
|
polls = await res.json();
|
||||||
|
yikes();
|
||||||
|
} else error(res);
|
||||||
|
}
|
||||||
|
|
||||||
|
function share(poll){
|
||||||
|
}
|
||||||
|
|
||||||
|
onMount(load);
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<fieldset>
|
||||||
|
<legend>{t('polls')}</legend>
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>{t('name')}</th>
|
||||||
|
<th>{t('description')}</th>
|
||||||
|
<th>{t('owner')}</th>
|
||||||
|
<th>{t('actions')}</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{#each polls as poll}
|
||||||
|
<tr>
|
||||||
|
<td>{poll.name}</td>
|
||||||
|
<td>{@html poll.description.rendered}</td>
|
||||||
|
<td>{poll.owner.name}</td>
|
||||||
|
<td>
|
||||||
|
{#if user.id == poll.owner.id || poll.shares[user.id].permission == 2}
|
||||||
|
<button onclick={e => edit(poll)}>{t('edit')}</button>
|
||||||
|
{/if}
|
||||||
|
{#if user.id == poll.owner.id || poll.shares[user.id].permission > 0}
|
||||||
|
<button onclick={e => evaluate(poll)}>{t('evaluate')}</button>
|
||||||
|
{/if}
|
||||||
|
<button onclick={e => share(poll)}>{t('share')}</button>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{/each}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</fieldset>
|
||||||
@@ -8,4 +8,6 @@ import java.util.Collection;
|
|||||||
|
|
||||||
public interface PollDb {
|
public interface PollDb {
|
||||||
Collection<Poll> listPolls(UmbrellaUser user);
|
Collection<Poll> listPolls(UmbrellaUser user);
|
||||||
|
|
||||||
|
Poll loadPoll(String id);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import static de.srsoftware.umbrella.core.ModuleRegistry.userService;
|
|||||||
import static de.srsoftware.umbrella.core.constants.Path.LIST;
|
import static de.srsoftware.umbrella.core.constants.Path.LIST;
|
||||||
import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.missingField;
|
import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.missingField;
|
||||||
import static de.srsoftware.umbrella.poll.Constants.CONFIG_DATABASE;
|
import static de.srsoftware.umbrella.poll.Constants.CONFIG_DATABASE;
|
||||||
|
import static java.lang.System.Logger.Level.WARNING;
|
||||||
|
|
||||||
import com.sun.net.httpserver.HttpExchange;
|
import com.sun.net.httpserver.HttpExchange;
|
||||||
import de.srsoftware.configuration.Configuration;
|
import de.srsoftware.configuration.Configuration;
|
||||||
@@ -15,6 +16,7 @@ import de.srsoftware.umbrella.core.BaseHandler;
|
|||||||
import de.srsoftware.umbrella.core.ModuleRegistry;
|
import de.srsoftware.umbrella.core.ModuleRegistry;
|
||||||
import de.srsoftware.umbrella.core.api.PollService;
|
import de.srsoftware.umbrella.core.api.PollService;
|
||||||
import de.srsoftware.umbrella.core.exceptions.UmbrellaException;
|
import de.srsoftware.umbrella.core.exceptions.UmbrellaException;
|
||||||
|
import de.srsoftware.umbrella.core.model.Poll;
|
||||||
import de.srsoftware.umbrella.core.model.Token;
|
import de.srsoftware.umbrella.core.model.Token;
|
||||||
import de.srsoftware.umbrella.core.model.UmbrellaUser;
|
import de.srsoftware.umbrella.core.model.UmbrellaUser;
|
||||||
|
|
||||||
@@ -42,15 +44,23 @@ public class PollModule extends BaseHandler implements PollService {
|
|||||||
var head = path.pop();
|
var head = path.pop();
|
||||||
return switch (head) {
|
return switch (head) {
|
||||||
case LIST -> getPollList(ex,user.get());
|
case LIST -> getPollList(ex,user.get());
|
||||||
case null, default -> super.doGet(path,ex);
|
case null -> super.doGet(path,ex);
|
||||||
|
default -> getPoll(ex,user.get(),head);
|
||||||
};
|
};
|
||||||
} catch (UmbrellaException e){
|
} catch (UmbrellaException e){
|
||||||
return send(ex,e);
|
return send(ex,e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean getPoll(HttpExchange ex, UmbrellaUser user, String id) throws IOException {
|
||||||
|
var poll = pollDb.loadPoll(id);
|
||||||
|
// TODO: check permissions
|
||||||
|
LOG.log(WARNING,"no permission checks on PollModule.getPoll({0})",id);
|
||||||
|
return sendContent(ex,poll);
|
||||||
|
}
|
||||||
|
|
||||||
private boolean getPollList(HttpExchange ex, UmbrellaUser user) throws IOException {
|
private boolean getPollList(HttpExchange ex, UmbrellaUser user) throws IOException {
|
||||||
var list = pollDb.listPolls(user);
|
var list = pollDb.listPolls(user).stream().map(Poll::toMap);
|
||||||
return sendContent(ex,list);
|
return sendContent(ex,list);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ package de.srsoftware.umbrella.poll;
|
|||||||
import static de.srsoftware.tools.jdbc.Condition.equal;
|
import static de.srsoftware.tools.jdbc.Condition.equal;
|
||||||
import static de.srsoftware.tools.jdbc.Query.SelectQuery.ALL;
|
import static de.srsoftware.tools.jdbc.Query.SelectQuery.ALL;
|
||||||
import static de.srsoftware.tools.jdbc.Query.select;
|
import static de.srsoftware.tools.jdbc.Query.select;
|
||||||
|
import static de.srsoftware.umbrella.core.ModuleRegistry.userService;
|
||||||
import static de.srsoftware.umbrella.core.constants.Field.*;
|
import static de.srsoftware.umbrella.core.constants.Field.*;
|
||||||
import static de.srsoftware.umbrella.core.constants.Field.DESCRIPTION;
|
import static de.srsoftware.umbrella.core.constants.Field.DESCRIPTION;
|
||||||
import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.*;
|
import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.*;
|
||||||
@@ -12,6 +13,7 @@ import static java.text.MessageFormat.format;
|
|||||||
|
|
||||||
import de.srsoftware.umbrella.core.BaseDb;
|
import de.srsoftware.umbrella.core.BaseDb;
|
||||||
import de.srsoftware.umbrella.core.constants.Field;
|
import de.srsoftware.umbrella.core.constants.Field;
|
||||||
|
import de.srsoftware.umbrella.core.constants.Text;
|
||||||
import de.srsoftware.umbrella.core.model.Poll;
|
import de.srsoftware.umbrella.core.model.Poll;
|
||||||
import de.srsoftware.umbrella.core.model.UmbrellaUser;
|
import de.srsoftware.umbrella.core.model.UmbrellaUser;
|
||||||
|
|
||||||
@@ -19,6 +21,7 @@ import java.sql.Connection;
|
|||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class SqliteDb extends BaseDb implements PollDb {
|
public class SqliteDb extends BaseDb implements PollDb {
|
||||||
@@ -99,15 +102,54 @@ public class SqliteDb extends BaseDb implements PollDb {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Collection<Poll> listPolls(UmbrellaUser user) {
|
public Collection<Poll> listPolls(UmbrellaUser user) {
|
||||||
// TODO
|
|
||||||
try {
|
try {
|
||||||
var rs = select(ALL).from(TABLE_POLLS).where(USER_ID,equal(user.id())).exec(db);
|
var sql = "SELECT DISTINCT {0}.*, {5} FROM {0} LEFT JOIN {1} ON {0}.{2} = {1}.{4} WHERE {0}.{3} = ? OR {1}.{3} = ? ORDER BY {6} ASC;";
|
||||||
|
var ps = db.prepareStatement(format(sql,TABLE_POLLS,TABLE_SHARES, ID, USER_ID, POLL_ID, PERMISSION, NAME));
|
||||||
|
ps.setLong(1,user.id());
|
||||||
|
ps.setLong(2, user.id());
|
||||||
|
var rs = ps.executeQuery();
|
||||||
var list = new ArrayList<Poll>();
|
var list = new ArrayList<Poll>();
|
||||||
while (rs.next()) list.add(Poll.of(rs));
|
while (rs.next()) {
|
||||||
|
var poll = Poll.of(rs);
|
||||||
|
poll.shares().put(user,rs.getLong(PERMISSION));
|
||||||
|
list.add(poll);
|
||||||
|
}
|
||||||
return list;
|
return list;
|
||||||
} catch (SQLException sqle){
|
} catch (SQLException sqle){
|
||||||
throw failedToLoadObject(TABLE_POLLS);
|
throw failedToLoadObject(TABLE_POLLS);
|
||||||
}
|
}
|
||||||
return List.of();
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Poll loadPoll(String id) {
|
||||||
|
try {
|
||||||
|
var rs = select(ALL).from(TABLE_POLLS).where(ID,equal(id)).exec(db);
|
||||||
|
Poll poll = null;
|
||||||
|
if (rs.next()) poll = Poll.of(rs);
|
||||||
|
rs.close();
|
||||||
|
if (poll == null) throw failedToLoadObject(Text.POLL,id);
|
||||||
|
|
||||||
|
rs = select(ALL).from(TABLE_OPTIONS).where(POLL_ID,equal(id)).exec(db);
|
||||||
|
while (rs.next()) poll.options().add(Poll.Option.of(rs));
|
||||||
|
rs.close();
|
||||||
|
|
||||||
|
rs = select(ALL).from(TABLE_WEIGHTS).where(POLL_ID,equal(id)).exec(db);
|
||||||
|
while (rs.next()) {
|
||||||
|
var weight = rs.getInt(WEIGHT);
|
||||||
|
var descr = rs.getString(DESCRIPTION);
|
||||||
|
poll.weights().put(weight,descr);
|
||||||
|
}
|
||||||
|
rs.close();
|
||||||
|
|
||||||
|
rs = select(ALL).from(TABLE_SHARES).where(POLL_ID,equal(id)).exec(db);
|
||||||
|
var shares = new HashMap<Long,Long>();
|
||||||
|
while (rs.next()) shares.put(rs.getLong(USER_ID),rs.getLong(PERMISSION));
|
||||||
|
rs.close();
|
||||||
|
var users = userService().list(null,null,shares.keySet());
|
||||||
|
for (var entry : users.entrySet())poll.shares().put(entry.getValue(),shares.get(entry.getKey()));
|
||||||
|
return poll;
|
||||||
|
} catch (SQLException e) {
|
||||||
|
throw failedToLoadObject(Text.POLL,id).causedBy(e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user