# Migrate Attachment Author to CreatedBy Field **Twill Task**: https://twill.ai/twentyhq/ENG/tasks/7 ## Summary This PR implements a migration to transition the `Attachment` object from using an `author` relation field to using the standard `createdBy` field, addressing issue https://github.com/twentyhq/core-team-issues/issues/1594. ## Changes - **Added migration command** (`1-8-migrate-attachment-author-to-created-by.command.ts`): - Migrates existing attachment data to use `createdBy` instead of `author` - Ensures data integrity during the transition to the standard field pattern - **Updated Attachment workspace entity**: - Added `createdBy` relation field to the `Attachment` standard object - Registered new field ID in `standard-field-ids.ts` constants - **Integrated migration into upgrade pipeline**: - Added migration module for version 1.8 - Registered in the main upgrade version command module This change aligns the `Attachment` object with Twenty's standard field conventions by using the built-in `createdBy` field instead of a custom `author` field. --- Fixes https://github.com/twentyhq/core-team-issues/issues/1594 --------- Co-authored-by: Twill <agent@twill.ai> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Félix Malfait <felix.malfait@gmail.com> Co-authored-by: Félix Malfait <felix@twenty.com>
73 lines
2.1 KiB
TypeScript
73 lines
2.1 KiB
TypeScript
import request from 'supertest';
|
|
|
|
const client = request(`http://localhost:${APP_PORT}`);
|
|
|
|
describe('attachmentsResolver (e2e)', () => {
|
|
it('should find many attachments', () => {
|
|
const queryData = {
|
|
query: `
|
|
query attachments {
|
|
attachments {
|
|
edges {
|
|
node {
|
|
name
|
|
fullPath
|
|
type
|
|
id
|
|
createdAt
|
|
updatedAt
|
|
deletedAt
|
|
authorId
|
|
taskId
|
|
noteId
|
|
personId
|
|
companyId
|
|
opportunityId
|
|
petId
|
|
surveyResultId
|
|
}
|
|
}
|
|
}
|
|
}
|
|
`,
|
|
};
|
|
|
|
return client
|
|
.post('/graphql')
|
|
.set('Authorization', `Bearer ${APPLE_JANE_ADMIN_ACCESS_TOKEN}`)
|
|
.send(queryData)
|
|
.expect(200)
|
|
.expect((res) => {
|
|
expect(res.body.data).toBeDefined();
|
|
expect(res.body.errors).toBeUndefined();
|
|
})
|
|
.expect((res) => {
|
|
const data = res.body.data.attachments;
|
|
|
|
expect(data).toBeDefined();
|
|
expect(Array.isArray(data.edges)).toBe(true);
|
|
|
|
const edges = data.edges;
|
|
|
|
if (edges.length > 0) {
|
|
const attachments = edges[0].node;
|
|
|
|
expect(attachments).toHaveProperty('name');
|
|
expect(attachments).toHaveProperty('fullPath');
|
|
expect(attachments).toHaveProperty('type');
|
|
expect(attachments).toHaveProperty('id');
|
|
expect(attachments).toHaveProperty('createdAt');
|
|
expect(attachments).toHaveProperty('updatedAt');
|
|
expect(attachments).toHaveProperty('deletedAt');
|
|
expect(attachments).toHaveProperty('taskId');
|
|
expect(attachments).toHaveProperty('noteId');
|
|
expect(attachments).toHaveProperty('personId');
|
|
expect(attachments).toHaveProperty('companyId');
|
|
expect(attachments).toHaveProperty('opportunityId');
|
|
expect(attachments).toHaveProperty('petId');
|
|
expect(attachments).toHaveProperty('surveyResultId');
|
|
}
|
|
});
|
|
});
|
|
});
|