Tài liệu
Dòng hoạt động
Dòng hoạt động Ví dụ này ghi lại hoạt động của project và broadcast cập nhật đến những người đang xem cùng project. Table Tạo project_activity . Field hoặc relation Kiểu Ghi chú project relation many-to-one tới project Bắt buộc actor relation many-to-one tới enfyra_user Bắt buộc
Dòng hoạt động
Ví dụ này ghi lại hoạt động của project và broadcast cập nhật đến những người đang xem cùng project.
Table
Tạo project_activity.
| Field hoặc relation | Kiểu | Ghi chú |
|---|---|---|
project |
relation many-to-one tới project |
Bắt buộc |
actor |
relation many-to-one tới enfyra_user |
Bắt buộc |
kind |
string | Bắt buộc |
summary |
string | Bắt buộc |
payload |
simple-json | Không bắt buộc |
Post-hook sau khi thay đổi project
Thêm post-hook vào những route cần tạo bản ghi hoạt động.
if (@ERROR || !@DATA || !@USER?.id) {
return;
}
const projectId = @DATA.project?.id || @DATA.id;
if (!projectId) {
return;
}
const created = await #project_activity.create({
data: {
project: { id: projectId },
actor: { id: @USER.id },
kind: 'project.updated',
summary: 'Project was updated',
payload: { recordId: @DATA.id }
}
});
const activity = created.data?.[0] || null;
if (activity) {
@SOCKET.emitToRoom('/projects', `project:${projectId}`, 'activity:new', activity);
}
Tham gia project room
Tạo Socket.IO gateway /projects và event project:join.
if (!@USER?.id) {
@THROW401();
}
const projectId = @BODY.project;
const access = await #project_member.find({
filter: {
project: { id: { _eq: projectId } },
member: { id: { _eq: @USER.id } }
},
fields: 'id',
limit: 1
});
if (!access.data?.[0] && [email protected]) {
@THROW403();
}
@SOCKET.join(`project:${projectId}`);
return { joined: true };
Tải dòng hoạt động
curl "$ENFYRA_API_URL/project_activity?filter={\"project\":{\"id\":{\"_eq\":42}}}&fields=id,kind,summary,actor.email,createdAt&sort=-createdAt&limit=25" \
-H "Authorization: Bearer $ACCESS_TOKEN"