@@ -87,6 +87,7 @@ import { randomUUID } from 'crypto';
8787import { SourceMemberRoles } from '../roles' ;
8888import { ContentPreferenceKeyword } from '../entity/contentPreference/ContentPreferenceKeyword' ;
8989import { briefingPostIdsMaxItems } from '../common/brief' ;
90+ import { NO_AI_BLOCKED_TAGS , NO_AI_BLOCKED_WORDS } from '../common/noAiFilter' ;
9091
9192interface GQLTagsCategory {
9293 id : string ;
@@ -394,6 +395,11 @@ export const typeDefs = /* GraphQL */ `
394395 Array of supported post types
395396 """
396397 supportedTypes: [String!]
398+
399+ """
400+ Exclude AI-related content from the feed
401+ """
402+ noAi: Boolean = false
397403 ): PostConnection! @auth
398404
399405 """
@@ -1120,6 +1126,7 @@ interface AnonymousFeedArgs extends FeedArgs {
11201126interface ConfiguredFeedArgs extends FeedArgs {
11211127 unreadOnly : boolean ;
11221128 version : number ;
1129+ noAi ?: boolean ;
11231130}
11241131
11251132interface SourceFeedArgs extends FeedArgs {
@@ -1364,6 +1371,27 @@ const anonymousFeedResolverV1: IFieldResolver<
13641371 { allowPrivatePosts : false } ,
13651372) ;
13661373
1374+ const mergeUniqueStrings = (
1375+ current : string [ ] | undefined ,
1376+ additions : readonly string [ ] ,
1377+ ) : string [ ] => Array . from ( new Set ( [ ...( current ?? [ ] ) , ...additions ] ) ) ;
1378+
1379+ const wrapGeneratorWithNoAi = ( generator : FeedGenerator ) : FeedGenerator =>
1380+ generator . withConfigTransform ( ( result ) => ( {
1381+ ...result ,
1382+ config : {
1383+ ...result . config ,
1384+ blocked_tags : mergeUniqueStrings (
1385+ result . config . blocked_tags ,
1386+ NO_AI_BLOCKED_TAGS ,
1387+ ) ,
1388+ blocked_title_words : mergeUniqueStrings (
1389+ result . config . blocked_title_words ,
1390+ NO_AI_BLOCKED_WORDS ,
1391+ ) ,
1392+ } ,
1393+ } ) ) ;
1394+
13671395const feedResolverV1 : IFieldResolver < unknown , Context , ConfiguredFeedArgs > =
13681396 feedResolver (
13691397 (
@@ -1387,10 +1415,8 @@ const feedResolverV1: IFieldResolver<unknown, Context, ConfiguredFeedArgs> =
13871415 feedPageGenerator ,
13881416 applyFeedPaging ,
13891417 {
1390- fetchQueryParams : async ( ctx , args ) => {
1391- const feedId = args . feedId || ctx . userId ;
1392- return feedToFilters ( ctx . con , feedId , ctx . userId ) ;
1393- } ,
1418+ fetchQueryParams : async ( ctx , args ) =>
1419+ feedToFilters ( ctx . con , args . feedId || ctx . userId , ctx . userId ) ,
13941420 allowPrivatePosts : false ,
13951421 } ,
13961422 ) ;
@@ -1567,22 +1593,26 @@ export const resolvers: IResolvers<unknown, BaseContext> = {
15671593 } ,
15681594 feed : ( source , args : ConfiguredFeedArgs , ctx : Context , info ) => {
15691595 if ( args . version >= 2 && args . ranking === Ranking . POPULARITY ) {
1596+ const generator = versionToFeedGenerator ( args . version ) ;
1597+
15701598 return feedResolverCursor (
15711599 source ,
15721600 {
15731601 ...( args as FeedArgs ) ,
1574- generator : versionToFeedGenerator ( args . version ) ,
1602+ generator : args . noAi ? wrapGeneratorWithNoAi ( generator ) : generator ,
15751603 } ,
15761604 ctx ,
15771605 info ,
15781606 ) ;
15791607 }
15801608 if ( args . version >= 2 && args . ranking === Ranking . TIME ) {
1609+ const generator = versionToTimeFeedGenerator ( args . version ) ;
1610+
15811611 return feedResolverCursor (
15821612 source ,
15831613 {
15841614 ...( args as FeedArgs ) ,
1585- generator : versionToTimeFeedGenerator ( args . version ) ,
1615+ generator : args . noAi ? wrapGeneratorWithNoAi ( generator ) : generator ,
15861616 } ,
15871617 ctx ,
15881618 info ,
0 commit comments