Commit 4c819fd2 authored by Mo Firouz's avatar Mo Firouz Committed by Andrei Mihu
Browse files

Add in-app notifications. (#160)

parent 159b0251
Loading
Loading
Loading
Loading
+17 −21
Original line number Diff line number Diff line
@@ -15,31 +15,38 @@
package main

import (
	"database/sql"
	"fmt"
	"math/rand"
	"net/http"
	"net/url"
	"os"
	"os/signal"
	"runtime"
	"syscall"
	"time"

	"go.uber.org/zap"

	"database/sql"
	"net/url"

	"github.com/golang/protobuf/jsonpb"
	"github.com/heroiclabs/nakama/migrations"
	"github.com/heroiclabs/nakama/server"

	"math/rand"

	"github.com/golang/protobuf/jsonpb"
	_ "github.com/lib/pq"
	"go.uber.org/zap"
)

var (
	version  string = "2.0.0"
	commitID string = "dev"

	// Shared utility components.
	jsonpbMarshaler = &jsonpb.Marshaler{
		EnumsAsInts:  true,
		EmitDefaults: false,
		Indent:       "",
		OrigName:     false,
	}
	jsonpbUnmarshaler = &jsonpb.Unmarshaler{
		AllowUnknownFields: false,
	}
)

func main() {
@@ -76,17 +83,6 @@ func main() {
	// Check migration status and log if the schema has diverged.
	migrations.StartupCheck(multiLogger, db)

	// Shared utility components.
	jsonpbMarshaler := &jsonpb.Marshaler{
		EnumsAsInts:  true,
		EmitDefaults: false,
		Indent:       "",
		OrigName:     false,
	}
	jsonpbUnmarshaler := &jsonpb.Unmarshaler{
		AllowUnknownFields: false,
	}

	// Start up server components.
	registry := server.NewSessionRegistry()
	tracker := server.StartLocalTracker(jsonLogger, registry, jsonpbMarshaler, config.GetName())
@@ -96,7 +92,7 @@ func main() {
		multiLogger.Fatal("Failed initializing runtime modules", zap.Error(err))
	}
	pipeline := server.NewPipeline(config, db, registry, tracker, router, runtimePool)
	apiServer := server.StartApiServer(jsonLogger, db, config, registry, tracker, pipeline, runtimePool, jsonpbMarshaler, jsonpbUnmarshaler)
	apiServer := server.StartApiServer(jsonLogger, db, jsonpbMarshaler, jsonpbUnmarshaler, config, registry, tracker, router, pipeline, runtimePool)

	// Respect OS stop signals.
	c := make(chan os.Signal, 2)
+1 −1
Original line number Diff line number Diff line
@@ -9,5 +9,5 @@ import "github.com/gobuffalo/packr"
// Go binary. You can use the "packr clean" command to clean up this,
// and any other packr generated files.
func init() {
	packr.PackJSONBytes("./sql", "20180103142001_initial_schema.sql", "\"H4sIAAAAAAAA/6RXXZPaNhR951fc2YcGp+ZjSdJmsm1mHPAmnhCTYpNknxghX4y6tuRKMizt9L93ZBuwgWXTlslDLB2d+6Gje+/2nrfgOQxFtpUsXmkY9K9fQ7hC8Mk9SQk4uV4JqVpQ4MaMIlcYQc4jlKBXCE5G6Ap3OzZ8QamY4DDo9qFtAFfV1pV1Yyi2IoeUbIELDblC0CumYMkSBHygmGlgHKhIs4QRThE2TK8KOxVL13DcVRxioQnjQICKbAtiWQcC0ZXTK62zN73eZrPpksLZrpBxLylhqjf2hq4fuJ1Bt18dmPEElQKJf+RMYgSLLZAsSxgliwQhIRsQEkgsESPQwji8kUwzHtugxFJviERDEzGlJVvkupGvnXtMNQCCA+Fw5QTgBVfwzgm8wDYkX73ww2QWwldnOnX80HMDmExhOPFHXuhN/AAmt+D4d/DR80c2INMrlIAPmTQRCAnMZBKjIm0BYsOFpShdUhlStmQUEsLjnMQIsVij5IzHkKFMmTI3qoDwyNAkLGWa6GLpJC5jqNdqdTrwY8piSTTCLGsNp64TuhA678YueLfgT0Jwv3lBGBgNSAXtFgDA56n3yZnewUf3DtossuxWscwiqP1mM290+DJM/mw8tgukIeMkxXLvizMdfnCm7evBawtMzoJw6nh+WNqc78Dze9zCzPd+m7lHdBFTWUK285JyRzd49coq98maaCLnuUzq5g77nU4hPvWm19NCJKrLUC8L9a10mvQWNHv5cwE0iZ9rEh/5bdyGkXvrzMYhPEP+rKRNBC3S30QXZo1J7MZduAoIh1tJOGWKChuGzlVxVrMU/xQcL579TEo9hCxFaM8C+AGGhJOIWCVJippERJOS5N1d6Dr7C9m7+9ffz2D4wR1+hHaCPNar9u6YBb/Ai0G/37eO8o0pYcmeqe4cVBdU4jKi1EbI6Jz9pskd8mCyZFgSigsh7ueFtppCqVuKhYgTnFcKvIAjKVLkGqXBPo5TGkm6o7uAo7nSIn3aLkYxzqnIuTZfRttwchP9XU5q4Le/wkn2qUSicW4UYrLqva/RVQx1yNtThjyLnmKoQ84wrFGy5fYiQx1ShnEI9OT5mopdsZ0la0AeY2tZN62nStg8wjWj+GghM6u3k6nrvffL1eIQiyyYurfu1PWHblULC7x5i+FkNHkDEx9G7tgNXRg6wdAZuUdFsaGN02poJNSomP8qKKOYcyEpkUtqnoUNShONNmRCMVOTzoW6R/+XYE/YIlSa8aIA/p/87Z066irNFO7CqpK319AeZQzNzERkmqkSUoOQpiUKDlJs1JlncSD5vifRjPcxR4trOLz94JMzHhsrZ96GcXkpGfKo3bdsYHzNNLav9/+N2gPLhkUi6D1G7ReWDREmaNZfWjYQSVdsjVH7lVUmsuqcdU0cXdFTUuNCm3ZT9rRLD6g5CByPAueGgXntyGW0yhe/I9X73Wb3OUZTwTXyA7rZgy52weqo6UjXP51pglREWHdzf5XHbpefnQ74GBPN1ghrkuSogEiEYKs0piBRoVwX85+JEc24dsiJyYgNj/4M9Ww8LqRd8aWoFIlRnWkYxxX2e5qGEUanAwlTuqECVdgkxRWCXhFdxGT+ZKikaEZbfMjMeF6UIGnGb1hKkQKBmK2RgzeCNs2lEtLq7tTn+SP32wX1zSvNlP8eTPFoirPat4FFle/7MXckNrw1mk4+HzR+xsLNeci+2l7aL1vMBYS6af0TAAD//0vLM27QDQAA\"")
	packr.PackJSONBytes("./sql", "20180103142001_initial_schema.sql", "\"H4sIAAAAAAAA/6RWXXPaOBe+51ecycUb3NcBkra7nWa3M65xWk+pyWLTbq4YIR9sbWzJlWQou7P/fUe2AZuQZD+4wtKj53zo0Tln+KIHL8AVxVayJNVwNbp8A1GKEJB7khNwSp0KqXpQ4SaMIlcYQ8ljlKBTBKcgNMXdjg1fUComOFwNRtA3gLNm68y6NhRbUUJOtsCFhlIh6JQpWLEMAb9TLDQwDlTkRcYIpwgbptPKTsMyMBx3DYdYasI4EKCi2IJYtYFAdON0qnXxdjjcbDYDUjk7EDIZZjVMDSe+6wWhd3E1GDUH5jxDpUDit5JJjGG5BVIUGaNkmSFkZANCAkkkYgxaGIc3kmnGExuUWOkNkWhoYqa0ZMtSd/K1c4+pDkBwIBzOnBD88AzeO6Ef2obkqx99nM4j+OrMZk4Q+V4I0xm402DsR/40CGF6A05wB5/8YGwDMp2iBPxeSBOBkMBMJjGu0hYidlxYidolVSBlK0YhIzwpSYKQiDVKzngCBcqcKXOjCgiPDU3GcqaJrpYexGUMDXu9iwv4f84SSTTCvOi5M8+JPIic9xMP/BsIphF4v/phFBoNSAX9HgDA7cz/7Mzu4JN3B30WW3avWmYxtH7zuT8+fBmmYD6Z2BXSkHGSY733xZm5H51Z//LqjQUmZ2E0c/wgqm0uduDFPW5hHvi/zL0jupipIiPbRU25o7t6/dqq98maaCIXpcza5g77FxeV+NTb4VALkakBQ72q1JfqPBsuafHqxwpoEr/QJDny27gNY+/GmU8iOEd+XtNmglbp76Irs8YkDpIBnIWEw40knDJFhQ2uc1ad1SzH3wXHJ8/ekloPEcsR+vMQ/gcu4SQmVk2SoyYx0aQmeX8Xec7+Qvbu/vHnObgfPfcT9DPkiU77u2MW/AQvr0ajkXWUb8wJy/ZMbeeguaAaVxClNkLGp+x3Te6QB5M1w4pQXApxv6i01RVK21IiRJLholHgEziSI0WuURrs4zilkeQ7uidwtFRa5M/bxTjBBRUl1+bLaBse3MRol5MW+N3P8CD7VCLRuDAKMVn1P7ToGoY25N1DhrKIn2NoQ04wrFGy1fZJhjakDuMQ6IPnayp2w3aSrAN5jK1nXfeeK2GLGNeM4qOFzKzeTGee/yGoV6tDLLZg5t14My9wvaYWVnjzFqPpePoWpgGMvYkXeeA6oeuMvaOi2NHGw2poJNSpmP8oKKOYUyEpUUpqnoUNShONNhRCMVOTToW6R/+bYB+wxag041UB/C/52zt11FW6KdyF1SRvr6E9yhiam4nINFMlpAYhTUsUHKTYqBPP4kDy955EN97HHK2u4fD2w8/OZGKsnHgbxuWVZMjj/siygfE109i/3P+N+1eWDctM0HuM+y8tG2LM0Ky/smwgkqZsjXH/tVUnsumcbU0cXdFzUuNCm3ZT97QTamt0bHcqlBO6Nuyu+lbiCqWZ1cwVmLmlvgWVijKLISVrhCUih7EXurAsNbiC3ktBaHqu4FuJcguEk2yrUJrJzAynNMO1maW4KJN0cGIQOR5FOiNGO6YFix+fMXaP9DHOo2sul78h1fvdbo88RlPBNfIDutspn+zVzVHTNy9/ONGqqYix7eZecMdu158XFxBgQjRbI6xJVqICIhHUVmnMQaJCuca4DhHNTHlIiUmIDY/+DPN8MqnfX02Xo1IkQXWiqx23gec7WyXe9jg7FhveG8+mtwctn9Dx9WnIvqo+tV+3kicQ6rr3VwAAAP//T8C4JbgNAAA=\"")
	}
+5 −8
Original line number Diff line number Diff line
@@ -64,19 +64,16 @@ CREATE TABLE IF NOT EXISTS user_edge (
);

CREATE TABLE IF NOT EXISTS notification (
    PRIMARY KEY (id),
    id              UUID            NOT NULL,
    PRIMARY KEY (user_id, create_time ASC, id), -- Preferred sorting order should have been DESC but Cockroach's query analyser is not clever enough.
    id              UUID            CONSTRAINT notification_id_key UNIQUE NOT NULL,
    user_id         UUID            NOT NULL,
    subject         VARCHAR(255)    NOT NULL,
    content         BYTEA           DEFAULT '{}' CHECK (length(content) < 16000) NOT NULL,
    code            SMALLINT        NOT NULL,      -- Negative values are System reserved.
    sender_id       UUID,                          -- NULL for System messages
    create_time     BIGINT          CHECK (create_time > 0) NOT NULL,
    code            SMALLINT        NOT NULL,      -- Negative values are system reserved
    sender_id       UUID,                          -- NULL for system messages
    create_time     BIGINT          CHECK (create_time > 0) NOT NULL
);

-- list notifications for a user that are not deleted or expired, starting from a given ID (cursor).
CREATE INDEX IF NOT EXISTS notification_user_id_id_idx ON notification (user_id, id);

-- +migrate Down
DROP TABLE IF EXISTS notification;
DROP TABLE IF EXISTS user_edge;
+5 −1
Original line number Diff line number Diff line
@@ -51,11 +51,13 @@ type ApiServer struct {
	db                *sql.DB
	config            Config
	runtimePool       *RuntimePool
	tracker           Tracker
	router            MessageRouter
	grpcServer        *grpc.Server
	grpcGatewayServer *http.Server
}

func StartApiServer(logger *zap.Logger, db *sql.DB, config Config, registry *SessionRegistry, tracker Tracker, pipeline *pipeline, runtimePool *RuntimePool, jsonpbMarshaler *jsonpb.Marshaler, jsonpbUnmarshaler *jsonpb.Unmarshaler) *ApiServer {
func StartApiServer(logger *zap.Logger, db *sql.DB, jsonpbMarshaler *jsonpb.Marshaler, jsonpbUnmarshaler *jsonpb.Unmarshaler, config Config, registry *SessionRegistry, tracker Tracker, router MessageRouter, pipeline *pipeline, runtimePool *RuntimePool) *ApiServer {
	grpcServer := grpc.NewServer(
		grpc.StatsHandler(ocgrpc.NewServerStatsHandler()),
		grpc.UnaryInterceptor(SecurityInterceptorFunc(logger, config)),
@@ -66,6 +68,8 @@ func StartApiServer(logger *zap.Logger, db *sql.DB, config Config, registry *Ses
		db:          db,
		config:      config,
		runtimePool: runtimePool,
		tracker:     tracker,
		router:      router,
		grpcServer:  grpcServer,
	}

+7 −6
Original line number Diff line number Diff line
@@ -15,15 +15,16 @@
package server

import (
	"golang.org/x/net/context"
	"github.com/heroiclabs/nakama/api"
	"regexp"
	"google.golang.org/grpc/codes"
	"google.golang.org/grpc/status"
	"math/rand"
	"regexp"
	"strings"
	"time"

	"github.com/dgrijalva/jwt-go"
	"strings"
	"github.com/heroiclabs/nakama/api"
	"golang.org/x/net/context"
	"google.golang.org/grpc/codes"
	"google.golang.org/grpc/status"
)

var (
Loading