@@ -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