UserPermission and GroupPermission models (#5860)
* fix: rename to group_permissions * fix: delete null collectionId records before setting non null constraint * fix: use scope with collectionId not null * fix: update model with documentId * fix: rename to GroupPermission * fix: rename collection_users to user_permissions * fix: teamPermanentDeleter test * fix: use scope with collectionId not null * fix: update model with documentId * fix: rename to UserPermission * fix: create views upon table rename for zero downtime * fix: remove comments
This commit is contained in:
@@ -18,8 +18,8 @@ import {
|
|||||||
Revision,
|
Revision,
|
||||||
View,
|
View,
|
||||||
Share,
|
Share,
|
||||||
CollectionUser,
|
UserPermission,
|
||||||
CollectionGroup,
|
GroupPermission,
|
||||||
GroupUser,
|
GroupUser,
|
||||||
Comment,
|
Comment,
|
||||||
} from "@server/models";
|
} from "@server/models";
|
||||||
@@ -426,7 +426,7 @@ export default class DeliverWebhookTask extends BaseTask<Props> {
|
|||||||
subscription: WebhookSubscription,
|
subscription: WebhookSubscription,
|
||||||
event: CollectionUserEvent
|
event: CollectionUserEvent
|
||||||
): Promise<void> {
|
): Promise<void> {
|
||||||
const model = await CollectionUser.scope([
|
const model = await UserPermission.scope([
|
||||||
"withUser",
|
"withUser",
|
||||||
"withCollection",
|
"withCollection",
|
||||||
]).findOne({
|
]).findOne({
|
||||||
@@ -443,7 +443,7 @@ export default class DeliverWebhookTask extends BaseTask<Props> {
|
|||||||
payload: {
|
payload: {
|
||||||
id: `${event.userId}-${event.collectionId}`,
|
id: `${event.userId}-${event.collectionId}`,
|
||||||
model: model && presentMembership(model),
|
model: model && presentMembership(model),
|
||||||
collection: model && presentCollection(model.collection),
|
collection: model && presentCollection(model.collection!),
|
||||||
user: model && presentUser(model.user),
|
user: model && presentUser(model.user),
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
@@ -453,7 +453,7 @@ export default class DeliverWebhookTask extends BaseTask<Props> {
|
|||||||
subscription: WebhookSubscription,
|
subscription: WebhookSubscription,
|
||||||
event: CollectionGroupEvent
|
event: CollectionGroupEvent
|
||||||
): Promise<void> {
|
): Promise<void> {
|
||||||
const model = await CollectionGroup.scope([
|
const model = await GroupPermission.scope([
|
||||||
"withGroup",
|
"withGroup",
|
||||||
"withCollection",
|
"withCollection",
|
||||||
]).findOne({
|
]).findOne({
|
||||||
@@ -470,7 +470,7 @@ export default class DeliverWebhookTask extends BaseTask<Props> {
|
|||||||
payload: {
|
payload: {
|
||||||
id: `${event.modelId}-${event.collectionId}`,
|
id: `${event.modelId}-${event.collectionId}`,
|
||||||
model: model && presentCollectionGroupMembership(model),
|
model: model && presentCollectionGroupMembership(model),
|
||||||
collection: model && presentCollection(model.collection),
|
collection: model && presentCollection(model.collection!),
|
||||||
group: model && presentGroup(model.group),
|
group: model && presentGroup(model.group),
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { CollectionPermission, UserRole } from "@shared/types";
|
import { CollectionPermission, UserRole } from "@shared/types";
|
||||||
import { CollectionUser } from "@server/models";
|
import { UserPermission } from "@server/models";
|
||||||
import { buildUser, buildAdmin, buildCollection } from "@server/test/factories";
|
import { buildUser, buildAdmin, buildCollection } from "@server/test/factories";
|
||||||
import userDemoter from "./userDemoter";
|
import userDemoter from "./userDemoter";
|
||||||
|
|
||||||
@@ -11,7 +11,7 @@ describe("userDemoter", () => {
|
|||||||
const user = await buildUser({ teamId: admin.teamId });
|
const user = await buildUser({ teamId: admin.teamId });
|
||||||
const collection = await buildCollection({ teamId: admin.teamId });
|
const collection = await buildCollection({ teamId: admin.teamId });
|
||||||
|
|
||||||
const membership = await CollectionUser.create({
|
const membership = await UserPermission.create({
|
||||||
createdById: admin.id,
|
createdById: admin.id,
|
||||||
userId: user.id,
|
userId: user.id,
|
||||||
collectionId: collection.id,
|
collectionId: collection.id,
|
||||||
|
|||||||
196
server/migrations/20230921071140-rename-collection-groups.js
Normal file
196
server/migrations/20230921071140-rename-collection-groups.js
Normal file
@@ -0,0 +1,196 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
const { Op } = require("sequelize");
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
async up(queryInterface, Sequelize) {
|
||||||
|
await queryInterface.sequelize.transaction(async (transaction) => {
|
||||||
|
await queryInterface.sequelize.query(
|
||||||
|
`DROP VIEW IF EXISTS group_permissions`,
|
||||||
|
{ transaction }
|
||||||
|
);
|
||||||
|
await queryInterface.sequelize.query(
|
||||||
|
`ALTER INDEX "collection_groups_collection_id_group_id" RENAME TO "group_permissions_collection_id_group_id"`,
|
||||||
|
{ transaction }
|
||||||
|
);
|
||||||
|
await queryInterface.sequelize.query(
|
||||||
|
`ALTER INDEX "collection_groups_deleted_at" RENAME TO "group_permissions_deleted_at"`,
|
||||||
|
{ transaction }
|
||||||
|
);
|
||||||
|
await queryInterface.sequelize.query(
|
||||||
|
`ALTER INDEX "collection_groups_group_id" RENAME TO "group_permissions_group_id"`,
|
||||||
|
{ transaction }
|
||||||
|
);
|
||||||
|
|
||||||
|
await queryInterface.sequelize.query(
|
||||||
|
`ALTER TABLE ONLY collection_groups RENAME CONSTRAINT "collection_groups_collectionId_fkey" TO "group_permissions_collectionId_fkey"`,
|
||||||
|
{ transaction }
|
||||||
|
);
|
||||||
|
await queryInterface.sequelize.query(
|
||||||
|
`ALTER TABLE ONLY collection_groups RENAME CONSTRAINT "collection_groups_createdById_fkey" TO "group_permissions_createdById_fkey"`,
|
||||||
|
{ transaction }
|
||||||
|
);
|
||||||
|
await queryInterface.sequelize.query(
|
||||||
|
`ALTER TABLE ONLY collection_groups RENAME CONSTRAINT "collection_groups_groupId_fkey" TO "group_permissions_groupId_fkey"`,
|
||||||
|
{ transaction }
|
||||||
|
);
|
||||||
|
await queryInterface.addColumn(
|
||||||
|
"collection_groups",
|
||||||
|
"documentId",
|
||||||
|
{
|
||||||
|
type: Sequelize.UUID,
|
||||||
|
allowNull: true,
|
||||||
|
onDelete: "set null",
|
||||||
|
references: {
|
||||||
|
model: "documents",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{ transaction }
|
||||||
|
);
|
||||||
|
await queryInterface.sequelize.query(
|
||||||
|
`ALTER TABLE ONLY collection_groups RENAME CONSTRAINT "collection_groups_documentId_fkey" TO "group_permissions_documentId_fkey"`,
|
||||||
|
{ transaction }
|
||||||
|
);
|
||||||
|
await queryInterface.removeConstraint(
|
||||||
|
"collection_groups",
|
||||||
|
"group_permissions_collectionId_fkey",
|
||||||
|
{ transaction }
|
||||||
|
);
|
||||||
|
await queryInterface.addConstraint("collection_groups", {
|
||||||
|
fields: ["collectionId"],
|
||||||
|
name: "group_permissions_collectionId_fkey",
|
||||||
|
type: "foreign key",
|
||||||
|
onDelete: "set null",
|
||||||
|
references: {
|
||||||
|
table: "collections",
|
||||||
|
field: "id",
|
||||||
|
},
|
||||||
|
transaction,
|
||||||
|
});
|
||||||
|
await queryInterface.changeColumn(
|
||||||
|
"collection_groups",
|
||||||
|
"collectionId",
|
||||||
|
{
|
||||||
|
type: Sequelize.UUID,
|
||||||
|
allowNull: true,
|
||||||
|
},
|
||||||
|
{ transaction }
|
||||||
|
);
|
||||||
|
await queryInterface.removeConstraint(
|
||||||
|
"collection_groups",
|
||||||
|
"group_permissions_createdById_fkey",
|
||||||
|
{ transaction }
|
||||||
|
);
|
||||||
|
await queryInterface.addConstraint("collection_groups", {
|
||||||
|
fields: ["createdById"],
|
||||||
|
name: "group_permissions_createdById_fkey",
|
||||||
|
type: "foreign key",
|
||||||
|
onDelete: "set null",
|
||||||
|
references: {
|
||||||
|
table: "users",
|
||||||
|
field: "id",
|
||||||
|
},
|
||||||
|
transaction,
|
||||||
|
});
|
||||||
|
await queryInterface.renameTable(
|
||||||
|
"collection_groups",
|
||||||
|
"group_permissions",
|
||||||
|
{ transaction }
|
||||||
|
);
|
||||||
|
await queryInterface.sequelize.query(
|
||||||
|
`CREATE VIEW collection_groups AS SELECT * FROM group_permissions`,
|
||||||
|
{ transaction }
|
||||||
|
);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
async down(queryInterface, Sequelize) {
|
||||||
|
await queryInterface.sequelize.transaction(async (transaction) => {
|
||||||
|
await queryInterface.sequelize.query(
|
||||||
|
`DROP VIEW IF EXISTS collection_groups`,
|
||||||
|
{ transaction }
|
||||||
|
);
|
||||||
|
await queryInterface.sequelize.query(
|
||||||
|
`ALTER INDEX "group_permissions_collection_id_group_id" RENAME TO "collection_groups_collection_id_group_id"`,
|
||||||
|
{ transaction }
|
||||||
|
);
|
||||||
|
await queryInterface.sequelize.query(
|
||||||
|
`ALTER INDEX "group_permissions_deleted_at" RENAME TO "collection_groups_deleted_at"`,
|
||||||
|
{ transaction }
|
||||||
|
);
|
||||||
|
await queryInterface.sequelize.query(
|
||||||
|
`ALTER INDEX "group_permissions_group_id" RENAME TO "collection_groups_group_id"`,
|
||||||
|
{ transaction }
|
||||||
|
);
|
||||||
|
await queryInterface.sequelize.query(
|
||||||
|
`ALTER TABLE ONLY group_permissions RENAME CONSTRAINT "group_permissions_collectionId_fkey" TO "collection_groups_collectionId_fkey"`,
|
||||||
|
{ transaction }
|
||||||
|
);
|
||||||
|
await queryInterface.sequelize.query(
|
||||||
|
`ALTER TABLE ONLY group_permissions RENAME CONSTRAINT "group_permissions_createdById_fkey" TO "collection_groups_createdById_fkey"`,
|
||||||
|
{ transaction }
|
||||||
|
);
|
||||||
|
await queryInterface.sequelize.query(
|
||||||
|
`ALTER TABLE ONLY group_permissions RENAME CONSTRAINT "group_permissions_groupId_fkey" TO "collection_groups_groupId_fkey"`,
|
||||||
|
{ transaction }
|
||||||
|
);
|
||||||
|
await queryInterface.removeColumn("group_permissions", "documentId", {
|
||||||
|
transaction,
|
||||||
|
});
|
||||||
|
await queryInterface.removeConstraint(
|
||||||
|
"group_permissions",
|
||||||
|
"collection_groups_collectionId_fkey",
|
||||||
|
{ transaction }
|
||||||
|
);
|
||||||
|
await queryInterface.addConstraint("group_permissions", {
|
||||||
|
fields: ["collectionId"],
|
||||||
|
name: "collection_groups_collectionId_fkey",
|
||||||
|
type: "foreign key",
|
||||||
|
onDelete: "cascade",
|
||||||
|
references: {
|
||||||
|
table: "collections",
|
||||||
|
field: "id",
|
||||||
|
},
|
||||||
|
transaction,
|
||||||
|
});
|
||||||
|
// Delete records where collectionId is null before setting back non null constraint
|
||||||
|
await queryInterface.sequelize.query(
|
||||||
|
`DELETE FROM group_permissions WHERE "collectionId" IS NULL`,
|
||||||
|
{ transaction }
|
||||||
|
);
|
||||||
|
await queryInterface.changeColumn(
|
||||||
|
"group_permissions",
|
||||||
|
"collectionId",
|
||||||
|
{
|
||||||
|
type: Sequelize.UUID,
|
||||||
|
allowNull: false,
|
||||||
|
},
|
||||||
|
{ transaction }
|
||||||
|
);
|
||||||
|
await queryInterface.removeConstraint(
|
||||||
|
"group_permissions",
|
||||||
|
"collection_groups_createdById_fkey",
|
||||||
|
{ transaction }
|
||||||
|
);
|
||||||
|
await queryInterface.addConstraint("group_permissions", {
|
||||||
|
fields: ["createdById"],
|
||||||
|
name: "collection_groups_createdById_fkey",
|
||||||
|
type: "foreign key",
|
||||||
|
references: {
|
||||||
|
table: "users",
|
||||||
|
field: "id",
|
||||||
|
},
|
||||||
|
transaction,
|
||||||
|
});
|
||||||
|
await queryInterface.renameTable(
|
||||||
|
"group_permissions",
|
||||||
|
"collection_groups",
|
||||||
|
{ transaction }
|
||||||
|
);
|
||||||
|
await queryInterface.sequelize.query(
|
||||||
|
`CREATE VIEW group_permissions AS SELECT * FROM collection_groups`,
|
||||||
|
{ transaction }
|
||||||
|
);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
};
|
||||||
183
server/migrations/20230922105047-rename-collection-users.js
Normal file
183
server/migrations/20230922105047-rename-collection-users.js
Normal file
@@ -0,0 +1,183 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
const { Op } = require("sequelize");
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
async up(queryInterface, Sequelize) {
|
||||||
|
await queryInterface.sequelize.transaction(async (transaction) => {
|
||||||
|
await queryInterface.sequelize.query(
|
||||||
|
`DROP VIEW IF EXISTS user_permissions`,
|
||||||
|
{ transaction }
|
||||||
|
);
|
||||||
|
await queryInterface.sequelize.query(
|
||||||
|
`ALTER INDEX "collection_users_collection_id_user_id" RENAME TO "user_permissions_collection_id_user_id"`,
|
||||||
|
{ transaction }
|
||||||
|
);
|
||||||
|
await queryInterface.sequelize.query(
|
||||||
|
`ALTER INDEX "collection_users_user_id" RENAME TO "user_permissions_user_id"`,
|
||||||
|
{ transaction }
|
||||||
|
);
|
||||||
|
await queryInterface.sequelize.query(
|
||||||
|
`ALTER TABLE ONLY collection_users RENAME CONSTRAINT "collection_users_collectionId_fkey" TO "user_permissions_collectionId_fkey"`,
|
||||||
|
{ transaction }
|
||||||
|
);
|
||||||
|
await queryInterface.sequelize.query(
|
||||||
|
`ALTER TABLE ONLY collection_users RENAME CONSTRAINT "collection_users_createdById_fkey" TO "user_permissions_createdById_fkey"`,
|
||||||
|
{ transaction }
|
||||||
|
);
|
||||||
|
await queryInterface.sequelize.query(
|
||||||
|
`ALTER TABLE ONLY collection_users RENAME CONSTRAINT "collection_users_userId_fkey" TO "user_permissions_userId_fkey"`,
|
||||||
|
{ transaction }
|
||||||
|
);
|
||||||
|
await queryInterface.addColumn(
|
||||||
|
"collection_users",
|
||||||
|
"documentId",
|
||||||
|
{
|
||||||
|
type: Sequelize.UUID,
|
||||||
|
allowNull: true,
|
||||||
|
onDelete: "set null",
|
||||||
|
references: {
|
||||||
|
model: "documents",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{ transaction }
|
||||||
|
);
|
||||||
|
await queryInterface.sequelize.query(
|
||||||
|
`ALTER TABLE ONLY collection_users RENAME CONSTRAINT "collection_users_documentId_fkey" TO "user_permissions_documentId_fkey"`,
|
||||||
|
{ transaction }
|
||||||
|
);
|
||||||
|
await queryInterface.removeConstraint(
|
||||||
|
"collection_users",
|
||||||
|
"user_permissions_collectionId_fkey",
|
||||||
|
{ transaction }
|
||||||
|
);
|
||||||
|
await queryInterface.addConstraint("collection_users", {
|
||||||
|
fields: ["collectionId"],
|
||||||
|
name: "user_permissions_collectionId_fkey",
|
||||||
|
type: "foreign key",
|
||||||
|
onDelete: "set null",
|
||||||
|
references: {
|
||||||
|
table: "collections",
|
||||||
|
field: "id",
|
||||||
|
},
|
||||||
|
transaction,
|
||||||
|
});
|
||||||
|
await queryInterface.changeColumn(
|
||||||
|
"collection_users",
|
||||||
|
"collectionId",
|
||||||
|
{
|
||||||
|
type: Sequelize.UUID,
|
||||||
|
allowNull: true,
|
||||||
|
},
|
||||||
|
{ transaction }
|
||||||
|
);
|
||||||
|
await queryInterface.removeConstraint(
|
||||||
|
"collection_users",
|
||||||
|
"user_permissions_createdById_fkey",
|
||||||
|
{ transaction }
|
||||||
|
);
|
||||||
|
await queryInterface.addConstraint("collection_users", {
|
||||||
|
fields: ["createdById"],
|
||||||
|
name: "user_permissions_createdById_fkey",
|
||||||
|
type: "foreign key",
|
||||||
|
onDelete: "set null",
|
||||||
|
references: {
|
||||||
|
table: "users",
|
||||||
|
field: "id",
|
||||||
|
},
|
||||||
|
transaction,
|
||||||
|
});
|
||||||
|
await queryInterface.renameTable("collection_users", "user_permissions", {
|
||||||
|
transaction,
|
||||||
|
});
|
||||||
|
await queryInterface.sequelize.query(
|
||||||
|
`CREATE VIEW collection_users AS SELECT * FROM user_permissions`,
|
||||||
|
{ transaction }
|
||||||
|
);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
async down(queryInterface, Sequelize) {
|
||||||
|
await queryInterface.sequelize.transaction(async (transaction) => {
|
||||||
|
await queryInterface.sequelize.query(
|
||||||
|
`DROP VIEW IF EXISTS collection_users`,
|
||||||
|
{ transaction }
|
||||||
|
);
|
||||||
|
await queryInterface.sequelize.query(
|
||||||
|
`ALTER INDEX "user_permissions_collection_id_user_id" RENAME TO "collection_users_collection_id_user_id"`,
|
||||||
|
{ transaction }
|
||||||
|
);
|
||||||
|
await queryInterface.sequelize.query(
|
||||||
|
`ALTER INDEX "user_permissions_user_id" RENAME TO "collection_users_user_id"`,
|
||||||
|
{ transaction }
|
||||||
|
);
|
||||||
|
await queryInterface.sequelize.query(
|
||||||
|
`ALTER TABLE ONLY user_permissions RENAME CONSTRAINT "user_permissions_collectionId_fkey" TO "collection_users_collectionId_fkey"`,
|
||||||
|
{ transaction }
|
||||||
|
);
|
||||||
|
await queryInterface.sequelize.query(
|
||||||
|
`ALTER TABLE ONLY user_permissions RENAME CONSTRAINT "user_permissions_createdById_fkey" TO "collection_users_createdById_fkey"`,
|
||||||
|
{ transaction }
|
||||||
|
);
|
||||||
|
await queryInterface.sequelize.query(
|
||||||
|
`ALTER TABLE ONLY user_permissions RENAME CONSTRAINT "user_permissions_userId_fkey" TO "collection_users_userId_fkey"`,
|
||||||
|
{ transaction }
|
||||||
|
);
|
||||||
|
await queryInterface.removeColumn("user_permissions", "documentId", {
|
||||||
|
transaction,
|
||||||
|
});
|
||||||
|
await queryInterface.removeConstraint(
|
||||||
|
"user_permissions",
|
||||||
|
"collection_users_collectionId_fkey",
|
||||||
|
{ transaction }
|
||||||
|
);
|
||||||
|
await queryInterface.addConstraint("user_permissions", {
|
||||||
|
fields: ["collectionId"],
|
||||||
|
name: "collection_users_collectionId_fkey",
|
||||||
|
type: "foreign key",
|
||||||
|
onDelete: "cascade",
|
||||||
|
references: {
|
||||||
|
table: "collections",
|
||||||
|
field: "id",
|
||||||
|
},
|
||||||
|
transaction,
|
||||||
|
});
|
||||||
|
// Delete records where collectionId is null before setting back non null constraint
|
||||||
|
await queryInterface.sequelize.query(
|
||||||
|
`DELETE FROM user_permissions WHERE "collectionId" IS NULL`,
|
||||||
|
{ transaction }
|
||||||
|
);
|
||||||
|
await queryInterface.changeColumn(
|
||||||
|
"user_permissions",
|
||||||
|
"collectionId",
|
||||||
|
{
|
||||||
|
type: Sequelize.UUID,
|
||||||
|
allowNull: false,
|
||||||
|
},
|
||||||
|
{ transaction }
|
||||||
|
);
|
||||||
|
await queryInterface.removeConstraint(
|
||||||
|
"user_permissions",
|
||||||
|
"collection_users_createdById_fkey",
|
||||||
|
{ transaction }
|
||||||
|
);
|
||||||
|
await queryInterface.addConstraint("user_permissions", {
|
||||||
|
fields: ["createdById"],
|
||||||
|
name: "collection_users_createdById_fkey",
|
||||||
|
type: "foreign key",
|
||||||
|
references: {
|
||||||
|
table: "users",
|
||||||
|
field: "id",
|
||||||
|
},
|
||||||
|
transaction,
|
||||||
|
});
|
||||||
|
await queryInterface.renameTable("user_permissions", "collection_users", {
|
||||||
|
transaction,
|
||||||
|
});
|
||||||
|
await queryInterface.sequelize.query(
|
||||||
|
`CREATE VIEW user_permissions AS SELECT * FROM collection_users`,
|
||||||
|
{ transaction }
|
||||||
|
);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
};
|
||||||
@@ -30,14 +30,14 @@ import { sortNavigationNodes } from "@shared/utils/collections";
|
|||||||
import slugify from "@shared/utils/slugify";
|
import slugify from "@shared/utils/slugify";
|
||||||
import { SLUG_URL_REGEX } from "@shared/utils/urlHelpers";
|
import { SLUG_URL_REGEX } from "@shared/utils/urlHelpers";
|
||||||
import { CollectionValidation } from "@shared/validations";
|
import { CollectionValidation } from "@shared/validations";
|
||||||
import CollectionGroup from "./CollectionGroup";
|
|
||||||
import CollectionUser from "./CollectionUser";
|
|
||||||
import Document from "./Document";
|
import Document from "./Document";
|
||||||
import FileOperation from "./FileOperation";
|
import FileOperation from "./FileOperation";
|
||||||
import Group from "./Group";
|
import Group from "./Group";
|
||||||
|
import GroupPermission from "./GroupPermission";
|
||||||
import GroupUser from "./GroupUser";
|
import GroupUser from "./GroupUser";
|
||||||
import Team from "./Team";
|
import Team from "./Team";
|
||||||
import User from "./User";
|
import User from "./User";
|
||||||
|
import UserPermission from "./UserPermission";
|
||||||
import ParanoidModel from "./base/ParanoidModel";
|
import ParanoidModel from "./base/ParanoidModel";
|
||||||
import Fix from "./decorators/Fix";
|
import Fix from "./decorators/Fix";
|
||||||
import IsHexColor from "./validators/IsHexColor";
|
import IsHexColor from "./validators/IsHexColor";
|
||||||
@@ -48,13 +48,23 @@ import NotContainsUrl from "./validators/NotContainsUrl";
|
|||||||
withAllMemberships: {
|
withAllMemberships: {
|
||||||
include: [
|
include: [
|
||||||
{
|
{
|
||||||
model: CollectionUser,
|
model: UserPermission,
|
||||||
as: "memberships",
|
as: "memberships",
|
||||||
|
where: {
|
||||||
|
collectionId: {
|
||||||
|
[Op.ne]: null,
|
||||||
|
},
|
||||||
|
},
|
||||||
required: false,
|
required: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
model: CollectionGroup,
|
model: GroupPermission,
|
||||||
as: "collectionGroupMemberships",
|
as: "collectionGroupMemberships",
|
||||||
|
where: {
|
||||||
|
collectionId: {
|
||||||
|
[Op.ne]: null,
|
||||||
|
},
|
||||||
|
},
|
||||||
required: false,
|
required: false,
|
||||||
// use of "separate" property: sequelize breaks when there are
|
// use of "separate" property: sequelize breaks when there are
|
||||||
// nested "includes" with alternating values for "required"
|
// nested "includes" with alternating values for "required"
|
||||||
@@ -92,16 +102,24 @@ import NotContainsUrl from "./validators/NotContainsUrl";
|
|||||||
withMembership: (userId: string) => ({
|
withMembership: (userId: string) => ({
|
||||||
include: [
|
include: [
|
||||||
{
|
{
|
||||||
model: CollectionUser,
|
model: UserPermission,
|
||||||
as: "memberships",
|
as: "memberships",
|
||||||
where: {
|
where: {
|
||||||
userId,
|
userId,
|
||||||
|
collectionId: {
|
||||||
|
[Op.ne]: null,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
required: false,
|
required: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
model: CollectionGroup,
|
model: GroupPermission,
|
||||||
as: "collectionGroupMemberships",
|
as: "collectionGroupMemberships",
|
||||||
|
where: {
|
||||||
|
collectionId: {
|
||||||
|
[Op.ne]: null,
|
||||||
|
},
|
||||||
|
},
|
||||||
required: false,
|
required: false,
|
||||||
// use of "separate" property: sequelize breaks when there are
|
// use of "separate" property: sequelize breaks when there are
|
||||||
// nested "includes" with alternating values for "required"
|
// nested "includes" with alternating values for "required"
|
||||||
@@ -257,7 +275,7 @@ class Collection extends ParanoidModel {
|
|||||||
model: Collection,
|
model: Collection,
|
||||||
options: { transaction: Transaction }
|
options: { transaction: Transaction }
|
||||||
) {
|
) {
|
||||||
return CollectionUser.findOrCreate({
|
return UserPermission.findOrCreate({
|
||||||
where: {
|
where: {
|
||||||
collectionId: model.id,
|
collectionId: model.id,
|
||||||
userId: model.createdById,
|
userId: model.createdById,
|
||||||
@@ -282,16 +300,16 @@ class Collection extends ParanoidModel {
|
|||||||
@HasMany(() => Document, "collectionId")
|
@HasMany(() => Document, "collectionId")
|
||||||
documents: Document[];
|
documents: Document[];
|
||||||
|
|
||||||
@HasMany(() => CollectionUser, "collectionId")
|
@HasMany(() => UserPermission, "collectionId")
|
||||||
memberships: CollectionUser[];
|
memberships: UserPermission[];
|
||||||
|
|
||||||
@HasMany(() => CollectionGroup, "collectionId")
|
@HasMany(() => GroupPermission, "collectionId")
|
||||||
collectionGroupMemberships: CollectionGroup[];
|
collectionGroupMemberships: GroupPermission[];
|
||||||
|
|
||||||
@BelongsToMany(() => User, () => CollectionUser)
|
@BelongsToMany(() => User, () => UserPermission)
|
||||||
users: User[];
|
users: User[];
|
||||||
|
|
||||||
@BelongsToMany(() => Group, () => CollectionGroup)
|
@BelongsToMany(() => Group, () => GroupPermission)
|
||||||
groups: Group[];
|
groups: Group[];
|
||||||
|
|
||||||
@BelongsTo(() => User, "createdById")
|
@BelongsTo(() => User, "createdById")
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import {
|
|||||||
DataType,
|
DataType,
|
||||||
Scopes,
|
Scopes,
|
||||||
} from "sequelize-typescript";
|
} from "sequelize-typescript";
|
||||||
import CollectionGroup from "./CollectionGroup";
|
import GroupPermission from "./GroupPermission";
|
||||||
import GroupUser from "./GroupUser";
|
import GroupUser from "./GroupUser";
|
||||||
import Team from "./Team";
|
import Team from "./Team";
|
||||||
import User from "./User";
|
import User from "./User";
|
||||||
@@ -87,7 +87,7 @@ class Group extends ParanoidModel {
|
|||||||
groupId: model.id,
|
groupId: model.id,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
await CollectionGroup.destroy({
|
await GroupPermission.destroy({
|
||||||
where: {
|
where: {
|
||||||
groupId: model.id,
|
groupId: model.id,
|
||||||
},
|
},
|
||||||
@@ -106,8 +106,8 @@ class Group extends ParanoidModel {
|
|||||||
@HasMany(() => GroupUser, { as: "members", foreignKey: "groupId" })
|
@HasMany(() => GroupUser, { as: "members", foreignKey: "groupId" })
|
||||||
groupMemberships: GroupUser[];
|
groupMemberships: GroupUser[];
|
||||||
|
|
||||||
@HasMany(() => CollectionGroup, "groupId")
|
@HasMany(() => GroupPermission, "groupId")
|
||||||
collectionGroupMemberships: CollectionGroup[];
|
collectionGroupMemberships: GroupPermission[];
|
||||||
|
|
||||||
@BelongsTo(() => Team, "teamId")
|
@BelongsTo(() => Team, "teamId")
|
||||||
team: Team;
|
team: Team;
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import { Op } from "sequelize";
|
||||||
import {
|
import {
|
||||||
BelongsTo,
|
BelongsTo,
|
||||||
Column,
|
Column,
|
||||||
@@ -10,6 +11,7 @@ import {
|
|||||||
} from "sequelize-typescript";
|
} from "sequelize-typescript";
|
||||||
import { CollectionPermission } from "@shared/types";
|
import { CollectionPermission } from "@shared/types";
|
||||||
import Collection from "./Collection";
|
import Collection from "./Collection";
|
||||||
|
import Document from "./Document";
|
||||||
import Group from "./Group";
|
import Group from "./Group";
|
||||||
import User from "./User";
|
import User from "./User";
|
||||||
import Model from "./base/Model";
|
import Model from "./base/Model";
|
||||||
@@ -26,14 +28,20 @@ import Fix from "./decorators/Fix";
|
|||||||
withCollection: {
|
withCollection: {
|
||||||
include: [
|
include: [
|
||||||
{
|
{
|
||||||
association: "collection",
|
model: Collection,
|
||||||
|
as: "collection",
|
||||||
|
where: {
|
||||||
|
collectionId: {
|
||||||
|
[Op.ne]: null,
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
}))
|
}))
|
||||||
@Table({ tableName: "collection_groups", modelName: "collection_group" })
|
@Table({ tableName: "group_permissions", modelName: "group_permission" })
|
||||||
@Fix
|
@Fix
|
||||||
class CollectionGroup extends Model {
|
class GroupPermission extends Model {
|
||||||
@Default(CollectionPermission.ReadWrite)
|
@Default(CollectionPermission.ReadWrite)
|
||||||
@IsIn([Object.values(CollectionPermission)])
|
@IsIn([Object.values(CollectionPermission)])
|
||||||
@Column(DataType.STRING)
|
@Column(DataType.STRING)
|
||||||
@@ -42,11 +50,18 @@ class CollectionGroup extends Model {
|
|||||||
// associations
|
// associations
|
||||||
|
|
||||||
@BelongsTo(() => Collection, "collectionId")
|
@BelongsTo(() => Collection, "collectionId")
|
||||||
collection: Collection;
|
collection?: Collection | null;
|
||||||
|
|
||||||
@ForeignKey(() => Collection)
|
@ForeignKey(() => Collection)
|
||||||
@Column(DataType.UUID)
|
@Column(DataType.UUID)
|
||||||
collectionId: string;
|
collectionId?: string | null;
|
||||||
|
|
||||||
|
@BelongsTo(() => Document, "documentId")
|
||||||
|
document?: Document | null;
|
||||||
|
|
||||||
|
@ForeignKey(() => Document)
|
||||||
|
@Column(DataType.UUID)
|
||||||
|
documentId?: string | null;
|
||||||
|
|
||||||
@BelongsTo(() => Group, "groupId")
|
@BelongsTo(() => Group, "groupId")
|
||||||
group: Group;
|
group: Group;
|
||||||
@@ -59,4 +74,4 @@ class CollectionGroup extends Model {
|
|||||||
createdBy: User;
|
createdBy: User;
|
||||||
}
|
}
|
||||||
|
|
||||||
export default CollectionGroup;
|
export default GroupPermission;
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
import { faker } from "@faker-js/faker";
|
import { faker } from "@faker-js/faker";
|
||||||
import { CollectionPermission } from "@shared/types";
|
import { CollectionPermission } from "@shared/types";
|
||||||
import { buildUser, buildTeam, buildCollection } from "@server/test/factories";
|
import { buildUser, buildTeam, buildCollection } from "@server/test/factories";
|
||||||
import CollectionUser from "./CollectionUser";
|
|
||||||
import UserAuthentication from "./UserAuthentication";
|
import UserAuthentication from "./UserAuthentication";
|
||||||
|
import UserPermission from "./UserPermission";
|
||||||
|
|
||||||
beforeAll(() => {
|
beforeAll(() => {
|
||||||
jest.useFakeTimers().setSystemTime(new Date("2018-01-02T00:00:00.000Z"));
|
jest.useFakeTimers().setSystemTime(new Date("2018-01-02T00:00:00.000Z"));
|
||||||
@@ -104,7 +104,7 @@ describe("user model", () => {
|
|||||||
teamId: team.id,
|
teamId: team.id,
|
||||||
permission: null,
|
permission: null,
|
||||||
});
|
});
|
||||||
await CollectionUser.create({
|
await UserPermission.create({
|
||||||
createdById: user.id,
|
createdById: user.id,
|
||||||
collectionId: collection.id,
|
collectionId: collection.id,
|
||||||
userId: user.id,
|
userId: user.id,
|
||||||
|
|||||||
@@ -41,10 +41,10 @@ import ApiKey from "./ApiKey";
|
|||||||
import Attachment from "./Attachment";
|
import Attachment from "./Attachment";
|
||||||
import AuthenticationProvider from "./AuthenticationProvider";
|
import AuthenticationProvider from "./AuthenticationProvider";
|
||||||
import Collection from "./Collection";
|
import Collection from "./Collection";
|
||||||
import CollectionUser from "./CollectionUser";
|
|
||||||
import Star from "./Star";
|
import Star from "./Star";
|
||||||
import Team from "./Team";
|
import Team from "./Team";
|
||||||
import UserAuthentication from "./UserAuthentication";
|
import UserAuthentication from "./UserAuthentication";
|
||||||
|
import UserPermission from "./UserPermission";
|
||||||
import ParanoidModel from "./base/ParanoidModel";
|
import ParanoidModel from "./base/ParanoidModel";
|
||||||
import Encrypted, {
|
import Encrypted, {
|
||||||
setEncryptedColumn,
|
setEncryptedColumn,
|
||||||
@@ -545,7 +545,7 @@ class User extends ParanoidModel {
|
|||||||
},
|
},
|
||||||
options
|
options
|
||||||
);
|
);
|
||||||
await CollectionUser.update(
|
await UserPermission.update(
|
||||||
{
|
{
|
||||||
permission: CollectionPermission.Read,
|
permission: CollectionPermission.Read,
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import { Op } from "sequelize";
|
||||||
import {
|
import {
|
||||||
Column,
|
Column,
|
||||||
ForeignKey,
|
ForeignKey,
|
||||||
@@ -10,6 +11,7 @@ import {
|
|||||||
} from "sequelize-typescript";
|
} from "sequelize-typescript";
|
||||||
import { CollectionPermission } from "@shared/types";
|
import { CollectionPermission } from "@shared/types";
|
||||||
import Collection from "./Collection";
|
import Collection from "./Collection";
|
||||||
|
import Document from "./Document";
|
||||||
import User from "./User";
|
import User from "./User";
|
||||||
import Model from "./base/Model";
|
import Model from "./base/Model";
|
||||||
import Fix from "./decorators/Fix";
|
import Fix from "./decorators/Fix";
|
||||||
@@ -25,14 +27,20 @@ import Fix from "./decorators/Fix";
|
|||||||
withCollection: {
|
withCollection: {
|
||||||
include: [
|
include: [
|
||||||
{
|
{
|
||||||
association: "collection",
|
model: Collection,
|
||||||
|
as: "collection",
|
||||||
|
where: {
|
||||||
|
collectionId: {
|
||||||
|
[Op.ne]: null,
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
}))
|
}))
|
||||||
@Table({ tableName: "collection_users", modelName: "collection_user" })
|
@Table({ tableName: "user_permissions", modelName: "user_permission" })
|
||||||
@Fix
|
@Fix
|
||||||
class CollectionUser extends Model {
|
class UserPermission extends Model {
|
||||||
@Default(CollectionPermission.ReadWrite)
|
@Default(CollectionPermission.ReadWrite)
|
||||||
@IsIn([Object.values(CollectionPermission)])
|
@IsIn([Object.values(CollectionPermission)])
|
||||||
@Column(DataType.STRING)
|
@Column(DataType.STRING)
|
||||||
@@ -41,11 +49,18 @@ class CollectionUser extends Model {
|
|||||||
// associations
|
// associations
|
||||||
|
|
||||||
@BelongsTo(() => Collection, "collectionId")
|
@BelongsTo(() => Collection, "collectionId")
|
||||||
collection: Collection;
|
collection?: Collection | null;
|
||||||
|
|
||||||
@ForeignKey(() => Collection)
|
@ForeignKey(() => Collection)
|
||||||
@Column(DataType.UUID)
|
@Column(DataType.UUID)
|
||||||
collectionId: string;
|
collectionId?: string | null;
|
||||||
|
|
||||||
|
@BelongsTo(() => Document, "documentId")
|
||||||
|
document?: Document | null;
|
||||||
|
|
||||||
|
@ForeignKey(() => Document)
|
||||||
|
@Column(DataType.UUID)
|
||||||
|
documentId?: string | null;
|
||||||
|
|
||||||
@BelongsTo(() => User, "userId")
|
@BelongsTo(() => User, "userId")
|
||||||
user: User;
|
user: User;
|
||||||
@@ -62,4 +77,4 @@ class CollectionUser extends Model {
|
|||||||
createdById: string;
|
createdById: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export default CollectionUser;
|
export default UserPermission;
|
||||||
@@ -8,9 +8,9 @@ export { default as Backlink } from "./Backlink";
|
|||||||
|
|
||||||
export { default as Collection } from "./Collection";
|
export { default as Collection } from "./Collection";
|
||||||
|
|
||||||
export { default as CollectionGroup } from "./CollectionGroup";
|
export { default as GroupPermission } from "./GroupPermission";
|
||||||
|
|
||||||
export { default as CollectionUser } from "./CollectionUser";
|
export { default as UserPermission } from "./UserPermission";
|
||||||
|
|
||||||
export { default as Comment } from "./Comment";
|
export { default as Comment } from "./Comment";
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { CollectionPermission } from "@shared/types";
|
import { CollectionPermission } from "@shared/types";
|
||||||
import { CollectionUser, Collection } from "@server/models";
|
import { UserPermission, Collection } from "@server/models";
|
||||||
import {
|
import {
|
||||||
buildUser,
|
buildUser,
|
||||||
buildTeam,
|
buildTeam,
|
||||||
@@ -59,7 +59,7 @@ describe("member", () => {
|
|||||||
teamId: team.id,
|
teamId: team.id,
|
||||||
permission: CollectionPermission.ReadWrite,
|
permission: CollectionPermission.ReadWrite,
|
||||||
});
|
});
|
||||||
await CollectionUser.create({
|
await UserPermission.create({
|
||||||
createdById: user.id,
|
createdById: user.id,
|
||||||
collectionId: collection.id,
|
collectionId: collection.id,
|
||||||
userId: user.id,
|
userId: user.id,
|
||||||
@@ -104,7 +104,7 @@ describe("member", () => {
|
|||||||
teamId: team.id,
|
teamId: team.id,
|
||||||
permission: CollectionPermission.ReadWrite,
|
permission: CollectionPermission.ReadWrite,
|
||||||
});
|
});
|
||||||
await CollectionUser.create({
|
await UserPermission.create({
|
||||||
createdById: user.id,
|
createdById: user.id,
|
||||||
collectionId: collection.id,
|
collectionId: collection.id,
|
||||||
userId: user.id,
|
userId: user.id,
|
||||||
@@ -147,7 +147,7 @@ describe("member", () => {
|
|||||||
teamId: team.id,
|
teamId: team.id,
|
||||||
permission: CollectionPermission.Read,
|
permission: CollectionPermission.Read,
|
||||||
});
|
});
|
||||||
await CollectionUser.create({
|
await UserPermission.create({
|
||||||
createdById: user.id,
|
createdById: user.id,
|
||||||
collectionId: collection.id,
|
collectionId: collection.id,
|
||||||
userId: user.id,
|
userId: user.id,
|
||||||
@@ -192,7 +192,7 @@ describe("member", () => {
|
|||||||
teamId: team.id,
|
teamId: team.id,
|
||||||
permission: null,
|
permission: null,
|
||||||
});
|
});
|
||||||
await CollectionUser.create({
|
await UserPermission.create({
|
||||||
createdById: user.id,
|
createdById: user.id,
|
||||||
collectionId: collection.id,
|
collectionId: collection.id,
|
||||||
userId: user.id,
|
userId: user.id,
|
||||||
@@ -242,7 +242,7 @@ describe("viewer", () => {
|
|||||||
teamId: team.id,
|
teamId: team.id,
|
||||||
permission: CollectionPermission.ReadWrite,
|
permission: CollectionPermission.ReadWrite,
|
||||||
});
|
});
|
||||||
await CollectionUser.create({
|
await UserPermission.create({
|
||||||
createdById: user.id,
|
createdById: user.id,
|
||||||
collectionId: collection.id,
|
collectionId: collection.id,
|
||||||
userId: user.id,
|
userId: user.id,
|
||||||
@@ -271,7 +271,7 @@ describe("viewer", () => {
|
|||||||
teamId: team.id,
|
teamId: team.id,
|
||||||
permission: CollectionPermission.Read,
|
permission: CollectionPermission.Read,
|
||||||
});
|
});
|
||||||
await CollectionUser.create({
|
await UserPermission.create({
|
||||||
createdById: user.id,
|
createdById: user.id,
|
||||||
collectionId: collection.id,
|
collectionId: collection.id,
|
||||||
userId: user.id,
|
userId: user.id,
|
||||||
@@ -317,7 +317,7 @@ describe("viewer", () => {
|
|||||||
teamId: team.id,
|
teamId: team.id,
|
||||||
permission: null,
|
permission: null,
|
||||||
});
|
});
|
||||||
await CollectionUser.create({
|
await UserPermission.create({
|
||||||
createdById: user.id,
|
createdById: user.id,
|
||||||
collectionId: collection.id,
|
collectionId: collection.id,
|
||||||
userId: user.id,
|
userId: user.id,
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
import { CollectionPermission } from "@shared/types";
|
import { CollectionPermission } from "@shared/types";
|
||||||
import { CollectionGroup } from "@server/models";
|
import { GroupPermission } from "@server/models";
|
||||||
|
|
||||||
type Membership = {
|
type Membership = {
|
||||||
id: string;
|
id: string;
|
||||||
groupId: string;
|
groupId: string;
|
||||||
collectionId: string;
|
collectionId?: string | null;
|
||||||
permission: CollectionPermission;
|
permission: CollectionPermission;
|
||||||
};
|
};
|
||||||
|
|
||||||
export default function presentCollectionGroupMembership(
|
export default function presentCollectionGroupMembership(
|
||||||
membership: CollectionGroup
|
membership: GroupPermission
|
||||||
): Membership {
|
): Membership {
|
||||||
return {
|
return {
|
||||||
id: `${membership.groupId}-${membership.collectionId}`,
|
id: `${membership.groupId}-${membership.collectionId}`,
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
import { CollectionPermission } from "@shared/types";
|
import { CollectionPermission } from "@shared/types";
|
||||||
import { CollectionUser } from "@server/models";
|
import { UserPermission } from "@server/models";
|
||||||
|
|
||||||
type Membership = {
|
type Membership = {
|
||||||
id: string;
|
id: string;
|
||||||
userId: string;
|
userId: string;
|
||||||
collectionId: string;
|
collectionId?: string | null;
|
||||||
permission: CollectionPermission;
|
permission: CollectionPermission;
|
||||||
};
|
};
|
||||||
|
|
||||||
export default function presentMembership(
|
export default function presentMembership(
|
||||||
membership: CollectionUser
|
membership: UserPermission
|
||||||
): Membership {
|
): Membership {
|
||||||
return {
|
return {
|
||||||
id: `${membership.userId}-${membership.collectionId}`,
|
id: `${membership.userId}-${membership.collectionId}`,
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import {
|
|||||||
Collection,
|
Collection,
|
||||||
FileOperation,
|
FileOperation,
|
||||||
Group,
|
Group,
|
||||||
CollectionGroup,
|
GroupPermission,
|
||||||
GroupUser,
|
GroupUser,
|
||||||
Pin,
|
Pin,
|
||||||
Star,
|
Star,
|
||||||
@@ -435,7 +435,9 @@ export default class WebsocketsProcessor {
|
|||||||
|
|
||||||
case "groups.add_user": {
|
case "groups.add_user": {
|
||||||
// do an add user for every collection that the group is a part of
|
// do an add user for every collection that the group is a part of
|
||||||
const collectionGroupMemberships = await CollectionGroup.findAll({
|
const collectionGroupMemberships = await GroupPermission.scope(
|
||||||
|
"withCollection"
|
||||||
|
).findAll({
|
||||||
where: {
|
where: {
|
||||||
groupId: event.modelId,
|
groupId: event.modelId,
|
||||||
},
|
},
|
||||||
@@ -468,7 +470,9 @@ export default class WebsocketsProcessor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
case "groups.remove_user": {
|
case "groups.remove_user": {
|
||||||
const collectionGroupMemberships = await CollectionGroup.findAll({
|
const collectionGroupMemberships = await GroupPermission.scope(
|
||||||
|
"withCollection"
|
||||||
|
).findAll({
|
||||||
where: {
|
where: {
|
||||||
groupId: event.modelId,
|
groupId: event.modelId,
|
||||||
},
|
},
|
||||||
@@ -477,9 +481,11 @@ export default class WebsocketsProcessor {
|
|||||||
for (const collectionGroup of collectionGroupMemberships) {
|
for (const collectionGroup of collectionGroupMemberships) {
|
||||||
// if the user has any memberships remaining on the collection
|
// if the user has any memberships remaining on the collection
|
||||||
// we need to emit add instead of remove
|
// we need to emit add instead of remove
|
||||||
const collection = await Collection.scope({
|
const collection = collectionGroup.collectionId
|
||||||
|
? await Collection.scope({
|
||||||
method: ["withMembership", event.userId],
|
method: ["withMembership", event.userId],
|
||||||
}).findByPk(collectionGroup.collectionId);
|
}).findByPk(collectionGroup.collectionId)
|
||||||
|
: null;
|
||||||
|
|
||||||
if (!collection) {
|
if (!collection) {
|
||||||
continue;
|
continue;
|
||||||
@@ -535,7 +541,9 @@ export default class WebsocketsProcessor {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
const collectionGroupMemberships = await CollectionGroup.findAll({
|
const collectionGroupMemberships = await GroupPermission.scope(
|
||||||
|
"withCollection"
|
||||||
|
).findAll({
|
||||||
paranoid: false,
|
paranoid: false,
|
||||||
where: {
|
where: {
|
||||||
groupId: event.modelId,
|
groupId: event.modelId,
|
||||||
@@ -546,9 +554,9 @@ export default class WebsocketsProcessor {
|
|||||||
});
|
});
|
||||||
|
|
||||||
for (const collectionGroup of collectionGroupMemberships) {
|
for (const collectionGroup of collectionGroupMemberships) {
|
||||||
const membershipUserIds = await Collection.membershipUserIds(
|
const membershipUserIds = collectionGroup.collectionId
|
||||||
collectionGroup.collectionId
|
? await Collection.membershipUserIds(collectionGroup.collectionId)
|
||||||
);
|
: [];
|
||||||
|
|
||||||
for (const groupUser of groupUsers) {
|
for (const groupUser of groupUsers) {
|
||||||
if (membershipUserIds.includes(groupUser.userId)) {
|
if (membershipUserIds.includes(groupUser.userId)) {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { AttachmentPreset, CollectionPermission } from "@shared/types";
|
import { AttachmentPreset, CollectionPermission } from "@shared/types";
|
||||||
import { CollectionUser } from "@server/models";
|
import { UserPermission } from "@server/models";
|
||||||
import Attachment from "@server/models/Attachment";
|
import Attachment from "@server/models/Attachment";
|
||||||
import {
|
import {
|
||||||
buildUser,
|
buildUser,
|
||||||
@@ -123,7 +123,7 @@ describe("#attachments.create", () => {
|
|||||||
collectionId: collection.id,
|
collectionId: collection.id,
|
||||||
});
|
});
|
||||||
|
|
||||||
await CollectionUser.create({
|
await UserPermission.create({
|
||||||
createdById: user.id,
|
createdById: user.id,
|
||||||
collectionId: collection.id,
|
collectionId: collection.id,
|
||||||
userId: user.id,
|
userId: user.id,
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { CollectionPermission } from "@shared/types";
|
import { CollectionPermission } from "@shared/types";
|
||||||
import { colorPalette } from "@shared/utils/collections";
|
import { colorPalette } from "@shared/utils/collections";
|
||||||
import { Document, CollectionUser, CollectionGroup } from "@server/models";
|
import { Document, UserPermission, GroupPermission } from "@server/models";
|
||||||
import {
|
import {
|
||||||
buildUser,
|
buildUser,
|
||||||
buildAdmin,
|
buildAdmin,
|
||||||
@@ -310,7 +310,7 @@ describe("#collections.export", () => {
|
|||||||
const collection = await buildCollection({ teamId: team.id });
|
const collection = await buildCollection({ teamId: team.id });
|
||||||
collection.permission = null;
|
collection.permission = null;
|
||||||
await collection.save();
|
await collection.save();
|
||||||
await CollectionUser.create({
|
await UserPermission.create({
|
||||||
createdById: admin.id,
|
createdById: admin.id,
|
||||||
collectionId: collection.id,
|
collectionId: collection.id,
|
||||||
userId: admin.id,
|
userId: admin.id,
|
||||||
@@ -750,13 +750,13 @@ describe("#collections.group_memberships", () => {
|
|||||||
permission: null,
|
permission: null,
|
||||||
teamId: user.teamId,
|
teamId: user.teamId,
|
||||||
});
|
});
|
||||||
await CollectionUser.create({
|
await UserPermission.create({
|
||||||
createdById: user.id,
|
createdById: user.id,
|
||||||
collectionId: collection.id,
|
collectionId: collection.id,
|
||||||
userId: user.id,
|
userId: user.id,
|
||||||
permission: CollectionPermission.ReadWrite,
|
permission: CollectionPermission.ReadWrite,
|
||||||
});
|
});
|
||||||
await CollectionGroup.create({
|
await GroupPermission.create({
|
||||||
createdById: user.id,
|
createdById: user.id,
|
||||||
collectionId: collection.id,
|
collectionId: collection.id,
|
||||||
groupId: group.id,
|
groupId: group.id,
|
||||||
@@ -792,19 +792,19 @@ describe("#collections.group_memberships", () => {
|
|||||||
permission: null,
|
permission: null,
|
||||||
teamId: user.teamId,
|
teamId: user.teamId,
|
||||||
});
|
});
|
||||||
await CollectionUser.create({
|
await UserPermission.create({
|
||||||
createdById: user.id,
|
createdById: user.id,
|
||||||
collectionId: collection.id,
|
collectionId: collection.id,
|
||||||
userId: user.id,
|
userId: user.id,
|
||||||
permission: CollectionPermission.ReadWrite,
|
permission: CollectionPermission.ReadWrite,
|
||||||
});
|
});
|
||||||
await CollectionGroup.create({
|
await GroupPermission.create({
|
||||||
createdById: user.id,
|
createdById: user.id,
|
||||||
collectionId: collection.id,
|
collectionId: collection.id,
|
||||||
groupId: group.id,
|
groupId: group.id,
|
||||||
permission: CollectionPermission.ReadWrite,
|
permission: CollectionPermission.ReadWrite,
|
||||||
});
|
});
|
||||||
await CollectionGroup.create({
|
await GroupPermission.create({
|
||||||
createdById: user.id,
|
createdById: user.id,
|
||||||
collectionId: collection.id,
|
collectionId: collection.id,
|
||||||
groupId: group2.id,
|
groupId: group2.id,
|
||||||
@@ -835,19 +835,19 @@ describe("#collections.group_memberships", () => {
|
|||||||
permission: null,
|
permission: null,
|
||||||
teamId: user.teamId,
|
teamId: user.teamId,
|
||||||
});
|
});
|
||||||
await CollectionUser.create({
|
await UserPermission.create({
|
||||||
createdById: user.id,
|
createdById: user.id,
|
||||||
collectionId: collection.id,
|
collectionId: collection.id,
|
||||||
userId: user.id,
|
userId: user.id,
|
||||||
permission: CollectionPermission.ReadWrite,
|
permission: CollectionPermission.ReadWrite,
|
||||||
});
|
});
|
||||||
await CollectionGroup.create({
|
await GroupPermission.create({
|
||||||
createdById: user.id,
|
createdById: user.id,
|
||||||
collectionId: collection.id,
|
collectionId: collection.id,
|
||||||
groupId: group.id,
|
groupId: group.id,
|
||||||
permission: CollectionPermission.ReadWrite,
|
permission: CollectionPermission.ReadWrite,
|
||||||
});
|
});
|
||||||
await CollectionGroup.create({
|
await GroupPermission.create({
|
||||||
createdById: user.id,
|
createdById: user.id,
|
||||||
collectionId: collection.id,
|
collectionId: collection.id,
|
||||||
groupId: group2.id,
|
groupId: group2.id,
|
||||||
@@ -926,7 +926,7 @@ describe("#collections.memberships", () => {
|
|||||||
const user2 = await buildUser({
|
const user2 = await buildUser({
|
||||||
name: "Won't find",
|
name: "Won't find",
|
||||||
});
|
});
|
||||||
await CollectionUser.create({
|
await UserPermission.create({
|
||||||
createdById: user2.id,
|
createdById: user2.id,
|
||||||
collectionId: collection.id,
|
collectionId: collection.id,
|
||||||
userId: user2.id,
|
userId: user2.id,
|
||||||
@@ -953,13 +953,13 @@ describe("#collections.memberships", () => {
|
|||||||
teamId: team.id,
|
teamId: team.id,
|
||||||
});
|
});
|
||||||
const user2 = await buildUser();
|
const user2 = await buildUser();
|
||||||
await CollectionUser.create({
|
await UserPermission.create({
|
||||||
createdById: user.id,
|
createdById: user.id,
|
||||||
collectionId: collection.id,
|
collectionId: collection.id,
|
||||||
userId: user.id,
|
userId: user.id,
|
||||||
permission: CollectionPermission.ReadWrite,
|
permission: CollectionPermission.ReadWrite,
|
||||||
});
|
});
|
||||||
await CollectionUser.create({
|
await UserPermission.create({
|
||||||
createdById: user2.id,
|
createdById: user2.id,
|
||||||
collectionId: collection.id,
|
collectionId: collection.id,
|
||||||
userId: user2.id,
|
userId: user2.id,
|
||||||
@@ -1026,7 +1026,7 @@ describe("#collections.info", () => {
|
|||||||
});
|
});
|
||||||
collection.permission = null;
|
collection.permission = null;
|
||||||
await collection.save();
|
await collection.save();
|
||||||
await CollectionUser.destroy({
|
await UserPermission.destroy({
|
||||||
where: {
|
where: {
|
||||||
collectionId: collection.id,
|
collectionId: collection.id,
|
||||||
userId: user.id,
|
userId: user.id,
|
||||||
@@ -1050,7 +1050,7 @@ describe("#collections.info", () => {
|
|||||||
});
|
});
|
||||||
collection.permission = null;
|
collection.permission = null;
|
||||||
await collection.save();
|
await collection.save();
|
||||||
await CollectionUser.create({
|
await UserPermission.create({
|
||||||
collectionId: collection.id,
|
collectionId: collection.id,
|
||||||
userId: user.id,
|
userId: user.id,
|
||||||
createdById: user.id,
|
createdById: user.id,
|
||||||
@@ -1342,7 +1342,7 @@ describe("#collections.update", () => {
|
|||||||
const collection = await buildCollection({ teamId: team.id });
|
const collection = await buildCollection({ teamId: team.id });
|
||||||
collection.permission = null;
|
collection.permission = null;
|
||||||
await collection.save();
|
await collection.save();
|
||||||
await CollectionUser.create({
|
await UserPermission.create({
|
||||||
collectionId: collection.id,
|
collectionId: collection.id,
|
||||||
userId: admin.id,
|
userId: admin.id,
|
||||||
createdById: admin.id,
|
createdById: admin.id,
|
||||||
@@ -1371,7 +1371,7 @@ describe("#collections.update", () => {
|
|||||||
const collection = await buildCollection({ teamId: team.id });
|
const collection = await buildCollection({ teamId: team.id });
|
||||||
collection.permission = null;
|
collection.permission = null;
|
||||||
await collection.save();
|
await collection.save();
|
||||||
await CollectionUser.create({
|
await UserPermission.create({
|
||||||
collectionId: collection.id,
|
collectionId: collection.id,
|
||||||
userId: admin.id,
|
userId: admin.id,
|
||||||
createdById: admin.id,
|
createdById: admin.id,
|
||||||
@@ -1432,7 +1432,7 @@ describe("#collections.update", () => {
|
|||||||
});
|
});
|
||||||
collection.permission = null;
|
collection.permission = null;
|
||||||
await collection.save();
|
await collection.save();
|
||||||
await CollectionUser.update(
|
await UserPermission.update(
|
||||||
{
|
{
|
||||||
createdById: user.id,
|
createdById: user.id,
|
||||||
permission: CollectionPermission.Read,
|
permission: CollectionPermission.Read,
|
||||||
|
|||||||
@@ -16,8 +16,8 @@ import { transaction } from "@server/middlewares/transaction";
|
|||||||
import validate from "@server/middlewares/validate";
|
import validate from "@server/middlewares/validate";
|
||||||
import {
|
import {
|
||||||
Collection,
|
Collection,
|
||||||
CollectionUser,
|
UserPermission,
|
||||||
CollectionGroup,
|
GroupPermission,
|
||||||
Team,
|
Team,
|
||||||
Event,
|
Event,
|
||||||
User,
|
User,
|
||||||
@@ -220,7 +220,7 @@ router.post(
|
|||||||
const group = await Group.findByPk(groupId);
|
const group = await Group.findByPk(groupId);
|
||||||
authorize(user, "read", group);
|
authorize(user, "read", group);
|
||||||
|
|
||||||
let membership = await CollectionGroup.findOne({
|
let membership = await GroupPermission.findOne({
|
||||||
where: {
|
where: {
|
||||||
collectionId: id,
|
collectionId: id,
|
||||||
groupId,
|
groupId,
|
||||||
@@ -228,7 +228,7 @@ router.post(
|
|||||||
});
|
});
|
||||||
|
|
||||||
if (!membership) {
|
if (!membership) {
|
||||||
membership = await CollectionGroup.create({
|
membership = await GroupPermission.create({
|
||||||
collectionId: id,
|
collectionId: id,
|
||||||
groupId,
|
groupId,
|
||||||
permission,
|
permission,
|
||||||
@@ -310,7 +310,7 @@ router.post(
|
|||||||
}).findByPk(id);
|
}).findByPk(id);
|
||||||
authorize(user, "read", collection);
|
authorize(user, "read", collection);
|
||||||
|
|
||||||
let where: WhereOptions<CollectionGroup> = {
|
let where: WhereOptions<GroupPermission> = {
|
||||||
collectionId: id,
|
collectionId: id,
|
||||||
};
|
};
|
||||||
let groupWhere;
|
let groupWhere;
|
||||||
@@ -340,8 +340,8 @@ router.post(
|
|||||||
};
|
};
|
||||||
|
|
||||||
const [total, memberships] = await Promise.all([
|
const [total, memberships] = await Promise.all([
|
||||||
CollectionGroup.count(options),
|
GroupPermission.count(options),
|
||||||
CollectionGroup.findAll({
|
GroupPermission.findAll({
|
||||||
...options,
|
...options,
|
||||||
order: [["createdAt", "DESC"]],
|
order: [["createdAt", "DESC"]],
|
||||||
offset: ctx.state.pagination.offset,
|
offset: ctx.state.pagination.offset,
|
||||||
@@ -379,7 +379,7 @@ router.post(
|
|||||||
const user = await User.findByPk(userId);
|
const user = await User.findByPk(userId);
|
||||||
authorize(actor, "read", user);
|
authorize(actor, "read", user);
|
||||||
|
|
||||||
let membership = await CollectionUser.findOne({
|
let membership = await UserPermission.findOne({
|
||||||
where: {
|
where: {
|
||||||
collectionId: id,
|
collectionId: id,
|
||||||
userId,
|
userId,
|
||||||
@@ -389,7 +389,7 @@ router.post(
|
|||||||
});
|
});
|
||||||
|
|
||||||
if (!membership) {
|
if (!membership) {
|
||||||
membership = await CollectionUser.create(
|
membership = await UserPermission.create(
|
||||||
{
|
{
|
||||||
collectionId: id,
|
collectionId: id,
|
||||||
userId,
|
userId,
|
||||||
@@ -485,7 +485,7 @@ router.post(
|
|||||||
}).findByPk(id);
|
}).findByPk(id);
|
||||||
authorize(user, "read", collection);
|
authorize(user, "read", collection);
|
||||||
|
|
||||||
let where: WhereOptions<CollectionUser> = {
|
let where: WhereOptions<UserPermission> = {
|
||||||
collectionId: id,
|
collectionId: id,
|
||||||
};
|
};
|
||||||
let userWhere;
|
let userWhere;
|
||||||
@@ -515,8 +515,8 @@ router.post(
|
|||||||
};
|
};
|
||||||
|
|
||||||
const [total, memberships] = await Promise.all([
|
const [total, memberships] = await Promise.all([
|
||||||
CollectionUser.count(options),
|
UserPermission.count(options),
|
||||||
CollectionUser.findAll({
|
UserPermission.findAll({
|
||||||
...options,
|
...options,
|
||||||
order: [["createdAt", "DESC"]],
|
order: [["createdAt", "DESC"]],
|
||||||
offset: ctx.state.pagination.offset,
|
offset: ctx.state.pagination.offset,
|
||||||
@@ -627,7 +627,7 @@ router.post(
|
|||||||
permission !== CollectionPermission.ReadWrite &&
|
permission !== CollectionPermission.ReadWrite &&
|
||||||
collection.permission === CollectionPermission.ReadWrite
|
collection.permission === CollectionPermission.ReadWrite
|
||||||
) {
|
) {
|
||||||
await CollectionUser.findOrCreate({
|
await UserPermission.findOrCreate({
|
||||||
where: {
|
where: {
|
||||||
collectionId: collection.id,
|
collectionId: collection.id,
|
||||||
userId: user.id,
|
userId: user.id,
|
||||||
|
|||||||
@@ -5,11 +5,11 @@ import {
|
|||||||
View,
|
View,
|
||||||
Revision,
|
Revision,
|
||||||
Backlink,
|
Backlink,
|
||||||
CollectionUser,
|
UserPermission,
|
||||||
SearchQuery,
|
SearchQuery,
|
||||||
Event,
|
Event,
|
||||||
User,
|
User,
|
||||||
CollectionGroup,
|
GroupPermission,
|
||||||
} from "@server/models";
|
} from "@server/models";
|
||||||
import DocumentHelper from "@server/models/helpers/DocumentHelper";
|
import DocumentHelper from "@server/models/helpers/DocumentHelper";
|
||||||
import {
|
import {
|
||||||
@@ -905,7 +905,7 @@ describe("#documents.list", () => {
|
|||||||
collectionId: collection.id,
|
collectionId: collection.id,
|
||||||
});
|
});
|
||||||
|
|
||||||
await CollectionUser.update(
|
await UserPermission.update(
|
||||||
{
|
{
|
||||||
userId: user.id,
|
userId: user.id,
|
||||||
permission: CollectionPermission.Read,
|
permission: CollectionPermission.Read,
|
||||||
@@ -1606,7 +1606,7 @@ describe("#documents.search", () => {
|
|||||||
permission: null,
|
permission: null,
|
||||||
});
|
});
|
||||||
|
|
||||||
await CollectionUser.create({
|
await UserPermission.create({
|
||||||
createdById: user.id,
|
createdById: user.id,
|
||||||
collectionId: collection.id,
|
collectionId: collection.id,
|
||||||
userId: user.id,
|
userId: user.id,
|
||||||
@@ -1973,7 +1973,7 @@ describe("#documents.viewed", () => {
|
|||||||
documentId: document.id,
|
documentId: document.id,
|
||||||
userId: user.id,
|
userId: user.id,
|
||||||
});
|
});
|
||||||
await CollectionUser.destroy({
|
await UserPermission.destroy({
|
||||||
where: {
|
where: {
|
||||||
userId: user.id,
|
userId: user.id,
|
||||||
collectionId: collection.id,
|
collectionId: collection.id,
|
||||||
@@ -2997,7 +2997,7 @@ describe("#documents.update", () => {
|
|||||||
userId: user.id,
|
userId: user.id,
|
||||||
teamId: user.teamId,
|
teamId: user.teamId,
|
||||||
});
|
});
|
||||||
await CollectionUser.update(
|
await UserPermission.update(
|
||||||
{
|
{
|
||||||
userId: user.id,
|
userId: user.id,
|
||||||
permission: CollectionPermission.ReadWrite,
|
permission: CollectionPermission.ReadWrite,
|
||||||
@@ -3104,7 +3104,7 @@ describe("#documents.update", () => {
|
|||||||
teamId: team.id,
|
teamId: team.id,
|
||||||
});
|
});
|
||||||
|
|
||||||
await CollectionUser.update(
|
await UserPermission.update(
|
||||||
{
|
{
|
||||||
createdById: user.id,
|
createdById: user.id,
|
||||||
permission: CollectionPermission.ReadWrite,
|
permission: CollectionPermission.ReadWrite,
|
||||||
@@ -3142,7 +3142,7 @@ describe("#documents.update", () => {
|
|||||||
collectionId: collection.id,
|
collectionId: collection.id,
|
||||||
teamId: team.id,
|
teamId: team.id,
|
||||||
});
|
});
|
||||||
await CollectionUser.update(
|
await UserPermission.update(
|
||||||
{
|
{
|
||||||
createdById: user.id,
|
createdById: user.id,
|
||||||
permission: CollectionPermission.Read,
|
permission: CollectionPermission.Read,
|
||||||
@@ -3178,7 +3178,7 @@ describe("#documents.update", () => {
|
|||||||
});
|
});
|
||||||
collection.permission = CollectionPermission.Read;
|
collection.permission = CollectionPermission.Read;
|
||||||
await collection.save();
|
await collection.save();
|
||||||
await CollectionUser.destroy({
|
await UserPermission.destroy({
|
||||||
where: {
|
where: {
|
||||||
userId: user.id,
|
userId: user.id,
|
||||||
collectionId: collection.id,
|
collectionId: collection.id,
|
||||||
@@ -3773,25 +3773,25 @@ describe("#documents.users", () => {
|
|||||||
|
|
||||||
// add people and groups to collection
|
// add people and groups to collection
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
CollectionUser.create({
|
UserPermission.create({
|
||||||
collectionId: collection.id,
|
collectionId: collection.id,
|
||||||
userId: alan.id,
|
userId: alan.id,
|
||||||
permission: CollectionPermission.Read,
|
permission: CollectionPermission.Read,
|
||||||
createdById: user.id,
|
createdById: user.id,
|
||||||
}),
|
}),
|
||||||
CollectionUser.create({
|
UserPermission.create({
|
||||||
collectionId: collection.id,
|
collectionId: collection.id,
|
||||||
userId: bret.id,
|
userId: bret.id,
|
||||||
permission: CollectionPermission.Read,
|
permission: CollectionPermission.Read,
|
||||||
createdById: user.id,
|
createdById: user.id,
|
||||||
}),
|
}),
|
||||||
CollectionUser.create({
|
UserPermission.create({
|
||||||
collectionId: collection.id,
|
collectionId: collection.id,
|
||||||
userId: ken.id,
|
userId: ken.id,
|
||||||
permission: CollectionPermission.Read,
|
permission: CollectionPermission.Read,
|
||||||
createdById: user.id,
|
createdById: user.id,
|
||||||
}),
|
}),
|
||||||
CollectionGroup.create({
|
GroupPermission.create({
|
||||||
collectionId: collection.id,
|
collectionId: collection.id,
|
||||||
groupId: group.id,
|
groupId: group.id,
|
||||||
permission: CollectionPermission.ReadWrite,
|
permission: CollectionPermission.ReadWrite,
|
||||||
@@ -3863,19 +3863,19 @@ describe("#documents.users", () => {
|
|||||||
|
|
||||||
// add people to collection
|
// add people to collection
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
CollectionUser.create({
|
UserPermission.create({
|
||||||
collectionId: collection.id,
|
collectionId: collection.id,
|
||||||
userId: alan.id,
|
userId: alan.id,
|
||||||
permission: CollectionPermission.Read,
|
permission: CollectionPermission.Read,
|
||||||
createdById: user.id,
|
createdById: user.id,
|
||||||
}),
|
}),
|
||||||
CollectionUser.create({
|
UserPermission.create({
|
||||||
collectionId: collection.id,
|
collectionId: collection.id,
|
||||||
userId: bret.id,
|
userId: bret.id,
|
||||||
permission: CollectionPermission.Read,
|
permission: CollectionPermission.Read,
|
||||||
createdById: user.id,
|
createdById: user.id,
|
||||||
}),
|
}),
|
||||||
CollectionUser.create({
|
UserPermission.create({
|
||||||
collectionId: collection.id,
|
collectionId: collection.id,
|
||||||
userId: ken.id,
|
userId: ken.id,
|
||||||
permission: CollectionPermission.Read,
|
permission: CollectionPermission.Read,
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { CollectionUser, Revision } from "@server/models";
|
import { UserPermission, Revision } from "@server/models";
|
||||||
import {
|
import {
|
||||||
buildCollection,
|
buildCollection,
|
||||||
buildDocument,
|
buildDocument,
|
||||||
@@ -175,7 +175,7 @@ describe("#revisions.list", () => {
|
|||||||
await Revision.createFromDocument(document);
|
await Revision.createFromDocument(document);
|
||||||
collection.permission = null;
|
collection.permission = null;
|
||||||
await collection.save();
|
await collection.save();
|
||||||
await CollectionUser.destroy({
|
await UserPermission.destroy({
|
||||||
where: {
|
where: {
|
||||||
userId: user.id,
|
userId: user.id,
|
||||||
collectionId: collection.id,
|
collectionId: collection.id,
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { CollectionPermission } from "@shared/types";
|
import { CollectionPermission } from "@shared/types";
|
||||||
import { CollectionUser, Share } from "@server/models";
|
import { UserPermission, Share } from "@server/models";
|
||||||
import {
|
import {
|
||||||
buildUser,
|
buildUser,
|
||||||
buildDocument,
|
buildDocument,
|
||||||
@@ -240,7 +240,7 @@ describe("#shares.create", () => {
|
|||||||
});
|
});
|
||||||
collection.permission = null;
|
collection.permission = null;
|
||||||
await collection.save();
|
await collection.save();
|
||||||
await CollectionUser.update(
|
await UserPermission.update(
|
||||||
{
|
{
|
||||||
userId: user.id,
|
userId: user.id,
|
||||||
permission: CollectionPermission.Read,
|
permission: CollectionPermission.Read,
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { CollectionPermission } from "@shared/types";
|
import { CollectionPermission } from "@shared/types";
|
||||||
import { View, CollectionUser } from "@server/models";
|
import { View, UserPermission } from "@server/models";
|
||||||
import {
|
import {
|
||||||
buildAdmin,
|
buildAdmin,
|
||||||
buildCollection,
|
buildCollection,
|
||||||
@@ -71,7 +71,7 @@ describe("#views.list", () => {
|
|||||||
});
|
});
|
||||||
collection.permission = null;
|
collection.permission = null;
|
||||||
await collection.save();
|
await collection.save();
|
||||||
await CollectionUser.create({
|
await UserPermission.create({
|
||||||
createdById: user.id,
|
createdById: user.id,
|
||||||
collectionId: collection.id,
|
collectionId: collection.id,
|
||||||
userId: user.id,
|
userId: user.id,
|
||||||
@@ -150,7 +150,7 @@ describe("#views.create", () => {
|
|||||||
});
|
});
|
||||||
collection.permission = null;
|
collection.permission = null;
|
||||||
await collection.save();
|
await collection.save();
|
||||||
await CollectionUser.create({
|
await UserPermission.create({
|
||||||
createdById: user.id,
|
createdById: user.id,
|
||||||
collectionId: collection.id,
|
collectionId: collection.id,
|
||||||
userId: user.id,
|
userId: user.id,
|
||||||
|
|||||||
Reference in New Issue
Block a user