@ -52,6 +52,7 @@ const userSchema: JSONSchema = {
properties : {
id : { type : 'string' } ,
name : { type : 'string' } ,
group : { type : 'string' } ,
created : { type : 'number' } ,
} ,
}
@ -111,17 +112,17 @@ function doPostRoute(server: fastify.FastifyInstance<Server, IncomingMessage, Se
}
server . post < DefaultQuery , DefaultParams , DefaultHeaders , Body > ( '/api/post' , options , async ( request , reply ) = > {
if ( ! request . us er) return unauthorizedError ( reply )
if ( ! request . view er) return unauthorizedError ( reply )
let newPostRelationship : IPostRelationship = null
const postContainer = await containerFor ( server . database . client , 'Posts' )
const postRelationshipContainer = await containerFor ( server . database . client , 'PostRelationships' )
const userContainer = await containerFor ( server . database . client , 'Users' )
const { resource : us er } = await userContainer . item ( request . us er. id , request . us er. id ) . read < IUser > ( )
const { resource : view er } = await userContainer . item ( request . view er. id , request . view er. id ) . read < IUser > ( )
if ( us er. pending ) return badRequestError ( reply , 'User requires approval' )
if ( us er. group === '' ) return badRequestError ( reply , 'User must belong to a group' )
if ( view er. pending ) return badRequestError ( reply , 'User requires approval' )
if ( view er. group === '' ) return badRequestError ( reply , 'User must belong to a group' )
const postId = createPostId ( )
@ -144,7 +145,7 @@ function doPostRoute(server: fastify.FastifyInstance<Server, IncomingMessage, Se
const post : IPost = {
id : postId ,
userId : request.us er.id ,
userId : request.view er.id ,
root : newPostRelationship ? newPostRelationship.partitionKey : postId ,
parents : newPostRelationship ? newPostRelationship . parents : [ ] ,
text : trimContent ( request . body . text , 1000 ) ,
@ -157,7 +158,7 @@ function doPostRoute(server: fastify.FastifyInstance<Server, IncomingMessage, Se
const userPost : IUserPost = {
postId ,
partitionKey : request.us er.id ,
partitionKey : request.view er.id ,
type : 'post' ,
created : Date.now ( ) ,
}
@ -167,14 +168,14 @@ function doPostRoute(server: fastify.FastifyInstance<Server, IncomingMessage, Se
if ( newPostRelationship ) await postRelationshipContainer . items . create < IPostRelationship > ( newPostRelationship )
const query = createQuerySpec ( ` SELECT u.id FROM Users u WHERE u.partitionKey = @partitionKey AND u.type = 'subscription' ` , { partitionKey : request.us er.id } )
const query = createQuerySpec ( ` SELECT u.id FROM Users u WHERE u.partitionKey = @partitionKey AND u.type = 'subscription' ` , { partitionKey : request.view er.id } )
const { resources : subscribers } = await userContainer . items . query < IUserSubscription > ( query , { } ) . fetchAll ( )
if ( subscribers . length < 5 00) {
for ( let subscriber in subscribers ) {
if ( subscribers . length < 1 00) {
for ( const subscriber of subscribers ) {
await userContainer . items . create < IUserTimelinePost > ( {
postId ,
partitionKey : subscribers [ subscriber ] . id ,
partitionKey : subscriber.id ,
type : 'timeline' ,
created : Date.now ( ) ,
} )
@ -224,26 +225,31 @@ function postsByUserRoute(server: fastify.FastifyInstance<Server, IncomingMessag
if ( ! user ) return notFoundError ( reply )
if ( user . private ) {
if ( ! request . user ) return unauthorizedError ( reply )
const query = createQuerySpec ( `
SELECT u . id FROM Users u WHERE
u . id = @viewer
u . partitionKey = @user AND
u . type = 'subscription' AND
u . pending = false
` , {
viewer : request.user.id ,
user : user.id ,
} )
const { resources : subscriptions } = await userContainer . items . query < IUserSubscription > ( query , { } ) . fetchAll ( )
if ( subscriptions . length === 0 ) return unauthorizedError ( reply )
switch ( user . privacy ) {
case 'approve' :
case 'private' :
if ( ! request . viewer ) return unauthorizedError ( reply )
const query = createQuerySpec ( `
SELECT u . id FROM Users u WHERE
u . id = @viewer
u . partitionKey = @user AND
u . type = 'subscription' AND
u . pending = false
` , {
viewer : request.viewer.id ,
user : user.id ,
} )
const { resources : subscriptions } = await userContainer . items . query < IUserSubscription > ( query , { } ) . fetchAll ( )
if ( subscriptions . length === 0 ) return unauthorizedError ( reply )
case 'group' :
if ( ! request . viewer ) return unauthorizedError ( reply )
const { resource : viewer } = await userContainer . item ( request . viewer . id , request . viewer . id ) . read < IUser > ( )
}
if ( request . user ) {
const { resource : viewer } = await userContainer . item ( request . user . id , request . user . id ) . read < IUser > ( )
if ( request . view er) {
const { resource : viewer } = await userContainer . item ( request . view er. id , request . view er. id ) . read < IUser > ( )
const query = createQuerySpec ( `
SELECT u . id FROM Users u WHERE
( u . blockedId = @viewer OR u . blockedId = @viewerGroup )