Skip to content

Commit 7073bb4

Browse files
committed
Fix for prod data migration
1 parent 941ad70 commit 7073bb4

File tree

1 file changed

+145
-59
lines changed

1 file changed

+145
-59
lines changed

src/scripts/migrate-dynamo-data.js

Lines changed: 145 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1071,7 +1071,81 @@ async function importDynamoMemberStatHistory (filename, dateFilter = null) {
10711071
// count skipped items due to date filter
10721072
let skipped = 0
10731073
// store the temp json object string
1074-
let stringObject = ''
1074+
const processObjectString = async (objectString) => {
1075+
let candidate = objectString.trim()
1076+
if (!candidate) {
1077+
return false
1078+
}
1079+
1080+
if (candidate.endsWith(',')) {
1081+
candidate = candidate.slice(0, -1)
1082+
}
1083+
1084+
if (!candidate.startsWith('{') || !candidate.endsWith('}')) {
1085+
return false
1086+
}
1087+
1088+
let dataItem
1089+
try {
1090+
dataItem = JSON.parse(candidate)
1091+
} catch (err) {
1092+
// The buffer does not yet contain a complete JSON object; keep accumulating.
1093+
return false
1094+
}
1095+
1096+
count += 1
1097+
1098+
if (!shouldProcessRecord(dataItem, dateFilter)) {
1099+
skipped += 1
1100+
return true
1101+
}
1102+
1103+
const member = await prisma.member.findFirst({
1104+
where: {
1105+
userId: dataItem.userId
1106+
}
1107+
})
1108+
1109+
if (member) {
1110+
const statHistory = fixDynamoMemberStatHistoryData(dataItem)
1111+
1112+
if (!isEmpty(statHistory)) {
1113+
const createData = {
1114+
groupId: dataItem.groupId,
1115+
createdBy: CREATED_BY,
1116+
userId: member.userId
1117+
}
1118+
1119+
if (statHistory.develop) {
1120+
createData.develop = {
1121+
create: statHistory.develop
1122+
}
1123+
}
1124+
1125+
if (statHistory.dataScience) {
1126+
createData.dataScience = {
1127+
create: statHistory.dataScience
1128+
}
1129+
}
1130+
1131+
if (createData.develop || createData.dataScience) {
1132+
await prisma.memberHistoryStats.create({
1133+
data: createData,
1134+
include: { develop: true, dataScience: true }
1135+
})
1136+
total += 1
1137+
}
1138+
}
1139+
}
1140+
1141+
return true
1142+
}
1143+
1144+
let buffer = ''
1145+
let capturingObject = false
1146+
let depth = 0
1147+
let inString = false
1148+
let escapeNext = false
10751149

10761150
for await (const line of rlRead) {
10771151
currentLine += 1
@@ -1084,61 +1158,63 @@ async function importDynamoMemberStatHistory (filename, dateFilter = null) {
10841158
// Write the new percentage
10851159
process.stdout.write(`Migrate Progress: ${percentage}%, read ${count} items, skipped ${skipped}`)
10861160
}
1161+
for (let idx = 0; idx < line.length; idx += 1) {
1162+
const char = line[idx]
10871163

1088-
// paste line string data, and combine to member data
1089-
const trimmedLine = line.trimEnd()
1090-
if (trimmedLine === ' },') {
1091-
stringObject += '}'
1092-
if (stringObject.length <= 2) {
1164+
if (!capturingObject) {
1165+
if (char === '{') {
1166+
capturingObject = true
1167+
buffer = '{'
1168+
depth = 1
1169+
inString = false
1170+
escapeNext = false
1171+
}
10931172
continue
10941173
}
1095-
count += 1
10961174

1097-
const dataItem = JSON.parse(stringObject)
1098-
if (!shouldProcessRecord(dataItem, dateFilter)) {
1099-
skipped += 1
1100-
stringObject = ''
1175+
buffer += char
1176+
1177+
if (escapeNext) {
1178+
escapeNext = false
11011179
continue
11021180
}
1103-
// make sure the member is exist
1104-
const member = await prisma.member.findFirst({
1105-
where: {
1106-
userId: dataItem.userId
1107-
}
1108-
})
11091181

1110-
if (member) {
1111-
const statHistory = fixDynamoMemberStatHistoryData(dataItem)
1182+
if (char === '\\') {
1183+
escapeNext = true
1184+
continue
1185+
}
11121186

1113-
if (!isEmpty(statHistory)) {
1114-
await prisma.memberHistoryStats.create({
1115-
data: {
1116-
groupId: dataItem.groupId,
1117-
createdBy: CREATED_BY,
1118-
userId: member.userId,
1119-
develop: {
1120-
create: statHistory.develop
1121-
},
1122-
dataScience: {
1123-
create: statHistory.dataScience
1124-
}
1125-
},
1126-
include: { develop: true, dataScience: true }
1127-
})
1128-
total += 1
1129-
}
1187+
if (char === '"') {
1188+
inString = !inString
1189+
continue
11301190
}
11311191

1132-
stringObject = ''
1133-
} else if (trimmedLine === ' {') {
1134-
stringObject = '{'
1135-
} else if (trimmedLine === '[' || trimmedLine === ']') {
1136-
continue
1137-
} else if (stringObject.length > 0) {
1138-
stringObject += line.trim()
1192+
if (inString) {
1193+
continue
1194+
}
1195+
1196+
if (char === '{') {
1197+
depth += 1
1198+
} else if (char === '}') {
1199+
depth -= 1
1200+
if (depth === 0) {
1201+
const objectString = buffer
1202+
// eslint-disable-next-line no-await-in-loop
1203+
await processObjectString(objectString)
1204+
buffer = ''
1205+
capturingObject = false
1206+
inString = false
1207+
escapeNext = false
1208+
}
1209+
}
11391210
}
11401211
}
11411212

1213+
// Process any remaining buffered object.
1214+
if (buffer) {
1215+
await processObjectString(buffer)
1216+
}
1217+
11421218
console.log(`\nIt has inserted ${total} items totally, skipped ${skipped} items`)
11431219

11441220
console.log(`Finished reading the file: ${filename}\n`)
@@ -1186,23 +1262,33 @@ async function importDynamoMemberStatHistoryPrivate (filename, dateFilter = null
11861262
if (member) {
11871263
const statHistory = fixDynamoMemberStatHistoryData(dataItem)
11881264

1189-
await prisma.memberHistoryStats.create({
1190-
data: {
1191-
groupId: dataItem.groupId,
1192-
isPrivate: true,
1193-
createdBy: CREATED_BY,
1194-
userId: member.userId,
1195-
develop: {
1196-
create: statHistory.develop
1197-
},
1198-
dataScience: {
1199-
create: statHistory.dataScience
1200-
}
1201-
},
1202-
include: { develop: true, dataScience: true }
1203-
})
1265+
const createData = {
1266+
groupId: dataItem.groupId,
1267+
isPrivate: true,
1268+
createdBy: CREATED_BY,
1269+
userId: member.userId
1270+
}
12041271

1205-
total += 1
1272+
if (statHistory.develop) {
1273+
createData.develop = {
1274+
create: statHistory.develop
1275+
}
1276+
}
1277+
1278+
if (statHistory.dataScience) {
1279+
createData.dataScience = {
1280+
create: statHistory.dataScience
1281+
}
1282+
}
1283+
1284+
if (createData.develop || createData.dataScience) {
1285+
await prisma.memberHistoryStats.create({
1286+
data: createData,
1287+
include: { develop: true, dataScience: true }
1288+
})
1289+
1290+
total += 1
1291+
}
12061292
}
12071293
}
12081294

0 commit comments

Comments
 (0)