Skip to content

Commit bc32b15

Browse files
feat: use deprecated_at field
1 parent 2c53431 commit bc32b15

5 files changed

Lines changed: 82 additions & 42 deletions

File tree

snapshots/collections-schema.yml

Lines changed: 72 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -801,7 +801,7 @@ fields:
801801
readonly: true
802802
required: false
803803
searchable: true
804-
sort: null
804+
sort: 10
805805
special:
806806
- date-created
807807
translations: null
@@ -826,35 +826,35 @@ fields:
826826
foreign_key_table: null
827827
foreign_key_column: null
828828
- collection: directus_users
829-
field: date_updated
830-
type: timestamp
829+
field: notification_preferences
830+
type: json
831831
meta:
832832
collection: directus_users
833833
conditions: null
834834
display: null
835835
display_options: null
836-
field: date_updated
836+
field: notification_preferences
837837
group: null
838-
hidden: false
839-
interface: datetime
838+
hidden: true
839+
interface: input-code
840840
note: null
841-
options: {}
842-
readonly: true
841+
options: null
842+
readonly: false
843843
required: false
844844
searchable: true
845-
sort: 10
845+
sort: 8
846846
special:
847-
- date-updated
847+
- cast-json
848848
translations: null
849849
validation: null
850850
validation_message: null
851851
width: full
852852
schema:
853-
name: date_updated
853+
name: notification_preferences
854854
table: directus_users
855-
data_type: timestamp
855+
data_type: longtext
856856
default_value: null
857-
max_length: null
857+
max_length: 4294967295
858858
numeric_precision: null
859859
numeric_scale: null
860860
is_nullable: true
@@ -867,35 +867,75 @@ fields:
867867
foreign_key_table: null
868868
foreign_key_column: null
869869
- collection: directus_users
870-
field: notification_preferences
871-
type: json
870+
field: deprecated_prefix
871+
type: string
872872
meta:
873873
collection: directus_users
874874
conditions: null
875875
display: null
876876
display_options: null
877-
field: notification_preferences
877+
field: deprecated_prefix
878878
group: null
879-
hidden: true
880-
interface: input-code
879+
hidden: false
880+
interface: input
881881
note: null
882882
options: null
883883
readonly: false
884884
required: false
885885
searchable: true
886-
sort: 8
886+
sort: 9
887+
special: null
888+
translations: null
889+
validation: null
890+
validation_message: null
891+
width: full
892+
schema:
893+
name: deprecated_prefix
894+
table: directus_users
895+
data_type: varchar
896+
default_value: null
897+
max_length: 255
898+
numeric_precision: null
899+
numeric_scale: null
900+
is_nullable: true
901+
is_unique: false
902+
is_indexed: true
903+
is_primary_key: false
904+
is_generated: false
905+
generation_expression: null
906+
has_auto_increment: false
907+
foreign_key_table: null
908+
foreign_key_column: null
909+
- collection: directus_users
910+
field: date_updated
911+
type: timestamp
912+
meta:
913+
collection: directus_users
914+
conditions: null
915+
display: null
916+
display_options: null
917+
field: date_updated
918+
group: null
919+
hidden: false
920+
interface: datetime
921+
note: null
922+
options: {}
923+
readonly: true
924+
required: false
925+
searchable: true
926+
sort: 11
887927
special:
888-
- cast-json
928+
- date-updated
889929
translations: null
890930
validation: null
891931
validation_message: null
892932
width: full
893933
schema:
894-
name: notification_preferences
934+
name: date_updated
895935
table: directus_users
896-
data_type: longtext
936+
data_type: timestamp
897937
default_value: null
898-
max_length: 4294967295
938+
max_length: null
899939
numeric_precision: null
900940
numeric_scale: null
901941
is_nullable: true
@@ -908,39 +948,39 @@ fields:
908948
foreign_key_table: null
909949
foreign_key_column: null
910950
- collection: directus_users
911-
field: deprecated_prefix
912-
type: string
951+
field: suspended_at
952+
type: timestamp
913953
meta:
914954
collection: directus_users
915955
conditions: null
916956
display: null
917957
display_options: null
918-
field: deprecated_prefix
958+
field: suspended_at
919959
group: null
920960
hidden: false
921-
interface: input
961+
interface: datetime
922962
note: null
923963
options: null
924964
readonly: false
925965
required: false
926966
searchable: true
927-
sort: 9
967+
sort: 12
928968
special: null
929969
translations: null
930970
validation: null
931971
validation_message: null
932972
width: full
933973
schema:
934-
name: deprecated_prefix
974+
name: suspended_at
935975
table: directus_users
936-
data_type: varchar
976+
data_type: timestamp
937977
default_value: null
938-
max_length: 255
978+
max_length: null
939979
numeric_precision: null
940980
numeric_scale: null
941981
is_nullable: true
942982
is_unique: false
943-
is_indexed: true
983+
is_indexed: false
944984
is_primary_key: false
945985
is_generated: false
946986
generation_expression: null

