Skip to content

Commit

Permalink
Merge pull request #48 from stzups/temp
Browse files Browse the repository at this point in the history
v0.3.3 Rework db, implement document persistence
  • Loading branch information
griffinht authored Apr 3, 2021
2 parents bee9cc8 + 8c0d621 commit 36adce1
Show file tree
Hide file tree
Showing 21 changed files with 252 additions and 238 deletions.
8 changes: 7 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -82,4 +82,10 @@ Rework protocol, document serialization

- Canvas objects instead of points
- Rename packets to messages
- Add better serialization/deserialization methods
- Add better serialization/deserialization methods

### v0.3.3
Rework db, implement document persistence

- Canvas is saved in db
- Rework user authentication
9 changes: 9 additions & 0 deletions board-room/src/main/java/net/stzups/board/BoardRoom.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
import net.stzups.board.data.database.memory.MemoryDatabase;
import net.stzups.board.server.Server;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Random;
import java.util.logging.Logger;
Expand All @@ -20,6 +22,7 @@ public class BoardRoom {
private static Config config;
private static final SecureRandom secureRandom = new SecureRandom();
private static final Random random = new Random();
private static MessageDigest SHA256MessageDigest;

private static Database database;//user id -> user

Expand All @@ -30,6 +33,8 @@ public static void main(String[] args) throws Exception {

long start = System.currentTimeMillis();

SHA256MessageDigest = MessageDigest.getInstance("SHA-256");

config = new ConfigBuilder()
.addConfig(new ArgumentConfig(args))
.addConfig(new PropertiesConfig("board.properties"))
Expand Down Expand Up @@ -82,6 +87,10 @@ public static SecureRandom getSecureRandom() {
return secureRandom;
}

public static MessageDigest getSHA256MessageDigest() {
return SHA256MessageDigest;
}

public static Random getRandom() {
return random;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,20 @@
package net.stzups.board.data.database;

import net.stzups.board.data.objects.Document;
import net.stzups.board.data.objects.HttpSession;
import net.stzups.board.data.objects.User;
import net.stzups.board.data.objects.UserSession;
import net.stzups.board.data.objects.PersistentUserSession;
import net.stzups.board.data.objects.canvas.Canvas;

public interface Database {
void addUser(User user);
User getUser(long id);

Document createDocument(User owner);
Document getDocument(long id);
Canvas getCanvas(Document document);
void saveCanvas(Canvas canvas);
void saveDocument(Document document);

UserSession removeUserSession(long token);
void addUserSession(UserSession userSession);
PersistentUserSession removeUserSession(long id);
void addUserSession(PersistentUserSession persistentUserSession);
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
import net.stzups.board.data.database.Database;
import net.stzups.board.data.objects.Document;
import net.stzups.board.data.objects.User;
import net.stzups.board.data.objects.UserSession;
import net.stzups.board.data.objects.PersistentUserSession;
import net.stzups.board.data.objects.canvas.Canvas;

import java.util.HashMap;
import java.util.Map;
Expand All @@ -13,7 +14,7 @@
*/
public class MemoryDatabase implements Database {
private Map<Long, Document> documents = new HashMap<>();
private Map<Long, UserSession> userSessions = new HashMap<>();
private Map<Long, PersistentUserSession> userSessions = new HashMap<>();
private Map<Long, User> users = new HashMap<>();

@Override
Expand All @@ -31,19 +32,29 @@ public Document getDocument(long id) {
return documents.get(id);
}

@Override
public Canvas getCanvas(Document document) {
return new Canvas(document);
}

@Override
public void saveCanvas(Canvas canvas) {

}

@Override
public void saveDocument(Document document) {
documents.put(document.getId(), document);
}

@Override
public UserSession removeUserSession(long token) {
return userSessions.remove(token);
public PersistentUserSession removeUserSession(long id) {
return userSessions.remove(id);
}

@Override
public void addUserSession(UserSession userSession) {
userSessions.put(userSession.getToken(), userSession);
public void addUserSession(PersistentUserSession persistentUserSession) {
userSessions.put(persistentUserSession.getId(), persistentUserSession);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
package net.stzups.board.data.database.postgres;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import net.stzups.board.data.database.Database;
import net.stzups.board.data.objects.Document;
import net.stzups.board.data.objects.User;
import net.stzups.board.data.objects.UserSession;
import net.stzups.board.data.objects.PersistentUserSession;
import net.stzups.board.data.objects.canvas.Canvas;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
Expand All @@ -22,7 +26,6 @@ public class PostgresDatabase implements Database {

private Map<Long, User> users = new HashMap<>();
private Map<Long, Document> documents = new HashMap<>();
private Map<Long, UserSession> userSessions = new HashMap<>();

public PostgresDatabase(String url, String user, String password) throws Exception {
Class.forName("org.postgresql.Driver");
Expand Down Expand Up @@ -69,11 +72,10 @@ public User getUser(long id) {
public Document createDocument(User owner) {
Document document = new Document(owner);
try {
PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO documents VALUES (?, ?, ?, ?)");
PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO documents(id, owner, name) VALUES (?, ?, ?)");
preparedStatement.setLong(1, document.getId());
preparedStatement.setLong(2, document.getOwner().getId());
preparedStatement.setString(3, document.getName());
preparedStatement.setBinaryStream(4, new ByteArrayInputStream(new byte[0]));
preparedStatement.execute();
documents.put(document.getId(), document);
return document;
Expand All @@ -95,12 +97,12 @@ public Document getDocument(long id) {
System.out.println("document does not exist");
return null;
}
User user = getUser(resultSet.getLong("owner_id"));
User user = getUser(resultSet.getLong("owner"));
if (user == null) {
System.out.println("no owner for document");
return null;
}
document = new Document(id, user, resultSet.getString("name"), Unpooled.buffer(0));//todo binary data
document = new Document(id, user, resultSet.getString("name"));
documents.put(document.getId(), document);
}
return document;
Expand All @@ -110,21 +112,54 @@ public Document getDocument(long id) {
}
}

@Override
public Canvas getCanvas(Document document) {
try {
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM canvases WHERE document=?");
preparedStatement.setLong(1, document.getId());
ResultSet resultSet = preparedStatement.executeQuery();
if (resultSet.next()) {
Blob blob = resultSet.getBlob("data");
return new Canvas(document, Unpooled.wrappedBuffer(blob.getBytes(1, (int) blob.length())));
} else {
return new Canvas(document);
}
} catch (SQLException e) {
e.printStackTrace();
}
return null;//todo error handling??
}

@Override
public void saveCanvas(Canvas canvas) {
try {
PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO canvases(document, data) VALUES(?, ?) ON CONFLICT (document) DO UPDATE SET data=?");
preparedStatement.setLong(1, canvas.getDocument().getId());
ByteBuf byteBuf = Unpooled.buffer();
canvas.serialize(byteBuf);
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteBuf.array());
preparedStatement.setBinaryStream(2, byteArrayInputStream);
preparedStatement.setBinaryStream(3, byteArrayInputStream);//todo is this duplicate bad?
preparedStatement.execute();
} catch (SQLException e) {
e.printStackTrace();
}
}

@Override
public void saveDocument(Document document) {

}

@Override
public void addUserSession(UserSession userSession) {
public void addUserSession(PersistentUserSession persistentUserSession) {
try {
PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO user_sessions VALUES (?, ?, ?, ?)");
preparedStatement.setLong(1, userSession.getToken());
preparedStatement.setLong(2, userSession.getUserId());
preparedStatement.setLong(3, userSession.getCreationTime());
preparedStatement.setLong(4, userSession.getHash());
PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO persistent_user_sessions(id, \"user\", creation_time, hashed_token) VALUES (?, ?, ?, ?)");
preparedStatement.setLong(1, persistentUserSession.getId());
preparedStatement.setLong(2, persistentUserSession.getUser());
preparedStatement.setLong(3, persistentUserSession.getCreationTime());
preparedStatement.setBinaryStream(4, new ByteArrayInputStream(persistentUserSession.getHashedToken()));
preparedStatement.execute();
userSessions.put(userSession.getUserId(), userSession);
} catch (SQLException e) {
e.printStackTrace();
}
Expand All @@ -134,24 +169,20 @@ public void addUserSession(UserSession userSession) {
* Remove a user session for a token and return the removed user session
*/
@Override
public UserSession removeUserSession(long token) {
public PersistentUserSession removeUserSession(long id) {
try {
UserSession userSession = userSessions.remove(token);
if (userSession == null) {
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM user_sessions WHERE token=?");
preparedStatement.setLong(1, token);
ResultSet resultSet = preparedStatement.executeQuery();
if (!resultSet.next()) {
System.out.println("user session does not exist in db");
return null;
}
userSession = new UserSession(token, resultSet.getLong("user_id"), resultSet.getLong("creation_time"), resultSet.getLong("hash"));
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM persistent_user_sessions WHERE id=?");
preparedStatement.setLong(1, id);
ResultSet resultSet = preparedStatement.executeQuery();
if (!resultSet.next()) {
return null;
}
PreparedStatement preparedStatement = connection.prepareStatement("DELETE FROM user_sessions WHERE token=?");
preparedStatement.setLong(1, token);
PersistentUserSession persistentUserSession = new PersistentUserSession(id, resultSet.getLong("user"), resultSet.getLong("creation_time"), resultSet.getBinaryStream("hashed_token").readAllBytes());
preparedStatement = connection.prepareStatement("DELETE FROM persistent_user_sessions WHERE id=?");
preparedStatement.setLong(1, id);
preparedStatement.execute();
return userSession;
} catch (SQLException e) {
return persistentUserSession;
} catch (SQLException | IOException e) {
e.printStackTrace();
return null;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ public class Document {
private User owner;
private String name;
private String inviteCode;
private Canvas canvas;

/**
* New document
Expand All @@ -21,17 +20,15 @@ public Document(User owner) {
this.owner = owner;
owner.getOwnedDocuments().add(id);
this.name = DEFAULT_DOCUMENT_NAME;
this.canvas = new Canvas();
}

/**
* Serialize document from db
*/
public Document(long id, User owner, String name, ByteBuf byteBuf) {
public Document(long id, User owner, String name) {
this.id = id;
this.owner = owner;
this.name = name;
this.canvas = new Canvas(byteBuf);
}

public long getId() {
Expand All @@ -46,10 +43,6 @@ public User getOwner() {
return owner;
}

public Canvas getCanvas() {
return canvas;
}

@Override
public String toString() {
return "Document{id=" + id + ",name=" + name + "}";
Expand Down
Loading

0 comments on commit 36adce1

Please sign in to comment.