{ "version": 3, "sources": ["../../../../../server/chat-plugins/trivia/transactions.ts"], "sourcesContent": ["/**\r\n * SQL transactions for the Trivia plugin.\r\n */\r\n\r\nimport type {TransactionEnvironment} from '../../../lib/sql';\r\nimport type {TriviaHistory, TriviaQuestion} from './trivia';\r\n\r\nexport const transactions = {\r\n\taddHistory: (\r\n\t\targs: {history: Iterable, gameHistoryInsertion: string, scoreHistoryInsertion: string},\r\n\t\tenv: TransactionEnvironment\r\n\t) => {\r\n\t\tconst gameHistoryInsertion = env.statements.get(args.gameHistoryInsertion);\r\n\t\tconst scoreHistoryInsertion = env.statements.get(args.scoreHistoryInsertion);\r\n\t\tif (!gameHistoryInsertion || !scoreHistoryInsertion) throw new Error('Statements not found');\r\n\r\n\t\tfor (const game of args.history) {\r\n\t\t\tconst {lastInsertRowid} = gameHistoryInsertion.run(\r\n\t\t\t\tgame.mode, game.length, game.category, game.startTime, game.creator, Number(game.givesPoints)\r\n\t\t\t);\r\n\t\t\tfor (const userid in game.scores) {\r\n\t\t\t\tscoreHistoryInsertion.run(lastInsertRowid, userid, game.scores[userid]);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t},\r\n\r\n\teditQuestion(\r\n\t\targs: {oldQuestionText: string, newQuestionText?: string, newAnswers?: string[]},\r\n\t\tenv: TransactionEnvironment,\r\n\t) {\r\n\t\t// Question editing is likely to be infrequent, so I've optimized for readability and proper argument checking\r\n\t\t// rather than performance (i.e. not passing in prepared statements).\r\n\t\tconst {oldQuestionText, newQuestionText, newAnswers} = args;\r\n\r\n\t\tif (newAnswers) {\r\n\t\t\tconst questionID = env.db\r\n\t\t\t\t.prepare('SELECT question_id FROM trivia_questions WHERE question = ?')\r\n\t\t\t\t.get(oldQuestionText)?.question_id;\r\n\t\t\tif (!questionID) throw new Error('Question not found');\r\n\t\t\tenv.db.prepare('DELETE FROM trivia_answers WHERE question_id = ?').run(questionID);\r\n\t\t\tconst insert = env.db.prepare('INSERT INTO trivia_answers (question_id, answer) VALUES (?, ?)');\r\n\t\t\tfor (const answer of newAnswers) {\r\n\t\t\t\tinsert.run([questionID, answer]);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (newQuestionText) {\r\n\t\t\tenv.db\r\n\t\t\t\t.prepare(`UPDATE trivia_questions SET question = ? WHERE question = ?`)\r\n\t\t\t\t.run([newQuestionText, oldQuestionText]);\r\n\t\t}\r\n\t},\r\n\r\n\taddQuestions: (\r\n\t\targs: {\r\n\t\t\tquestions: Iterable,\r\n\t\t\tquestionInsertion: string,\r\n\t\t\tanswerInsertion: string,\r\n\t\t\tisSubmission: boolean,\r\n\t\t},\r\n\t\tenv: TransactionEnvironment\r\n\t) => {\r\n\t\tconst questionInsertion = env.statements.get(args.questionInsertion);\r\n\t\tconst answerInsertion = env.statements.get(args.answerInsertion);\r\n\t\tif (!questionInsertion || !answerInsertion) throw new Error('Statements not found');\r\n\r\n\t\tconst isSubmissionForSQLite = Number(args.isSubmission);\r\n\t\tfor (const question of args.questions) {\r\n\t\t\tconst {lastInsertRowid} = questionInsertion.run(\r\n\t\t\t\tquestion.question, question.category, question.addedAt, question.user, isSubmissionForSQLite\r\n\t\t\t);\r\n\t\t\tfor (const answer of question.answers) {\r\n\t\t\t\tanswerInsertion.run(lastInsertRowid, answer);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t},\r\n};\r\n"], "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAOO,MAAM,eAAe;AAAA,EAC3B,YAAY,CACX,MACA,QACI;AACJ,UAAM,uBAAuB,IAAI,WAAW,IAAI,KAAK,oBAAoB;AACzE,UAAM,wBAAwB,IAAI,WAAW,IAAI,KAAK,qBAAqB;AAC3E,QAAI,CAAC,wBAAwB,CAAC;AAAuB,YAAM,IAAI,MAAM,sBAAsB;AAE3F,eAAW,QAAQ,KAAK,SAAS;AAChC,YAAM,EAAC,gBAAe,IAAI,qBAAqB;AAAA,QAC9C,KAAK;AAAA,QAAM,KAAK;AAAA,QAAQ,KAAK;AAAA,QAAU,KAAK;AAAA,QAAW,KAAK;AAAA,QAAS,OAAO,KAAK,WAAW;AAAA,MAC7F;AACA,iBAAW,UAAU,KAAK,QAAQ;AACjC,8BAAsB,IAAI,iBAAiB,QAAQ,KAAK,OAAO,MAAM,CAAC;AAAA,MACvE;AAAA,IACD;AAEA,WAAO;AAAA,EACR;AAAA,EAEA,aACC,MACA,KACC;AAGD,UAAM,EAAC,iBAAiB,iBAAiB,WAAU,IAAI;AAEvD,QAAI,YAAY;AACf,YAAM,aAAa,IAAI,GACrB,QAAQ,6DAA6D,EACrE,IAAI,eAAe,GAAG;AACxB,UAAI,CAAC;AAAY,cAAM,IAAI,MAAM,oBAAoB;AACrD,UAAI,GAAG,QAAQ,kDAAkD,EAAE,IAAI,UAAU;AACjF,YAAM,SAAS,IAAI,GAAG,QAAQ,gEAAgE;AAC9F,iBAAW,UAAU,YAAY;AAChC,eAAO,IAAI,CAAC,YAAY,MAAM,CAAC;AAAA,MAChC;AAAA,IACD;AAEA,QAAI,iBAAiB;AACpB,UAAI,GACF,QAAQ,6DAA6D,EACrE,IAAI,CAAC,iBAAiB,eAAe,CAAC;AAAA,IACzC;AAAA,EACD;AAAA,EAEA,cAAc,CACb,MAMA,QACI;AACJ,UAAM,oBAAoB,IAAI,WAAW,IAAI,KAAK,iBAAiB;AACnE,UAAM,kBAAkB,IAAI,WAAW,IAAI,KAAK,eAAe;AAC/D,QAAI,CAAC,qBAAqB,CAAC;AAAiB,YAAM,IAAI,MAAM,sBAAsB;AAElF,UAAM,wBAAwB,OAAO,KAAK,YAAY;AACtD,eAAW,YAAY,KAAK,WAAW;AACtC,YAAM,EAAC,gBAAe,IAAI,kBAAkB;AAAA,QAC3C,SAAS;AAAA,QAAU,SAAS;AAAA,QAAU,SAAS;AAAA,QAAS,SAAS;AAAA,QAAM;AAAA,MACxE;AACA,iBAAW,UAAU,SAAS,SAAS;AACtC,wBAAgB,IAAI,iBAAiB,MAAM;AAAA,MAC5C;AAAA,IACD;AAEA,WAAO;AAAA,EACR;AACD;", "names": [] }