aboutsummaryrefslogtreecommitdiff
path: root/server-v1/source/EpistmoolServer/Protocol/Command.hpp
blob: 9ec97863eac7e301165242709740bde6fb579c4e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#pragma once

#include "all_fwd.hpp"

#include <QLatin1String>
#include <QVersionNumber>
#include <cstddef>
#include <memory>

class QJsonObject;

namespace Epistmool::Server {

// Note: not all message kinds have a corresponding reply format. In such case the Kind enum is prefixed with 'Notification'.
class ProtocolMessage
{
	Q_GADGET

public:
	struct KindTrait
	{
		bool isC2S;
		bool hasReply;
	};

	enum Kind
	{
		SessionAuth,
		SessionDestroy,

		WorkspaceCreate,
		WorkspaceOpen,
		WorkspaceFetchIndex,

		WorkspaceFetchKnowledge,
		WorkspaceUpdateKnowledge,
		WorkspaceCreateKnowledge,
		WorkspaceDeleteKnowledge,

		WorkspaceFetchKeyword,
		WorkspaceUpdateKeyword,
		WorkspaceCreateKeyword,
		WorkspaceDeleteKeyword,

		NotificationWorkspaceUpdated,
		NotificationKnowledgeUpdated,

		KindCOUNT,
	};
	Q_ENUM(Kind)

	static std::unique_ptr<ProtocolRequest> createRequest(Kind kind);
	static std::unique_ptr<ProtocolReply> createReply(Kind kind);
	static const KindTrait& getKindTrait(Kind kind);

	enum Variant
	{
		RequestVariant,
		ReplyVariant,
	};
	Q_ENUM(Variant)

public:
	Kind kind;
	Variant variant;

public:
	ProtocolMessage(Kind kind, Variant variant);
	virtual ~ProtocolMessage() = default;

protected:
	virtual void serializeFields(QJsonObject& object) const = 0;
	virtual void deserializeFields(const QJsonObject& object) = 0;
};

struct ProtocolRequest : public ProtocolMessage
{
	ProtocolRequest(Kind kind);
	static QJsonObject serialize(const ProtocolRequest& msg);
	static std::unique_ptr<ProtocolRequest> deserialize(const QJsonObject& object);
};

struct ProtocolReply : public ProtocolMessage
{
	int sequence;

	ProtocolReply(Kind kind);
	static QJsonObject serialize(const ProtocolReply& msg);
	static std::unique_ptr<ProtocolReply> deserialize(const QJsonObject& object);
};

// ===========================
// Individual messages classes

struct ProtocolRequest_SessionAuth : public ProtocolRequest
{
	int theSession;
	bool createIfInvalid;

	ProtocolRequest_SessionAuth();

protected:
	virtual void serializeFields(QJsonObject& object) const override;
	virtual void deserializeFields(const QJsonObject& object) override;
};

struct ProtocolReply_SessionAuth : public ProtocolReply
{
	/// The same value as provided in the request message.
	/// If \l ProcotolCommandSessionAuth::createIfValid is set and the given session is invalid, a new session is created and written here instead of the original value.
	int theSession;

	ProtocolReply_SessionAuth();

protected:
	virtual void serializeFields(QJsonObject& object) const override;
	virtual void deserializeFields(const QJsonObject& object) override;
};

struct ProtocolNotification_WorkspaceUpdate : public ProtocolRequest
{
};

} // namespace Epistmool::Server