Skip to content

Commit 0da112e

Browse files
authored
Add the ability to crosspost (#33)
1 parent 6d751fc commit 0da112e

12 files changed

+306
-90
lines changed
+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { MigrationInterface, QueryRunner } from "typeorm";
2+
3+
export class Crossposts1666017751244 implements MigrationInterface {
4+
name = 'Crossposts1666017751244'
5+
6+
public async up(queryRunner: QueryRunner): Promise<void> {
7+
await queryRunner.query(`
8+
ALTER TABLE "realm_feed_item"
9+
ADD "crosspostedRealms" character varying array
10+
`);
11+
}
12+
13+
public async down(queryRunner: QueryRunner): Promise<void> {
14+
await queryRunner.query(`
15+
ALTER TABLE "realm_feed_item" DROP COLUMN "crosspostedRealms"
16+
`);
17+
}
18+
19+
}

src/ecosystem-feed/ecosystem-feed.service.ts

+4-49
Original file line numberDiff line numberDiff line change
@@ -40,37 +40,11 @@ export class EcosystemFeedService {
4040
requestingUser: User | null,
4141
environment: Environment,
4242
) {
43-
if (environment === 'devnet') {
44-
throw new errors.UnsupportedDevnet();
45-
}
46-
47-
const groups = this.groupEntitesByRealm(entities);
48-
const realms = Object.keys(groups);
49-
const feedItemsResp = await Promise.all(
50-
realms.map((realmPublicKeyStr) => {
51-
const groupEntities = groups[realmPublicKeyStr];
52-
53-
return this.realmFeedItemService.convertEntitiesToFeedItems(
54-
new PublicKey(realmPublicKeyStr),
55-
groupEntities,
56-
requestingUser,
57-
environment,
58-
)();
59-
}),
43+
return this.realmFeedItemService.convertMixedFeedEntitiesToFeedItem(
44+
entities,
45+
requestingUser,
46+
environment,
6047
);
61-
62-
const feedItems = feedItemsResp.reduce((acc, items) => {
63-
if (EI.isLeft(items)) {
64-
return acc;
65-
}
66-
67-
return {
68-
...acc,
69-
...items.right,
70-
};
71-
}, {} as { [id: string]: RealmFeedItemPost | RealmFeedItemProposal });
72-
73-
return feedItems;
7448
}
7549

7650
/**
@@ -292,25 +266,6 @@ export class EcosystemFeedService {
292266
throw new errors.MalformedRequest();
293267
}
294268

295-
/**
296-
* Group entities by the realm their in
297-
*/
298-
groupEntitesByRealm(entities: RealmFeedItemEntity[]) {
299-
const groups: {
300-
[realm: string]: RealmFeedItemEntity[];
301-
} = {};
302-
303-
for (const entity of entities) {
304-
if (!groups[entity.realmPublicKeyStr]) {
305-
groups[entity.realmPublicKeyStr] = [];
306-
}
307-
308-
groups[entity.realmPublicKeyStr].push(entity);
309-
}
310-
311-
return groups;
312-
}
313-
314269
/**
315270
* Create a cursor
316271
*/

src/realm-feed-item/entities/RealmFeedItem.entity.ts

+3
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ export class RealmFeedItem {
3939
@Column()
4040
realmPublicKeyStr: string;
4141

42+
@Column('varchar', { array: true, nullable: true })
43+
crosspostedRealms?: null | string[];
44+
4245
@OneToMany('RealmFeedItemComment', 'feedItem')
4346
comments: RealmFeedItemComment[];
4447

src/realm-feed-item/realm-feed-item.gql.service.ts

+50-24
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,12 @@ export class RealmFeedItemGQLService {
5353
this.realmFeedItemRepository
5454
.createQueryBuilder('feeditem')
5555
.where('feeditem.environment = :env', { env: environment })
56-
.andWhere('feeditem.realmPublicKeyStr = :pk', { pk: realmPublicKey.toBase58() })
56+
.andWhere(
57+
'((feeditem.realmPublicKeyStr = :pk) OR ((feedItem."crosspostedRealms" IS NOT NULL) AND (:pk = ANY(feedItem."crosspostedRealms"))))',
58+
{
59+
pk: realmPublicKey.toBase58(),
60+
},
61+
)
5762
.orderBy(this.orderByClause('feeditem', sortOrder))
5863
.limit(n)
5964
.getMany(),
@@ -85,7 +90,10 @@ export class RealmFeedItemGQLService {
8590
this.realmFeedItemRepository
8691
.createQueryBuilder('feeditem')
8792
.where('feeditem.environment = :env', { env: environment })
88-
.andWhere('feeditem.realmPublicKeyStr = :pk', { pk: realmPublicKey.toBase58() })
93+
.andWhere(
94+
'((feeditem.realmPublicKeyStr = :pk) OR ((feedItem."crosspostedRealms" IS NOT NULL) AND (:pk = ANY(feedItem."crosspostedRealms"))))',
95+
{ pk: realmPublicKey.toBase58() },
96+
)
8997
.orderBy(this.orderByClause('feeditem', sortOrder, false))
9098
.limit(n)
9199
.getMany(),
@@ -129,7 +137,10 @@ export class RealmFeedItemGQLService {
129137
this.realmFeedItemRepository
130138
.createQueryBuilder('feeditem')
131139
.where('feeditem.environment = :env', { env: environment })
132-
.andWhere('feeditem.realmPublicKeyStr = :pk', { pk: realmPublicKey.toBase58() })
140+
.andWhere(
141+
'((feeditem.realmPublicKeyStr = :pk) OR ((feedItem."crosspostedRealms" IS NOT NULL) AND (:pk = ANY(feedItem."crosspostedRealms"))))',
142+
{ pk: realmPublicKey.toBase58() },
143+
)
133144
.andWhere(afterClause.clause, afterClause.params)
134145
.orderBy(this.orderByClause('feeditem', sortOrder))
135146
.limit(n)
@@ -171,7 +182,10 @@ export class RealmFeedItemGQLService {
171182
this.realmFeedItemRepository
172183
.createQueryBuilder('feeditem')
173184
.where('feeditem.environment = :env', { env: environment })
174-
.andWhere('feeditem.realmPublicKeyStr = :pk', { pk: realmPublicKey.toBase58() })
185+
.andWhere(
186+
'((feeditem.realmPublicKeyStr = :pk) OR ((feedItem."crosspostedRealms" IS NOT NULL) AND (:pk = ANY(feedItem."crosspostedRealms"))))',
187+
{ pk: realmPublicKey.toBase58() },
188+
)
175189
.andWhere(beforeClause.clause, beforeClause.params)
176190
.orderBy(this.orderByClause('feeditem', sortOrder, false))
177191
.limit(n)
@@ -203,11 +217,14 @@ export class RealmFeedItemGQLService {
203217
this.getFirstNFeedItems(realmPublicKey, requestingUser, first, sortOrder, environment),
204218
TE.bindTo('entities'),
205219
TE.bindW('feedItems', ({ entities }) =>
206-
this.realmFeedItemService.convertEntitiesToFeedItems(
207-
realmPublicKey,
208-
entities,
209-
requestingUser,
210-
environment,
220+
TE.tryCatch(
221+
() =>
222+
this.realmFeedItemService.convertMixedFeedEntitiesToFeedItem(
223+
entities,
224+
requestingUser,
225+
environment,
226+
),
227+
(e) => new errors.Exception(e),
211228
),
212229
),
213230
TE.map(({ entities, feedItems }) => {
@@ -233,11 +250,14 @@ export class RealmFeedItemGQLService {
233250
this.getLastNFeedItems(realmPublicKey, requestingUser, last, sortOrder, environment),
234251
TE.bindTo('entities'),
235252
TE.bindW('feedItems', ({ entities }) =>
236-
this.realmFeedItemService.convertEntitiesToFeedItems(
237-
realmPublicKey,
238-
entities,
239-
requestingUser,
240-
environment,
253+
TE.tryCatch(
254+
() =>
255+
this.realmFeedItemService.convertMixedFeedEntitiesToFeedItem(
256+
entities,
257+
requestingUser,
258+
environment,
259+
),
260+
(e) => new errors.Exception(e),
241261
),
242262
),
243263
TE.map(({ entities, feedItems }) => {
@@ -270,11 +290,14 @@ export class RealmFeedItemGQLService {
270290
),
271291
TE.bindTo('entities'),
272292
TE.bindW('feedItems', ({ entities }) =>
273-
this.realmFeedItemService.convertEntitiesToFeedItems(
274-
realmPublicKey,
275-
entities,
276-
requestingUser,
277-
environment,
293+
TE.tryCatch(
294+
() =>
295+
this.realmFeedItemService.convertMixedFeedEntitiesToFeedItem(
296+
entities,
297+
requestingUser,
298+
environment,
299+
),
300+
(e) => new errors.Exception(e),
278301
),
279302
),
280303
TE.map(({ entities, feedItems }) => {
@@ -307,11 +330,14 @@ export class RealmFeedItemGQLService {
307330
),
308331
TE.bindTo('entities'),
309332
TE.bindW('feedItems', ({ entities }) =>
310-
this.realmFeedItemService.convertEntitiesToFeedItems(
311-
realmPublicKey,
312-
entities,
313-
requestingUser,
314-
environment,
333+
TE.tryCatch(
334+
() =>
335+
this.realmFeedItemService.convertMixedFeedEntitiesToFeedItem(
336+
entities,
337+
requestingUser,
338+
environment,
339+
),
340+
(e) => new errors.Exception(e),
315341
),
316342
),
317343
TE.map(({ entities, feedItems }) => {

src/realm-feed-item/realm-feed-item.resolver.ts

+14-1
Original file line numberDiff line numberDiff line change
@@ -305,8 +305,21 @@ export class RealmFeedItemResolver {
305305
@CurrentEnvironment()
306306
environment: Environment,
307307
@CurrentUser() user: User | null,
308+
@Args('crosspostTo', {
309+
type: () => [PublicKeyScalar],
310+
description: 'Optional realms to crosspost to',
311+
nullable: true,
312+
})
313+
crosspostTo?: null | PublicKey[],
308314
) {
309-
return this.realmFeedItemService.createPost(realm, title, document, user, environment);
315+
return this.realmFeedItemService.createPost({
316+
crosspostTo,
317+
document,
318+
environment,
319+
title,
320+
requestingUser: user,
321+
realmPublicKey: realm,
322+
});
310323
}
311324

312325
@Mutation(() => RealmFeedItem, {

0 commit comments

Comments
 (0)