src/extensions/operations/remove-banned-users-cron-handler/src/actions/remove-banned-users.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,5 +34,5 @@ export const removeBannedUsers = async (context: OperationContext) => {
3434
};
3535

3636
const isSuspensionExpired = (user: DirectusUser) => {
37-
return !!user.date_updated && Date.now() - new Date(user.date_updated).getTime() > SUSPENSION_PERIOD;
37+
return !!user.suspended_at && Date.now() - new Date(user.suspended_at).getTime() > SUSPENSION_PERIOD;
3838
};

src/extensions/operations/remove-banned-users-cron-handler/src/repositories/directus.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export const getDirectusUsers = async ({ services, getSchema }: OperationContext
1010
});
1111

1212
const result = await usersService.readByQuery({
13-
fields: [ 'id', 'external_identifier', 'github_username', 'status', 'date_updated' ],
13+
fields: [ 'id', 'external_identifier', 'github_username', 'status', 'suspended_at' ],
1414
}) as DirectusUser[];
1515
return result;
1616
};
@@ -23,7 +23,7 @@ export const suspendUser = async (user: DirectusUser, context: OperationContext)
2323
await database.transaction(async (trx) => {
2424
const usersService = new UsersService({ schema, knex: trx });
2525

26-
await usersService.updateOne(user.id, { status: 'suspended' });
26+
await usersService.updateOne(user.id, { status: 'suspended', suspended_at: new Date().toISOString() });
2727
await deleteUserTokens(user, trx, context);
2828
});
2929
};
@@ -46,7 +46,7 @@ export const activateUser = async (user: DirectusUser, { services, getSchema }:
4646
schema: await getSchema(),
4747
});
4848

49-
await usersService.updateOne(user.id, { status: 'active' });
49+
await usersService.updateOne(user.id, { status: 'active', suspended_at: null });
5050
};
5151

5252
export const deleteUser = async (user: DirectusUser, { services, getSchema }: OperationContext) => {

src/extensions/operations/remove-banned-users-cron-handler/src/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@ export type DirectusUser = {
33
external_identifier: string;
44
github_username: string | null;
55
status: string;
6-
date_updated: string | null;
6+
suspended_at: string | null;
77
};

src/extensions/operations/remove-banned-users-cron-handler/test/api.test.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ describe('Remove banned users CRON handler', () => {
8080
const result = await operationApi.handler({}, context);
8181

8282
expect(nock.isDone()).to.equal(true);
83-
expect(updateOne.calledOnceWithExactly('2', { status: 'suspended' })).to.equal(true);
83+
expect(updateOne.calledOnceWith('2', sinon.match({ status: 'suspended', suspended_at: sinon.match.string }))).to.equal(true);
8484
expect(deleteByQuery.calledOnceWithExactly({ filter: { user_created: { _eq: '2' } } })).to.equal(true);
8585
expect(deleteOne.callCount).to.equal(0);
8686
expect(result).to.equal('Users suspended: [2]; activated: []; deleted: [].');
@@ -92,15 +92,15 @@ describe('Remove banned users CRON handler', () => {
9292
github_username: 'restored_user',
9393
external_identifier: '2',
9494
status: 'suspended',
95-
date_updated: new Date().toISOString(),
95+
suspended_at: new Date().toISOString(),
9696
}]);
9797

9898
nockGithubLogins([{ databaseId: 2 }]);
9999

100100
const result = await operationApi.handler({}, context);
101101

102102
expect(nock.isDone()).to.equal(true);
103-
expect(updateOne.calledOnceWithExactly('2', { status: 'active' })).to.equal(true);
103+
expect(updateOne.calledOnceWithExactly('2', { status: 'active', suspended_at: null })).to.equal(true);
104104
expect(deleteOne.callCount).to.equal(0);
105105
expect(result).to.equal('Users suspended: []; activated: [2]; deleted: [].');
106106
});
@@ -111,7 +111,7 @@ describe('Remove banned users CRON handler', () => {
111111
github_username: 'banned_user',
112112
external_identifier: '2',
113113
status: 'suspended',
114-
date_updated: yearAgo(),
114+
suspended_at: yearAgo(),
115115
}]);
116116

117117
nockGithubLogins([ null ]);
@@ -131,7 +131,7 @@ describe('Remove banned users CRON handler', () => {
131131
github_username: 'banned_user',
132132
external_identifier: '2',
133133
status: 'suspended',
134-
date_updated: new Date().toISOString(),
134+
suspended_at: new Date().toISOString(),
135135
}]);
136136

137137
nockGithubLogins([ null ]);

0 commit comments

Comments
 (0)