Skip to content

Commit 24eb5d7

Browse files
pyphiliakim
andauthored
feat: improve item discrimination (#2074)
* feat: improve item discrimination * feat: move creator property to packed only * feat: migrate empty extra of folder * refactor: fix test --------- Co-authored-by: kim <kim.phanhoang@epfl.ch>
1 parent 660272d commit 24eb5d7

160 files changed

Lines changed: 1173 additions & 829 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/@types/declarations.d.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import 'fastify';
22

3-
import { ItemRaw } from '../drizzle/types';
43
import { WebsocketService } from '../services/websockets/ws-service';
54
import { MaybeUser } from '../types';
65

src/drizzle/0019_folder-extra.sql

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
update item set extra='{"folder":{}}'::jsonb where type='folder' and extra = '{}';

src/drizzle/meta/_journal.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,13 @@
134134
"when": 1768915971857,
135135
"tag": "0018_member-marketing-subscribed-at",
136136
"breakpoints": true
137+
},
138+
{
139+
"idx": 19,
140+
"version": "7",
141+
"when": 1768915971957,
142+
"tag": "0019_folder-extra",
143+
"breakpoints": true
137144
}
138145
]
139146
}

src/drizzle/types.ts

Lines changed: 12 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,4 @@
1-
import type {
2-
AppItemExtra,
3-
DocumentItemExtra,
4-
EtherpadItemExtra,
5-
FileItemExtra,
6-
FolderItemExtra,
7-
H5PItemExtra,
8-
ItemSettings,
9-
LinkItemExtra,
10-
LinkItemSettings,
11-
ShortcutItemExtra,
12-
} from '@graasp/sdk';
13-
1+
import type { ItemRaw } from '../services/item/item';
142
import type { MinimalGuest, MinimalMember } from '../types';
153
import {
164
accountsTable,
@@ -35,7 +23,6 @@ import {
3523
itemValidationReviewsTable,
3624
itemValidationsTable,
3725
itemVisibilitiesTable,
38-
items,
3926
itemsRawTable,
4027
memberProfilesTable,
4128
membersView,
@@ -77,57 +64,11 @@ export type MemberRaw = Omit<typeof membersView.$inferSelect, 'type'> & {
7764
*/
7865
export type ItemInsertDTO = typeof itemsRawTable.$inferInsert;
7966

80-
/**
81-
* Raw return type given when retrieveing from the db.
82-
*/
83-
export type ItemRaw = typeof items.$inferSelect;
84-
8567
export type NullableItem = ItemRaw | null;
8668

87-
export type ItemLoginSchemaRaw = typeof itemLoginSchemasTable.$inferSelect;
88-
export type ItemLoginSchemaWithItem = ItemLoginSchemaRaw & { item: ItemRaw };
89-
export type GuestInsertDTO = typeof accountsTable.$inferInsert;
90-
export type GuestRaw = Omit<typeof guestsView.$inferSelect, 'type'> & {
91-
type: 'guest';
92-
};
93-
export type GuestWithItemLoginSchema = GuestRaw & {
94-
itemLoginSchema: ItemLoginSchemaRaw | null;
95-
};
96-
97-
export type ItemExtraMap = {
98-
['app']: AppItemExtra;
99-
['document']: DocumentItemExtra;
100-
['etherpad']: EtherpadItemExtra;
101-
['folder']: FolderItemExtra;
102-
['h5p']: H5PItemExtra;
103-
['embeddedLink']: LinkItemExtra;
104-
['file']: FileItemExtra;
105-
['shortcut']: ShortcutItemExtra;
106-
['page']: never;
107-
};
108-
109-
export type ItemSettingsMap = {
110-
['app']: ItemSettings;
111-
['document']: ItemSettings;
112-
['etherpad']: ItemSettings;
113-
['folder']: ItemSettings;
114-
['h5p']: ItemSettings;
115-
['embeddedLink']: LinkItemSettings;
116-
['file']: ItemSettings;
117-
['shortcut']: ItemSettings;
118-
['page']: ItemSettings;
119-
};
120-
121-
// local type alias to simplify the notation
122-
export type ItemTypeEnumKeys = keyof ItemExtraMap;
123-
124-
export type ItemWithType<T extends ItemTypeEnumKeys> = ItemRaw & {
125-
extra: ItemExtraMap[T];
126-
settings: ItemSettingsMap[T];
127-
};
12869
// note: cannot combine nicely Item and ItemWithCreator when defined with omit
12970
// export type ItemWithCreator = Omit<Item, 'creatorId'> & { creator: MinimalAccount };
130-
export type ItemWithCreator = ItemRaw & { creator: MemberRaw | null };
71+
export type ItemWithCreator = ItemRaw & { creator: NullableAccount };
13172

13273
// item created by the server with necessary properties
13374
export type MinimalItemForInsert = {
@@ -140,6 +81,16 @@ export type MinimalItemForInsert = {
14081
order?: ItemRaw['order'];
14182
};
14283

84+
export type ItemLoginSchemaRaw = typeof itemLoginSchemasTable.$inferSelect;
85+
export type ItemLoginSchemaWithItem = ItemLoginSchemaRaw & { item: ItemRaw };
86+
export type GuestInsertDTO = typeof accountsTable.$inferInsert;
87+
export type GuestRaw = Omit<typeof guestsView.$inferSelect, 'type'> & {
88+
type: 'guest';
89+
};
90+
export type GuestWithItemLoginSchema = GuestRaw & {
91+
itemLoginSchema: ItemLoginSchemaRaw | null;
92+
};
93+
14394
// --- ItemVisibilities
14495
export type ItemVisibilityRaw = typeof itemVisibilitiesTable.$inferSelect;
14596
export type ItemVisibilityWithItem = ItemVisibilityRaw & {

src/services/action/action.service.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ import type { FastifyRequest } from 'fastify';
66
import { ClientManager } from '@graasp/sdk';
77

88
import { type DBConnection } from '../../drizzle/db';
9-
import type { ItemRaw } from '../../drizzle/types';
109
import { BaseLogger } from '../../logger';
1110
import { AccountType, type MaybeUser } from '../../types';
11+
import type { ItemRaw } from '../item/item';
1212
import { View, ViewOptions } from '../item/plugins/action/itemAction.schemas';
1313
import { MemberRepository } from '../member/member.repository';
1414
import { ActionRepository } from './action.repository';

src/services/auth/plugins/passport/plugin.test.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,11 @@ import {
1717
} from '../../../../config/secrets';
1818
import { resolveDependency } from '../../../../di/utils';
1919
import { db } from '../../../../drizzle/db';
20-
import { ItemRaw, MemberRaw } from '../../../../drizzle/types';
20+
import type { MemberRaw } from '../../../../drizzle/types';
2121
import { assertIsDefined } from '../../../../utils/assertions';
2222
import { BadCredentials } from '../../../../utils/errors';
2323
import { assertIsMember, assertIsMemberForTest } from '../../../authentication';
24+
import type { ItemRaw } from '../../../item/item';
2425
import { expectItem } from '../../../item/test/fixtures/items';
2526
import { MemberPasswordService } from '../password/password.service';
2627
import {

src/services/authorization.utils.spec.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,11 @@ import { ItemVisibilityType, PackedFolderItemFactory } from '@graasp/sdk';
66
import { ItemFactory } from '../../test/factories/item.factory';
77
import { MemberFactory } from '../../test/factories/member.factory';
88
import type { DBConnection } from '../drizzle/db';
9-
import type { ItemRaw, ItemVisibilityRaw, ItemVisibilityWithItem } from '../drizzle/types';
9+
import type { ItemVisibilityRaw, ItemVisibilityWithItem } from '../drizzle/types';
1010
import { AccountType, MinimalMember, PermissionLevel } from '../types';
1111
import { filterOutPackedDescendants } from './authorization.utils';
12-
import type { PackedItem } from './item/ItemWrapper';
12+
import type { ItemRaw } from './item/item';
13+
import type { PackedItem } from './item/packedItem.dto';
1314
import { ItemVisibilityRepository } from './item/plugins/itemVisibility/itemVisibility.repository';
1415
import { expectItem } from './item/test/fixtures/items.vitest';
1516
import { ItemMembershipRepository } from './itemMembership/membership.repository';

src/services/authorization.utils.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import { ItemVisibilityType, PermissionLevelCompare } from '@graasp/sdk';
22

33
import type { DBConnection } from '../drizzle/db';
4-
import type { ItemRaw, ItemWithCreator } from '../drizzle/types';
4+
import type { ItemWithCreator } from '../drizzle/types';
55
import type { MaybeUser } from '../types';
6-
import { ItemWrapper, type PackedItem } from './item/ItemWrapper';
6+
import type { ItemRaw } from './item/item';
7+
import { type PackedItem, PackedItemDTO } from './item/packedItem.dto';
78
import { ItemVisibilityRepository } from './item/plugins/itemVisibility/itemVisibility.repository';
89
import type { ItemsThumbnails } from './item/plugins/thumbnail/types';
910
import { ItemMembershipRepository } from './itemMembership/membership.repository';
@@ -114,7 +115,7 @@ export const filterOutPackedItems = async <T extends ItemRaw = ItemRaw>(
114115
);
115116
const thumbnails = itemsThumbnails?.[item.id];
116117
// return packed item
117-
return new ItemWrapper(
118+
return new PackedItemDTO(
118119
item,
119120
permission ? { permission } : undefined,
120121
visibilities?.data[item.id],
@@ -164,7 +165,7 @@ export const filterOutPackedDescendants = async (
164165
const permission = PermissionLevelCompare.getHighest(permissions);
165166
const itemVisibilities = visibilities.filter((t) => item.path.includes(t.item.path));
166167

167-
const packedItem = new ItemWrapper(
168+
const packedItem = new PackedItemDTO(
168169
item,
169170
permission ? { permission } : undefined,
170171
itemVisibilities,

src/services/authorizedItem.service.getPropertiesForItem.spec.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,11 @@ import { ItemVisibilityType } from '@graasp/sdk';
55
import { ItemFactory } from '../../test/factories/item.factory';
66
import { ItemVisibilityFactory } from '../../test/factories/itemVisibility.factory';
77
import type { DBConnection } from '../drizzle/db';
8-
import type { ItemMembershipWithItemAndAccount, ItemRaw } from '../drizzle/types';
8+
import type { ItemMembershipWithItemAndAccount } from '../drizzle/types';
99
import { PermissionLevel } from '../types';
1010
import { MemberCannotAccess, MemberCannotAdminItem, MemberCannotWriteItem } from '../utils/errors';
1111
import { AuthorizedItemService } from './authorizedItem.service';
12+
import type { ItemRaw } from './item/item';
1213
import { ItemRepository } from './item/item.repository';
1314
import { ItemVisibilityRepository } from './item/plugins/itemVisibility/itemVisibility.repository';
1415
import { ItemMembershipRepository } from './itemMembership/membership.repository';

src/services/authorizedItem.service.getPropertiesForItems.spec.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,11 @@ import { ItemVisibilityType } from '@graasp/sdk';
55
import { ItemFactory } from '../../test/factories/item.factory';
66
import { ItemVisibilityFactory } from '../../test/factories/itemVisibility.factory';
77
import type { DBConnection } from '../drizzle/db';
8-
import type { ItemMembershipWithItemAndAccount, ItemRaw } from '../drizzle/types';
8+
import type { ItemMembershipWithItemAndAccount } from '../drizzle/types';
99
import { PermissionLevel } from '../types';
1010
import { MemberCannotAccess, MemberCannotAdminItem, MemberCannotWriteItem } from '../utils/errors';
1111
import { AuthorizedItemService } from './authorizedItem.service';
12+
import type { ItemRaw } from './item/item';
1213
import { ItemRepository } from './item/item.repository';
1314
import { ItemVisibilityRepository } from './item/plugins/itemVisibility/itemVisibility.repository';
1415
import { ItemMembershipRepository } from './itemMembership/membership.repository';

0 commit comments

Comments
 (0)