feat: add github integration support
This commit is contained in:
parent
ac930cd05e
commit
12fe9f0384
@ -10,6 +10,54 @@ import { OPENAPI_TAG } from '../../utils/const';
|
|||||||
import { OpenApiMeta } from 'trpc-openapi';
|
import { OpenApiMeta } from 'trpc-openapi';
|
||||||
import { FeedChannelModelSchema, FeedEventModelSchema } from '../../prisma/zod';
|
import { FeedChannelModelSchema, FeedEventModelSchema } from '../../prisma/zod';
|
||||||
import { prisma } from '../../model/_client';
|
import { prisma } from '../../model/_client';
|
||||||
|
import _ from 'lodash';
|
||||||
|
|
||||||
|
export const feedIntegrationRouter = router({
|
||||||
|
github: publicProcedure
|
||||||
|
.meta(
|
||||||
|
buildFeedPublicOpenapi({
|
||||||
|
method: 'POST',
|
||||||
|
path: '/{channelId}/github',
|
||||||
|
})
|
||||||
|
)
|
||||||
|
.input(
|
||||||
|
z
|
||||||
|
.object({
|
||||||
|
channelId: z.string(),
|
||||||
|
})
|
||||||
|
.passthrough()
|
||||||
|
)
|
||||||
|
.output(z.string())
|
||||||
|
.mutation(async ({ input, ctx }) => {
|
||||||
|
const eventType = ctx.req.headers['X-GitHub-Event'];
|
||||||
|
const { channelId, ...data } = input;
|
||||||
|
|
||||||
|
if (eventType === 'push') {
|
||||||
|
const pusher = `${_.get(data, 'pusher.name')}<${_.get(data, 'pusher.email')}>`;
|
||||||
|
const commits = _.map(_.get(data, 'commits') as any[], 'id').join(', ');
|
||||||
|
const fullName = _.get(data, 'repository.full_name');
|
||||||
|
const ref = String(_.get(data, 'ref'));
|
||||||
|
const senderId = String(_.get(data, 'sender.id'));
|
||||||
|
const senderName = String(_.get(data, 'sender.login'));
|
||||||
|
const url = String(_.get(data, 'compare'));
|
||||||
|
await prisma.feedEvent.create({
|
||||||
|
data: {
|
||||||
|
channelId: channelId,
|
||||||
|
eventName: 'push',
|
||||||
|
eventContent: `${pusher} push commit ${commits} to [${ref}] in ${fullName}`,
|
||||||
|
tags: [],
|
||||||
|
source: 'github',
|
||||||
|
senderId,
|
||||||
|
senderName,
|
||||||
|
important: false,
|
||||||
|
url,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return 'ok';
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
export const feedRouter = router({
|
export const feedRouter = router({
|
||||||
channels: workspaceProcedure
|
channels: workspaceProcedure
|
||||||
@ -183,14 +231,12 @@ export const feedRouter = router({
|
|||||||
return channel;
|
return channel;
|
||||||
}),
|
}),
|
||||||
sendEvent: publicProcedure
|
sendEvent: publicProcedure
|
||||||
.meta({
|
.meta(
|
||||||
openapi: {
|
buildFeedPublicOpenapi({
|
||||||
tags: [OPENAPI_TAG.FEED],
|
|
||||||
protect: false,
|
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
path: '/feed/{channelId}/send',
|
path: '/{channelId}/send',
|
||||||
},
|
})
|
||||||
})
|
)
|
||||||
.input(
|
.input(
|
||||||
FeedEventModelSchema.pick({
|
FeedEventModelSchema.pick({
|
||||||
eventName: true,
|
eventName: true,
|
||||||
@ -219,6 +265,7 @@ export const feedRouter = router({
|
|||||||
|
|
||||||
return event;
|
return event;
|
||||||
}),
|
}),
|
||||||
|
integration: feedIntegrationRouter,
|
||||||
});
|
});
|
||||||
|
|
||||||
function buildFeedOpenapi(meta: OpenApiMetaInfo): OpenApiMeta {
|
function buildFeedOpenapi(meta: OpenApiMetaInfo): OpenApiMeta {
|
||||||
@ -231,3 +278,14 @@ function buildFeedOpenapi(meta: OpenApiMetaInfo): OpenApiMeta {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function buildFeedPublicOpenapi(meta: OpenApiMetaInfo): OpenApiMeta {
|
||||||
|
return {
|
||||||
|
openapi: {
|
||||||
|
tags: [OPENAPI_TAG.FEED],
|
||||||
|
protect: false,
|
||||||
|
...meta,
|
||||||
|
path: `/feed${meta.path}`,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user