Feature/multi tenant (#377)

* [feature] Add tenantManager

* [fix] Fix export

* [schema] Change schema for tenants

* [de] For auth

* [config] Remove unused secret.browser param to unify with multitenancy

* [feature] Add OperationContext to store state of request

* [log] Remove docId and userId from log message

* [feature] Add OperationContext class

* [feature] For logging

* [feature] Add content to some methods

* [feature] For multitenancy

* [feature] For multitenancy

* [feature] For multitenancy

* [feature] For multitenancy

* [feature] For multitenancy

* [feature] For multitenancy

* [feature] Move all tenant logic to tenantManager

* [feature] Fix reading of tenant license

* [feature] Move tenant logic to EditorData interface

* [feature] Use context in SQL queries

* [feature] Refactoring

* [feature] Fix editorDataMemory

* [feature] Fix before merge
This commit is contained in:
Sergey Konovalov
2022-08-02 17:34:06 +03:00
committed by GitHub
parent 0c215cefa9
commit 41399fa3d4
32 changed files with 2159 additions and 1661 deletions

View File

@ -26,6 +26,7 @@ USE onlyoffice;
--
CREATE TABLE IF NOT EXISTS `doc_changes` (
`tenant` varchar(255) NOT NULL,
`id` varchar(255) NOT NULL,
`change_id` int(10) unsigned NOT NULL,
`user_id` varchar(255) NOT NULL,
@ -33,7 +34,7 @@ CREATE TABLE IF NOT EXISTS `doc_changes` (
`user_name` varchar(255) NOT NULL,
`change_data` longtext NOT NULL,
`change_date` datetime NOT NULL,
PRIMARY KEY (`id`,`change_id`)
PRIMARY KEY (`tenant`, `id`,`change_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
@ -48,6 +49,7 @@ CREATE TABLE IF NOT EXISTS `doc_changes` (
--
CREATE TABLE IF NOT EXISTS `task_result` (
`tenant` varchar(255) NOT NULL,
`id` varchar(255) NOT NULL,
`status` tinyint(3) NOT NULL,
`status_info` int(10) NOT NULL,
@ -59,7 +61,7 @@ CREATE TABLE IF NOT EXISTS `task_result` (
`baseurl` text NOT NULL,
`password` longtext NULL,
`additional` longtext NULL,
PRIMARY KEY (`id`)
PRIMARY KEY (`tenant`, `id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--

View File

@ -8,6 +8,7 @@
-- Table structure for doc_changes
-- ----------------------------
CREATE TABLE IF NOT EXISTS "public"."doc_changes" (
"tenant" varchar(255) COLLATE "default" NOT NULL,
"id" varchar(255) COLLATE "default" NOT NULL,
"change_id" int4 NOT NULL,
"user_id" varchar(255) COLLATE "default" NOT NULL,
@ -15,7 +16,7 @@ CREATE TABLE IF NOT EXISTS "public"."doc_changes" (
"user_name" varchar(255) COLLATE "default" NOT NULL,
"change_data" text COLLATE "default" NOT NULL,
"change_date" timestamp without time zone NOT NULL,
PRIMARY KEY ("id", "change_id")
PRIMARY KEY ("tenant", "id", "change_id")
)
WITH (OIDS=FALSE);
@ -23,6 +24,7 @@ WITH (OIDS=FALSE);
-- Table structure for task_result
-- ----------------------------
CREATE TABLE IF NOT EXISTS "public"."task_result" (
"tenant" varchar(255) COLLATE "default" NOT NULL,
"id" varchar(255) COLLATE "default" NOT NULL,
"status" int2 NOT NULL,
"status_info" int4 NOT NULL,
@ -34,11 +36,11 @@ CREATE TABLE IF NOT EXISTS "public"."task_result" (
"baseurl" text COLLATE "default" NOT NULL,
"password" text COLLATE "default" NULL,
"additional" text COLLATE "default" NULL,
PRIMARY KEY ("id")
PRIMARY KEY ("tenant", "id")
)
WITH (OIDS=FALSE);
CREATE OR REPLACE FUNCTION merge_db(_id varchar(255), _status int2, _status_info int4, _last_open_date timestamp without time zone, _user_index int4, _change_id int4, _callback text, _baseurl text, OUT isupdate char(5), OUT userindex int4) AS
CREATE OR REPLACE FUNCTION merge_db(_tetant varchar(255), _id varchar(255), _status int2, _status_info int4, _last_open_date timestamp without time zone, _user_index int4, _change_id int4, _callback text, _baseurl text, OUT isupdate char(5), OUT userindex int4) AS
$$
DECLARE
t_var "public"."task_result"."user_index"%TYPE;
@ -47,9 +49,9 @@ BEGIN
-- first try to update the key
-- note that "a" must be unique
IF ((_callback <> '') IS TRUE) AND ((_baseurl <> '') IS TRUE) THEN
UPDATE "public"."task_result" SET last_open_date=_last_open_date, user_index=user_index+1,callback=_callback,baseurl=_baseurl WHERE id = _id RETURNING user_index into userindex;
UPDATE "public"."task_result" SET last_open_date=_last_open_date, user_index=user_index+1,callback=_callback,baseurl=_baseurl WHERE tenant = _tetant AND id = _id RETURNING user_index into userindex;
ELSE
UPDATE "public"."task_result" SET last_open_date=_last_open_date, user_index=user_index+1 WHERE id = _id RETURNING user_index into userindex;
UPDATE "public"."task_result" SET last_open_date=_last_open_date, user_index=user_index+1 WHERE tenant = _tetant AND id = _id RETURNING user_index into userindex;
END IF;
IF found THEN
isupdate := 'true';
@ -59,7 +61,7 @@ BEGIN
-- if someone else inserts the same key concurrently,
-- we could get a unique-key failure
BEGIN
INSERT INTO "public"."task_result"(id, status, status_info, last_open_date, user_index, change_id, callback, baseurl) VALUES(_id, _status, _status_info, _last_open_date, _user_index, _change_id, _callback, _baseurl) RETURNING user_index into userindex;
INSERT INTO "public"."task_result"(id, status, status_info, last_open_date, user_index, change_id, callback, baseurl) VALUES(_tetant, _id, _status, _status_info, _last_open_date, _user_index, _change_id, _callback, _baseurl) RETURNING user_index into userindex;
isupdate := 'false';
RETURN;
EXCEPTION WHEN unique_violation THEN