vr-migrations 1.0.24 → 1.0.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
// migrations/XXXXXXXXXXXXXX-create-phone-contacts.js
|
|
2
|
+
"use strict";
|
|
3
|
+
|
|
4
|
+
module.exports = {
|
|
5
|
+
async up(queryInterface, Sequelize) {
|
|
6
|
+
await queryInterface.createTable("phone_contacts", {
|
|
7
|
+
id: {
|
|
8
|
+
type: Sequelize.UUID,
|
|
9
|
+
defaultValue: Sequelize.UUIDV4,
|
|
10
|
+
primaryKey: true,
|
|
11
|
+
allowNull: false,
|
|
12
|
+
},
|
|
13
|
+
phoneNumber: {
|
|
14
|
+
type: Sequelize.STRING(20),
|
|
15
|
+
allowNull: false,
|
|
16
|
+
unique: true,
|
|
17
|
+
},
|
|
18
|
+
userId: {
|
|
19
|
+
type: Sequelize.UUID,
|
|
20
|
+
allowNull: true,
|
|
21
|
+
references: {
|
|
22
|
+
model: "users",
|
|
23
|
+
key: "id",
|
|
24
|
+
},
|
|
25
|
+
onUpdate: "CASCADE",
|
|
26
|
+
onDelete: "SET NULL",
|
|
27
|
+
},
|
|
28
|
+
isVerified: {
|
|
29
|
+
type: Sequelize.BOOLEAN,
|
|
30
|
+
allowNull: false,
|
|
31
|
+
defaultValue: false,
|
|
32
|
+
},
|
|
33
|
+
verifiedAt: {
|
|
34
|
+
type: Sequelize.DATE,
|
|
35
|
+
allowNull: true,
|
|
36
|
+
},
|
|
37
|
+
isPrimary: {
|
|
38
|
+
type: Sequelize.BOOLEAN,
|
|
39
|
+
allowNull: false,
|
|
40
|
+
defaultValue: false,
|
|
41
|
+
},
|
|
42
|
+
isActive: {
|
|
43
|
+
type: Sequelize.BOOLEAN,
|
|
44
|
+
allowNull: false,
|
|
45
|
+
defaultValue: true,
|
|
46
|
+
},
|
|
47
|
+
otp: {
|
|
48
|
+
type: Sequelize.STRING(10),
|
|
49
|
+
allowNull: true,
|
|
50
|
+
},
|
|
51
|
+
otpExpiresAt: {
|
|
52
|
+
type: Sequelize.DATE,
|
|
53
|
+
allowNull: true,
|
|
54
|
+
},
|
|
55
|
+
metadata: {
|
|
56
|
+
type: Sequelize.JSONB,
|
|
57
|
+
allowNull: false,
|
|
58
|
+
defaultValue: {},
|
|
59
|
+
},
|
|
60
|
+
createdAt: {
|
|
61
|
+
type: Sequelize.DATE,
|
|
62
|
+
allowNull: false,
|
|
63
|
+
defaultValue: Sequelize.literal("CURRENT_TIMESTAMP"),
|
|
64
|
+
},
|
|
65
|
+
updatedAt: {
|
|
66
|
+
type: Sequelize.DATE,
|
|
67
|
+
allowNull: false,
|
|
68
|
+
defaultValue: Sequelize.literal("CURRENT_TIMESTAMP"),
|
|
69
|
+
},
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
// Add indexes
|
|
73
|
+
await queryInterface.addIndex("phone_contacts", ["phoneNumber"], {
|
|
74
|
+
unique: true,
|
|
75
|
+
name: "phone_contacts_phone_number_unique",
|
|
76
|
+
});
|
|
77
|
+
await queryInterface.addIndex("phone_contacts", ["userId"], {
|
|
78
|
+
name: "phone_contacts_user_id_idx",
|
|
79
|
+
});
|
|
80
|
+
await queryInterface.addIndex(
|
|
81
|
+
"phone_contacts",
|
|
82
|
+
["isVerified", "isPrimary"],
|
|
83
|
+
{
|
|
84
|
+
name: "phone_contacts_verified_primary_idx",
|
|
85
|
+
}
|
|
86
|
+
);
|
|
87
|
+
await queryInterface.addIndex("phone_contacts", ["otpExpiresAt"], {
|
|
88
|
+
name: "phone_contacts_otp_expiry_idx",
|
|
89
|
+
});
|
|
90
|
+
},
|
|
91
|
+
|
|
92
|
+
async down(queryInterface) {
|
|
93
|
+
await queryInterface.dropTable("phone_contacts");
|
|
94
|
+
},
|
|
95
|
+
};
|
|
@@ -18,11 +18,7 @@ module.exports = {
|
|
|
18
18
|
type: Sequelize.STRING(100),
|
|
19
19
|
allowNull: false,
|
|
20
20
|
},
|
|
21
|
-
phoneNumber
|
|
22
|
-
type: Sequelize.STRING(100),
|
|
23
|
-
allowNull: false,
|
|
24
|
-
unique: true,
|
|
25
|
-
},
|
|
21
|
+
// phoneNumber REMOVED - now in phone_contacts
|
|
26
22
|
nationalId: {
|
|
27
23
|
type: Sequelize.STRING(100),
|
|
28
24
|
allowNull: true,
|
|
@@ -54,6 +50,16 @@ module.exports = {
|
|
|
54
50
|
type: Sequelize.STRING(100),
|
|
55
51
|
allowNull: true,
|
|
56
52
|
},
|
|
53
|
+
primaryPhoneId: {
|
|
54
|
+
type: Sequelize.UUID,
|
|
55
|
+
allowNull: true,
|
|
56
|
+
references: {
|
|
57
|
+
model: "phone_contacts",
|
|
58
|
+
key: "id",
|
|
59
|
+
},
|
|
60
|
+
onUpdate: "CASCADE",
|
|
61
|
+
onDelete: "SET NULL",
|
|
62
|
+
},
|
|
57
63
|
isActive: {
|
|
58
64
|
type: Sequelize.BOOLEAN,
|
|
59
65
|
allowNull: false,
|
|
@@ -68,23 +74,10 @@ module.exports = {
|
|
|
68
74
|
type: Sequelize.BOOLEAN,
|
|
69
75
|
defaultValue: false,
|
|
70
76
|
},
|
|
71
|
-
verified
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
},
|
|
76
|
-
verifiedAt: {
|
|
77
|
-
type: Sequelize.DATE,
|
|
78
|
-
allowNull: true,
|
|
79
|
-
},
|
|
80
|
-
otp: {
|
|
81
|
-
type: Sequelize.STRING(50),
|
|
82
|
-
allowNull: true,
|
|
83
|
-
},
|
|
84
|
-
otpExpiresAt: {
|
|
85
|
-
type: Sequelize.DATE,
|
|
86
|
-
allowNull: true,
|
|
87
|
-
},
|
|
77
|
+
// verified REMOVED - now in phone_contacts
|
|
78
|
+
// verifiedAt REMOVED - now in phone_contacts
|
|
79
|
+
// otp REMOVED - now in phone_contacts
|
|
80
|
+
// otpExpiresAt REMOVED - now in phone_contacts
|
|
88
81
|
lastLoginAt: {
|
|
89
82
|
type: Sequelize.DATE,
|
|
90
83
|
allowNull: true,
|
|
@@ -114,10 +107,11 @@ module.exports = {
|
|
|
114
107
|
},
|
|
115
108
|
});
|
|
116
109
|
|
|
117
|
-
//
|
|
118
|
-
await queryInterface.addIndex("users", ["phoneNumber"]);
|
|
110
|
+
// Add indexes
|
|
119
111
|
await queryInterface.addIndex("users", ["jacketId"]);
|
|
120
112
|
await queryInterface.addIndex("users", ["nationalId"]);
|
|
113
|
+
await queryInterface.addIndex("users", ["primaryPhoneId"]);
|
|
114
|
+
await queryInterface.addIndex("users", ["securityClearanceId"]);
|
|
121
115
|
},
|
|
122
116
|
|
|
123
117
|
async down(queryInterface) {
|
|
@@ -10,16 +10,81 @@ module.exports = {
|
|
|
10
10
|
const nid_3 = await bcrypt.hash("1199900000000003", 10);
|
|
11
11
|
const nid_4 = await bcrypt.hash("1199900000000004", 10);
|
|
12
12
|
|
|
13
|
+
// First create phone contacts
|
|
14
|
+
await queryInterface.bulkInsert("phone_contacts", [
|
|
15
|
+
{
|
|
16
|
+
id: "11111111-1111-1111-1111-111111111111",
|
|
17
|
+
phoneNumber: "+250788000001",
|
|
18
|
+
userId: "aaaaaaa1-aaaa-aaaa-aaaa-aaaaaaaaaaa1",
|
|
19
|
+
isVerified: true,
|
|
20
|
+
verifiedAt: now,
|
|
21
|
+
isPrimary: true,
|
|
22
|
+
isActive: true,
|
|
23
|
+
metadata: {},
|
|
24
|
+
createdAt: now,
|
|
25
|
+
updatedAt: now,
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
id: "22222222-2222-2222-2222-222222222222",
|
|
29
|
+
phoneNumber: "+250788000002",
|
|
30
|
+
userId: "aaaaaaa1-aaaa-aaaa-aaaa-aaaaaaaaaaa2",
|
|
31
|
+
isVerified: true,
|
|
32
|
+
verifiedAt: now,
|
|
33
|
+
isPrimary: true,
|
|
34
|
+
isActive: true,
|
|
35
|
+
metadata: {},
|
|
36
|
+
createdAt: now,
|
|
37
|
+
updatedAt: now,
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
id: "33333333-3333-3333-3333-333333333333",
|
|
41
|
+
phoneNumber: "+250788000003",
|
|
42
|
+
userId: "aaaaaaa2-aaaa-aaaa-aaaa-aaaaaaaaaaa3",
|
|
43
|
+
isVerified: true,
|
|
44
|
+
verifiedAt: now,
|
|
45
|
+
isPrimary: true,
|
|
46
|
+
isActive: true,
|
|
47
|
+
metadata: {},
|
|
48
|
+
createdAt: now,
|
|
49
|
+
updatedAt: now,
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
id: "44444444-4444-4444-4444-444444444444",
|
|
53
|
+
phoneNumber: "+250788000004",
|
|
54
|
+
userId: "aaaaaaa3-aaaa-aaaa-aaaa-aaaaaaaaaaa4",
|
|
55
|
+
isVerified: true,
|
|
56
|
+
verifiedAt: now,
|
|
57
|
+
isPrimary: true,
|
|
58
|
+
isActive: true,
|
|
59
|
+
metadata: {},
|
|
60
|
+
createdAt: now,
|
|
61
|
+
updatedAt: now,
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
id: "55555555-5555-5555-5555-555555555555",
|
|
65
|
+
phoneNumber: "+250788000005",
|
|
66
|
+
userId: "aaaaaaa4-aaaa-aaaa-aaaa-aaaaaaaaaaa5",
|
|
67
|
+
isVerified: true,
|
|
68
|
+
verifiedAt: now,
|
|
69
|
+
isPrimary: true,
|
|
70
|
+
isActive: true,
|
|
71
|
+
metadata: {},
|
|
72
|
+
createdAt: now,
|
|
73
|
+
updatedAt: now,
|
|
74
|
+
},
|
|
75
|
+
]);
|
|
76
|
+
|
|
77
|
+
// Then create users with primaryPhoneId reference
|
|
13
78
|
await queryInterface.bulkInsert("users", [
|
|
14
79
|
{
|
|
15
80
|
id: "aaaaaaa1-aaaa-aaaa-aaaa-aaaaaaaaaaa1",
|
|
16
81
|
firstName: "Jean",
|
|
17
82
|
lastName: "Rider",
|
|
18
|
-
phoneNumber: "0788000000",
|
|
19
83
|
nationalId: nid_1,
|
|
20
84
|
jacketId: "JACKET-R-001",
|
|
21
85
|
plateNumber: "RAD101A",
|
|
22
86
|
securityClearanceId: "11111111-1111-1111-1111-111111111111", // RIDER
|
|
87
|
+
primaryPhoneId: "11111111-1111-1111-1111-111111111111",
|
|
23
88
|
isActive: true,
|
|
24
89
|
lastLoginAt: null,
|
|
25
90
|
createdAt: now,
|
|
@@ -28,10 +93,10 @@ module.exports = {
|
|
|
28
93
|
id: "aaaaaaa1-aaaa-aaaa-aaaa-aaaaaaaaaaa2",
|
|
29
94
|
firstName: "Jane",
|
|
30
95
|
lastName: "Passenger",
|
|
31
|
-
phoneNumber: "0788000001",
|
|
32
96
|
email: "jane@passenger.com",
|
|
33
97
|
password: passwordHash,
|
|
34
|
-
securityClearanceId: "22222222-2222-2222-2222-222222222222", //
|
|
98
|
+
securityClearanceId: "22222222-2222-2222-2222-222222222222", // PASSENGER
|
|
99
|
+
primaryPhoneId: "22222222-2222-2222-2222-222222222222",
|
|
35
100
|
isActive: true,
|
|
36
101
|
lastLoginAt: null,
|
|
37
102
|
createdAt: now,
|
|
@@ -40,11 +105,11 @@ module.exports = {
|
|
|
40
105
|
id: "aaaaaaa2-aaaa-aaaa-aaaa-aaaaaaaaaaa3",
|
|
41
106
|
firstName: "Alice",
|
|
42
107
|
lastName: "Agent",
|
|
43
|
-
phoneNumber: "0788000002",
|
|
44
108
|
nationalId: nid_2,
|
|
45
109
|
email: "alice@agent.com",
|
|
46
110
|
password: passwordHash,
|
|
47
111
|
securityClearanceId: "33333333-3333-3333-3333-333333333333", // AGENT
|
|
112
|
+
primaryPhoneId: "33333333-3333-3333-3333-333333333333",
|
|
48
113
|
isActive: true,
|
|
49
114
|
lastLoginAt: null,
|
|
50
115
|
createdAt: now,
|
|
@@ -53,11 +118,11 @@ module.exports = {
|
|
|
53
118
|
id: "aaaaaaa3-aaaa-aaaa-aaaa-aaaaaaaaaaa4",
|
|
54
119
|
firstName: "Eric",
|
|
55
120
|
lastName: "Admin",
|
|
56
|
-
phoneNumber: "0788000003",
|
|
57
121
|
nationalId: nid_3,
|
|
58
122
|
email: "eric@admin.com",
|
|
59
123
|
password: passwordHash,
|
|
60
124
|
securityClearanceId: "44444444-4444-4444-4444-444444444444", // ADMIN
|
|
125
|
+
primaryPhoneId: "44444444-4444-4444-4444-444444444444",
|
|
61
126
|
isActive: true,
|
|
62
127
|
lastLoginAt: null,
|
|
63
128
|
createdAt: now,
|
|
@@ -66,12 +131,11 @@ module.exports = {
|
|
|
66
131
|
id: "aaaaaaa4-aaaa-aaaa-aaaa-aaaaaaaaaaa5",
|
|
67
132
|
firstName: "Super",
|
|
68
133
|
lastName: "Admin",
|
|
69
|
-
phoneNumber: "0788123456",
|
|
70
134
|
email: "super@admin.com",
|
|
71
135
|
password: passwordHash,
|
|
72
136
|
nationalId: nid_4,
|
|
73
|
-
plateNumber: null,
|
|
74
137
|
securityClearanceId: "55555555-5555-5555-5555-555555555555", // SUPER_ADMIN
|
|
138
|
+
primaryPhoneId: "55555555-5555-5555-5555-555555555555",
|
|
75
139
|
isActive: true,
|
|
76
140
|
lastLoginAt: null,
|
|
77
141
|
createdAt: now,
|
|
@@ -80,13 +144,7 @@ module.exports = {
|
|
|
80
144
|
},
|
|
81
145
|
|
|
82
146
|
async down(queryInterface) {
|
|
83
|
-
await queryInterface.bulkDelete("
|
|
84
|
-
|
|
85
|
-
"aaaaaaa1-aaaa-aaaa-aaaa-aaaaaaaaaaa1",
|
|
86
|
-
"aaaaaaa2-aaaa-aaaa-aaaa-aaaaaaaaaaa2",
|
|
87
|
-
"aaaaaaa3-aaaa-aaaa-aaaa-aaaaaaaaaaa3",
|
|
88
|
-
"aaaaaaa4-aaaa-aaaa-aaaa-aaaaaaaaaaa4",
|
|
89
|
-
],
|
|
90
|
-
});
|
|
147
|
+
await queryInterface.bulkDelete("phone_contacts", null, {});
|
|
148
|
+
await queryInterface.bulkDelete("users", null, {});
|
|
91
149
|
},
|
|
92
150
|
};
|