Commit a4948707 authored by Mo Firouz's avatar Mo Firouz
Browse files

Tweak storage queries and fix verbose mode. Update TFriendAdd, TFriendRemove,...

Tweak storage queries and fix verbose mode. Update TFriendAdd, TFriendRemove, TFriendBlock to accept UserID as bytes. Merged #16
parent 6e5fb24b
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -12,7 +12,8 @@ The format is based on [keep a changelog](http://keepachangelog.com/) and this p
### Changed
- Update db schema to support 64 characters with device IDs. This enables `SystemInfo.deviceUniqueIdentifier` to be used as a source for device IDs on Windows 10.
- Logout messages now close the connection as well and won't reply.
- Changed Logout message type from `TLogout` to `Logout`.
- Change Logout message type from `TLogout` to `Logout`.
- Update TFriendAdd, TFriendRemove, TFriendBlock to accept UserID as bytes.

### Fixed

+1 −1
Original line number Diff line number Diff line
@@ -191,7 +191,7 @@ func parseArgs(clogger zap.Logger) server.Config {
}

func zapLevelEnabler(level zap.Level) bool {
	return !(level == zap.DebugLevel && !verboseLogging)
	return verboseLogging || level > zap.DebugLevel
}

func configureLogger(clogger zap.Logger, config server.Config) (zap.Logger, zap.Logger) {
+3 −3
Original line number Diff line number Diff line
@@ -217,15 +217,15 @@ message Friend {
}

message TFriendAdd {
  string user_id = 1;
  bytes user_id = 1;
}

message TFriendRemove {
  string user_id = 1;
  bytes user_id = 1;
}

message TFriendBlock {
  string user_id = 1;
  bytes user_id = 1;
}

message TFriendsList {}
+14 −17
Original line number Diff line number Diff line
@@ -197,19 +197,18 @@ FROM users, user_edge ` + filterQuery

func (p *pipeline) friendAdd(l zap.Logger, session *session, envelope *Envelope) {
	addFriendRequest := envelope.GetFriendAdd()
	if addFriendRequest.UserId == "" {
	if len(addFriendRequest.UserId) == 0 {
		session.Send(&Envelope{CollationId: envelope.CollationId, Payload: &Envelope_Error{&Error{Reason: "User ID must be present"}}})
		return
	}

	logger := l.With(zap.String("friend_id", addFriendRequest.UserId))

	friendID, err := uuid.FromString(addFriendRequest.UserId)
	friendID, err := uuid.FromBytes(addFriendRequest.UserId)
	if err != nil {
		logger.Warn("Could not add friend", zap.Error(err))
		l.Warn("Could not add friend", zap.Error(err))
		session.Send(&Envelope{CollationId: envelope.CollationId, Payload: &Envelope_Error{&Error{Reason: "Invalid User ID"}}})
		return
	}
	logger := l.With(zap.String("friend_id", friendID.String()))
	friendIDBytes := friendID.Bytes()

	if friendID.String() == session.userID.String() {
@@ -259,7 +258,7 @@ func (p *pipeline) friendAdd(l zap.Logger, session *session, envelope *Envelope)

	res, err = tx.Exec(`
INSERT INTO user_edge (source_id, destination_id, state, position, updated_at)
SELECT ($1, $2, $3, $4, $4)
SELECT $1, $2, $3, $4, $4
WHERE EXISTS (SELECT id FROM users WHERE id=$2)
	`, session.userID.Bytes(), friendIDBytes, state, updatedAt)
	if err != nil {
@@ -292,19 +291,18 @@ WHERE EXISTS (SELECT id FROM users WHERE id=$2)

func (p *pipeline) friendRemove(l zap.Logger, session *session, envelope *Envelope) {
	removeFriendRequest := envelope.GetFriendRemove()
	if removeFriendRequest.UserId == "" {
	if len(removeFriendRequest.UserId) == 0 {
		session.Send(&Envelope{CollationId: envelope.CollationId, Payload: &Envelope_Error{&Error{Reason: "User ID must be present"}}})
		return
	}

	logger := l.With(zap.String("friend_id", removeFriendRequest.UserId))

	friendID, err := uuid.FromString(removeFriendRequest.UserId)
	friendID, err := uuid.FromBytes(removeFriendRequest.UserId)
	if err != nil {
		logger.Warn("Could not add friend", zap.Error(err))
		l.Warn("Could not add friend", zap.Error(err))
		session.Send(&Envelope{CollationId: envelope.CollationId, Payload: &Envelope_Error{&Error{Reason: "Invalid User ID"}}})
		return
	}
	logger := l.With(zap.String("friend_id", friendID.String()))
	friendIDBytes := friendID.Bytes()

	if friendID.String() == session.userID.String() {
@@ -361,19 +359,18 @@ func (p *pipeline) friendRemove(l zap.Logger, session *session, envelope *Envelo

func (p *pipeline) friendBlock(l zap.Logger, session *session, envelope *Envelope) {
	blockUserRequest := envelope.GetFriendBlock()
	if blockUserRequest.UserId == "" {
	if len(blockUserRequest.UserId) == 0 {
		session.Send(&Envelope{CollationId: envelope.CollationId, Payload: &Envelope_Error{&Error{Reason: "User ID must be present"}}})
		return
	}

	logger := l.With(zap.String("user_id", blockUserRequest.UserId))

	userID, err := uuid.FromString(blockUserRequest.UserId)
	userID, err := uuid.FromBytes(blockUserRequest.UserId)
	if err != nil {
		logger.Warn("Could not block user", zap.Error(err))
		l.Warn("Could not block user", zap.Error(err))
		session.Send(&Envelope{CollationId: envelope.CollationId, Payload: &Envelope_Error{&Error{Reason: "Invalid User ID"}}})
		return
	}
	logger := l.With(zap.String("user_id", userID.String()))
	userIDBytes := userID.Bytes()

	if userID.String() == session.userID.String() {
@@ -439,7 +436,7 @@ func (p *pipeline) friendBlock(l zap.Logger, session *session, envelope *Envelop
}

func (p *pipeline) friendsList(logger zap.Logger, session *session, envelope *Envelope) {
	friends, err := p.getFriends("WHERE id = source_id AND id = $1", session.userID.Bytes())
	friends, err := p.getFriends("WHERE id = destination_id AND source_id = $1", session.userID.Bytes())
	if err != nil {
		logger.Error("Could not get friends", zap.Error(err))
		session.Send(&Envelope{CollationId: envelope.CollationId, Payload: &Envelope_Error{&Error{Reason: "Could not get friends"}}})
+7 −7
Original line number Diff line number Diff line
@@ -26,12 +26,12 @@ import (
)

func (p *pipeline) fetchStorageData(r scanner) (*TStorageData_StorageData, error) {
	var userID sql.RawBytes
	var userID []byte
	var bucket sql.NullString
	var collection sql.NullString
	var record sql.NullString
	var value sql.RawBytes
	var version sql.RawBytes
	var value []byte
	var version []byte
	var read sql.NullInt64
	var write sql.NullInt64
	var createdAt sql.NullInt64
@@ -183,7 +183,7 @@ func (p *pipeline) storageWrite(logger zap.Logger, session *session, envelope *E
		if len(data.Version) == 0 {
			query = `
INSERT INTO storage (user_id, bucket, collection, record, value, version, created_at, updated_at, deleted_at)
SELECT ($1, $2, $3, $4, $5, $6, $7, $7, 0)
SELECT $1, $2, $3, $4, $5, $6, $7, $7, 0
WHERE NOT EXISTS (SELECT record FROM storage WHERE user_id = $1 AND bucket = $2 AND collection = $3 AND record = $4 AND deleted_at = 0 AND write = 0)
ON CONFLICT (bucket, collection, user_id, record, deleted_at)
DO UPDATE SET value = $5, version = $6, updated_at = $7
@@ -194,7 +194,7 @@ DO UPDATE SET value = $5, version = $6, updated_at = $7
			// if-none-match
			query = `
INSERT INTO storage (user_id, bucket, collection, record, value, version, created_at, updated_at, deleted_at)
SELECT ($1, $2, $3, $4, $5, $6, $7, $7, 0)
SELECT $1, $2, $3, $4, $5, $6, $7, $7, 0
WHERE NOT EXISTS (SELECT record FROM storage WHERE user_id = $1 AND bucket = $2 AND collection = $3 AND record = $4 AND deleted_at = 0)
`
			params = []interface{}{session.userID.Bytes(), data.Bucket, data.Collection, data.Record, data.Value, version, updatedAt}
@@ -203,7 +203,7 @@ WHERE NOT EXISTS (SELECT record FROM storage WHERE user_id = $1 AND bucket = $2
			// if-match
			query = `
INSERT INTO storage (user_id, bucket, collection, record, value, version, created_at, updated_at, deleted_at)
SELECT ($1, $2, $3, $4, $5, $6, $7, $7, 0)
SELECT $1, $2, $3, $4, $5, $6, $7, $7, 0
WHERE EXISTS (SELECT record FROM storage WHERE user_id = $1 AND bucket = $2 AND collection = $3 and record = $4 AND version = $8 AND deleted_at = 0 AND write = 1)
ON CONFLICT (bucket, collection, user_id, record, deleted_at)
DO UPDATE SET value = $5, version = $6, updated_at = $7
@@ -212,7 +212,7 @@ DO UPDATE SET value = $5, version = $6, updated_at = $7
			errorMessage = "Could not store data. This could be caused by failure of if-match version check"
		}

		_, err := tx.Exec(query, params...)
		_, err = tx.Exec(query, params...)
		if err != nil {
			return
		}