diff --git a/backend/logs/audit-immutable.log b/backend/logs/audit-immutable.log index d5ab94b4..ea2aa857 100644 --- a/backend/logs/audit-immutable.log +++ b/backend/logs/audit-immutable.log @@ -38,3 +38,118 @@ {"level":"info","logType":"audit","message":{"action":"USER_LOGIN","timestamp":"2026-06-05T12:16:32.599Z","userId":"user-123"},"service":"web3-student-lab-backend","timestamp":"2026-06-05 13:16:32.599"} {"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"infoaboutknights@gmail.com","firstName":"Ayomide","lastName":"Adeniran","password":"Ayomide","walletAddress":"GAR3OJ4FDG6FO2S7Q25M3WR3IXIWO4EMTOE4LJGESBVKNZCUHOAAYTBN"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"a4076be258245f14a52e190ab3713fde9bbd5c56357c49f08131595a465ad5c2","ipAddress":"::1","timestamp":"2026-06-06T16:19:52.961Z","userAgent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36","userEmail":"infoaboutknights@gmail.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-06 17:19:52.961"} {"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"ayomideadeniran@gmail.com","firstName":"Ayomide","lastName":"Adeniran","password":"ayomideadeniran@gmail.com","walletAddress":"GABHG7FLRHOM3NQK66PYWO4E3YH2MUOBDJMK76PUK3XYAD3VBYHULFJO"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"ea0ba17ea59eae43c50b2a7fa41fd874b8bb8ca1f8ebdadd548ab0591dc7148d","ipAddress":"::1","timestamp":"2026-06-06T18:28:25.219Z","userAgent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36","userEmail":"ayomideadeniran@gmail.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-06 19:28:25.219"} +{"level":"info","logType":"audit","message":{"action":"USER_LOGIN","timestamp":"2026-06-24T10:24:43.846Z","userId":"user-123"},"service":"web3-student-lab-backend","timestamp":"2026-06-24 11:24:43.847"} +{"level":"info","logType":"audit","message":{"action":"TEST_ACTION","details":{"key":"value"},"entity":"User","entityId":"user-123","hash":"e9da39918c8cd6797aaa775c4d26ed14fa4bb3f7736a3569fb5bb080425bb580","ipAddress":"127.0.0.1","timestamp":"2026-06-24T10:25:22.212Z","userAgent":"Jest-Test","userEmail":"test@example.com","userId":"user-123"},"service":"web3-student-lab-backend","timestamp":"2026-06-24 11:25:22.213"} +{"level":"info","logType":"audit","message":{"action":"FAIL_ACTION","hash":"5a92ba9822ed2ac441be4926ac86b3f09bca6f3149fe0156bea2e358148379b6","timestamp":"2026-06-24T10:25:22.529Z"},"service":"web3-student-lab-backend","timestamp":"2026-06-24 11:25:22.529"} +{"level":"info","logType":"audit","message":{"action":"AUTH_ACTION","details":null,"entity":null,"entityId":null,"hash":"f8da8623f418250e54ce9afcd786ca52a3d60890aace8a008ffba82aa04d7346","ipAddress":"192.168.1.1","timestamp":"2026-06-24T10:25:22.588Z","userAgent":"Browser","userEmail":"auth@example.com","userId":"user-auth"},"service":"web3-student-lab-backend","timestamp":"2026-06-24 11:25:22.588"} +{"level":"info","logType":"audit","message":{"action":"LOGIN_ACTION","details":null,"entity":null,"entityId":null,"hash":"76a8af5d641df29bca41d71e5225cd25caa27f953501a0eead7ed225261570fe","ipAddress":"10.0.0.1","timestamp":"2026-06-24T10:25:22.618Z","userAgent":null,"userEmail":"login@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 11:25:22.618"} +{"level":"info","logType":"audit","message":{"action":"USER_LOGIN","timestamp":"2026-06-24T10:25:49.516Z","userId":"user-123"},"service":"web3-student-lab-backend","timestamp":"2026-06-24 11:25:49.516"} +{"level":"info","logType":"audit","message":{"action":"TEST_ACTION","details":{"key":"value"},"entity":"User","entityId":"user-123","hash":"7fcc4a3212c53ced167dcb771db72e3a5b33324da747fb6cf21295a58d0e012a","ipAddress":"127.0.0.1","timestamp":"2026-06-24T10:35:44.838Z","userAgent":"Jest-Test","userEmail":"test@example.com","userId":"user-123"},"service":"web3-student-lab-backend","timestamp":"2026-06-24 11:35:44.838"} +{"level":"info","logType":"audit","message":{"action":"FAIL_ACTION","hash":"365682e9706495abaa9aabca24a5b8f58f10f6290b56645180dd18c624c0539c","timestamp":"2026-06-24T10:35:45.141Z"},"service":"web3-student-lab-backend","timestamp":"2026-06-24 11:35:45.141"} +{"level":"info","logType":"audit","message":{"action":"AUTH_ACTION","details":null,"entity":null,"entityId":null,"hash":"24a2961ab29bda8b5dd8d4d55bb0bc609ba66f50fdc14717e35c33f8702dd0e0","ipAddress":"192.168.1.1","timestamp":"2026-06-24T10:35:45.189Z","userAgent":"Browser","userEmail":"auth@example.com","userId":"user-auth"},"service":"web3-student-lab-backend","timestamp":"2026-06-24 11:35:45.189"} +{"level":"info","logType":"audit","message":{"action":"LOGIN_ACTION","details":null,"entity":null,"entityId":null,"hash":"f0bcd1c5b1315bec855cb934d3b2b72ab0812f8fd3d189a17ce9495510ea8f88","ipAddress":"10.0.0.1","timestamp":"2026-06-24T10:35:45.229Z","userAgent":null,"userEmail":"login@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 11:35:45.229"} +{"level":"info","logType":"audit","message":{"action":"USER_LOGIN","timestamp":"2026-06-24T10:36:03.130Z","userId":"user-123"},"service":"web3-student-lab-backend","timestamp":"2026-06-24 11:36:03.131"} +{"level":"info","logType":"audit","message":{"action":"TEST_ACTION","details":{"key":"value"},"entity":"User","entityId":"user-123","hash":"78d3f6fe78048ca091f3c7e1c55cff26e1fcff00f03d43c67391b7df2374c7b0","ipAddress":"127.0.0.1","timestamp":"2026-06-24T10:36:54.610Z","userAgent":"Jest-Test","userEmail":"test@example.com","userId":"user-123"},"service":"web3-student-lab-backend","timestamp":"2026-06-24 11:36:54.611"} +{"level":"info","logType":"audit","message":{"action":"FAIL_ACTION","hash":"03b32a8a0e94a1dcb6a751b4d04566c8e4bdec4d1c427e77c8d85568eac4a532","timestamp":"2026-06-24T10:36:54.835Z"},"service":"web3-student-lab-backend","timestamp":"2026-06-24 11:36:54.836"} +{"level":"info","logType":"audit","message":{"action":"AUTH_ACTION","details":null,"entity":null,"entityId":null,"hash":"713b17eb93ad318dc9dba9fc91a2bdb6564d0c5674b3cea0c3270edbfdea0150","ipAddress":"192.168.1.1","timestamp":"2026-06-24T10:36:54.852Z","userAgent":"Browser","userEmail":"auth@example.com","userId":"user-auth"},"service":"web3-student-lab-backend","timestamp":"2026-06-24 11:36:54.852"} +{"level":"info","logType":"audit","message":{"action":"LOGIN_ACTION","details":null,"entity":null,"entityId":null,"hash":"0b3cdd47109e75016dcdb062a0f574619b7f8fe1970901dc7e3e773f2b007e24","ipAddress":"10.0.0.1","timestamp":"2026-06-24T10:36:54.928Z","userAgent":null,"userEmail":"login@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 11:36:54.929"} +{"level":"info","logType":"audit","message":{"action":"USER_LOGIN","timestamp":"2026-06-24T10:37:15.234Z","userId":"user-123"},"service":"web3-student-lab-backend","timestamp":"2026-06-24 11:37:15.234"} +{"level":"info","logType":"audit","message":{"action":"TEST_ACTION","details":{"key":"value"},"entity":"User","entityId":"user-123","hash":"218ea6d099b13c94f1e4ca78c8499b592426816fd537ae2fd22be07a4ee5ea6a","ipAddress":"127.0.0.1","timestamp":"2026-06-24T10:40:54.548Z","userAgent":"Jest-Test","userEmail":"test@example.com","userId":"user-123"},"service":"web3-student-lab-backend","timestamp":"2026-06-24 11:40:54.550"} +{"level":"info","logType":"audit","message":{"action":"FAIL_ACTION","hash":"39b17979ed3b51b5f5adc4d49e0741426a2f4414d79ae5f5be6c8166f43d8493","timestamp":"2026-06-24T10:40:56.014Z"},"service":"web3-student-lab-backend","timestamp":"2026-06-24 11:40:56.014"} +{"level":"info","logType":"audit","message":{"action":"AUTH_ACTION","details":null,"entity":null,"entityId":null,"hash":"018c4e903eade8121eeaed46ef8d8441a97ea6b3eb048a3006c256847f8f22f9","ipAddress":"192.168.1.1","timestamp":"2026-06-24T10:40:56.118Z","userAgent":"Browser","userEmail":"auth@example.com","userId":"user-auth"},"service":"web3-student-lab-backend","timestamp":"2026-06-24 11:40:56.118"} +{"level":"info","logType":"audit","message":{"action":"LOGIN_ACTION","details":null,"entity":null,"entityId":null,"hash":"d9a7446d1559288fe4a0c95fda9a4d1735dce097a4a1f9be9f648596b18f207b","ipAddress":"10.0.0.1","timestamp":"2026-06-24T10:40:56.167Z","userAgent":null,"userEmail":"login@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 11:40:56.182"} +{"level":"info","logType":"audit","message":{"action":"USER_LOGIN","timestamp":"2026-06-24T10:41:08.619Z","userId":"user-123"},"service":"web3-student-lab-backend","timestamp":"2026-06-24 11:41:08.620"} +{"level":"info","logType":"audit","message":{"action":"TEST_ACTION","details":{"key":"value"},"entity":"User","entityId":"user-123","hash":"5d363597d3b12a36174928a7a8eea3c4ff82362496d36628c359fdaac078f260","ipAddress":"127.0.0.1","timestamp":"2026-06-24T10:42:12.180Z","userAgent":"Jest-Test","userEmail":"test@example.com","userId":"user-123"},"service":"web3-student-lab-backend","timestamp":"2026-06-24 11:42:12.181"} +{"level":"info","logType":"audit","message":{"action":"FAIL_ACTION","hash":"59ed9bb12704e15bf0a461f85f6cdc59ee255ad11ab3af6edc3567b55094840f","timestamp":"2026-06-24T10:42:12.979Z"},"service":"web3-student-lab-backend","timestamp":"2026-06-24 11:42:12.979"} +{"level":"info","logType":"audit","message":{"action":"AUTH_ACTION","details":null,"entity":null,"entityId":null,"hash":"b3fadee3ccf7efb3331b5222200ae6eab61f9ab65ba8577fb656f401e83e5e1f","ipAddress":"192.168.1.1","timestamp":"2026-06-24T10:42:13.057Z","userAgent":"Browser","userEmail":"auth@example.com","userId":"user-auth"},"service":"web3-student-lab-backend","timestamp":"2026-06-24 11:42:13.057"} +{"level":"info","logType":"audit","message":{"action":"LOGIN_ACTION","details":null,"entity":null,"entityId":null,"hash":"9fa9fd2db8395b1c81d2a3d8b9dc6999d942a47926ba99732f8902ade3fba3ae","ipAddress":"10.0.0.1","timestamp":"2026-06-24T10:42:13.110Z","userAgent":null,"userEmail":"login@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 11:42:13.110"} +{"level":"info","logType":"audit","message":{"action":"USER_LOGIN","timestamp":"2026-06-24T10:42:24.888Z","userId":"user-123"},"service":"web3-student-lab-backend","timestamp":"2026-06-24 11:42:24.888"} +{"level":"info","logType":"audit","message":{"action":"CREATE_STUDENT","details":{"body":{"email":"test-isolation-1782297834918@example.com","firstName":"Isolation","lastName":"Test"},"method":"POST","path":"/","query":{}},"entity":"Student","entityId":"cmqry43460000o9ec15atkcvi","hash":"a1cae9501e2b0cb96aa18a177d92743afd233d2c30ca7d25c9320445fa034edc","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T10:43:55.279Z","userAgent":null,"userEmail":"test-isolation-1782297834918@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 11:43:55.279"} +{"level":"info","logType":"audit","message":{"action":"CREATE_STUDENT","details":{"body":{"email":"update-isolation-1782297835405@example.com","firstName":"Original","lastName":"Student"},"method":"POST","path":"/","query":{}},"entity":"Student","entityId":"cmqry439x0002o9ec7t1w3vem","hash":"ef2287804174e7bf05a9b17bd7d794472fa3fa6fd613382b232838fe36318f1b","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T10:43:55.419Z","userAgent":null,"userEmail":"update-isolation-1782297835405@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 11:43:55.419"} +{"level":"info","logType":"audit","message":{"action":"CREATE_STUDENT","details":{"body":{"email":"delete-isolation-1782297835798@example.com","firstName":"To Be Deleted","lastName":"Student"},"method":"POST","path":"/","query":{}},"entity":"Student","entityId":"cmqry43kv0004o9ecpyghc1ls","hash":"098bba7e6df8a2ff4e86896acf8f6c53613aa2baddc9359c368e907b83d977cb","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T10:43:55.869Z","userAgent":null,"userEmail":"delete-isolation-1782297835798@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 11:43:55.869"} +{"level":"info","logType":"audit","message":{"action":"USER_LOGIN","timestamp":"2026-06-24T10:48:43.213Z","userId":"user-123"},"service":"web3-student-lab-backend","timestamp":"2026-06-24 11:48:43.213"} +{"level":"info","logType":"audit","message":{"action":"CREATE_STUDENT","details":{"body":{"email":"test-isolation-1782298130853@example.com","firstName":"Isolation","lastName":"Test"},"method":"POST","path":"/","query":{}},"entity":"Student","entityId":"cmqryafl60000pueccz9t0ciu","hash":"eb018562e4b95d9d4a03c595c50d9ded65e00767f61bb44872aed9b2b9267ff3","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T10:48:51.589Z","userAgent":null,"userEmail":"test-isolation-1782298130853@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 11:48:51.589"} +{"level":"info","logType":"audit","message":{"action":"CREATE_STUDENT","details":{"body":{"email":"update-isolation-1782298131827@example.com","firstName":"Original","lastName":"Student"},"method":"POST","path":"/","query":{}},"entity":"Student","entityId":"cmqryafzy0002puecajmr5yyp","hash":"774bdf351d4d5f63880c473f7f4b146878129e06f4413b3ae596c906fee9abc5","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T10:48:51.844Z","userAgent":null,"userEmail":"update-isolation-1782298131827@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 11:48:51.844"} +{"level":"info","logType":"audit","message":{"action":"TEST_ACTION","details":{"key":"value"},"entity":"User","entityId":"user-123","hash":"2edf729d0f217a0b6b23aae252d57d67126687de5c3ed48f225a7f0043ee421c","ipAddress":"127.0.0.1","timestamp":"2026-06-24T10:48:51.536Z","userAgent":"Jest-Test","userEmail":"test@example.com","userId":"user-123"},"service":"web3-student-lab-backend","timestamp":"2026-06-24 11:48:51.536"} +{"level":"info","logType":"audit","message":{"action":"CREATE_STUDENT","details":{"body":{"email":"delete-isolation-1782298132711@example.com","firstName":"To Be Deleted","lastName":"Student"},"method":"POST","path":"/","query":{}},"entity":"Student","entityId":"cmqryagon0004puec8txyhvbc","hash":"b5940e44c84b017c7e208e5ae80377c6140328753f9f219e9a503b8cb8d809c9","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T10:48:52.736Z","userAgent":null,"userEmail":"delete-isolation-1782298132711@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 11:48:52.736"} +{"level":"info","logType":"audit","message":{"action":"FAIL_ACTION","hash":"61f6f1777082d080dd013071b1b3664376ff18d0aeed3336ea22be2dacc6adec","timestamp":"2026-06-24T10:48:53.012Z"},"service":"web3-student-lab-backend","timestamp":"2026-06-24 11:48:53.013"} +{"level":"info","logType":"audit","message":{"action":"AUTH_ACTION","details":null,"entity":null,"entityId":null,"hash":"c4f7a0b98418f7e37055d9b748357b1c6d999c329490962fd3110deb0268c660","ipAddress":"192.168.1.1","timestamp":"2026-06-24T10:48:53.093Z","userAgent":"Browser","userEmail":"auth@example.com","userId":"user-auth"},"service":"web3-student-lab-backend","timestamp":"2026-06-24 11:48:53.093"} +{"level":"info","logType":"audit","message":{"action":"LOGIN_ACTION","details":null,"entity":null,"entityId":null,"hash":"4c0b84ac9ba1238cd5b8b20ae0e21940c3a1ebcabf3fce3ba1ec6536f053007b","ipAddress":"10.0.0.1","timestamp":"2026-06-24T10:48:53.286Z","userAgent":null,"userEmail":"login@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 11:48:53.286"} +{"level":"info","logType":"audit","message":{"action":"TEST_ACTION","details":{"key":"value"},"entity":"User","entityId":"user-123","hash":"4fbdfa242e8ca92d0f8319be3d9ef059eb0ed699187a49e30d157f73f035a38f","ipAddress":"127.0.0.1","timestamp":"2026-06-24T10:49:11.794Z","userAgent":"Jest-Test","userEmail":"test@example.com","userId":"user-123"},"service":"web3-student-lab-backend","timestamp":"2026-06-24 11:49:11.794"} +{"level":"info","logType":"audit","message":{"action":"FAIL_ACTION","hash":"759b7ab61d78d57113052f23286ae3748b16c8122c57f5551402a1d88555f627","timestamp":"2026-06-24T10:49:12.196Z"},"service":"web3-student-lab-backend","timestamp":"2026-06-24 11:49:12.196"} +{"level":"info","logType":"audit","message":{"action":"AUTH_ACTION","details":null,"entity":null,"entityId":null,"hash":"35f6e0164c9b9a4fbf3f15d1271ddeb3319fcc19da0955756bdafa34f5238f5c","ipAddress":"192.168.1.1","timestamp":"2026-06-24T10:49:12.238Z","userAgent":"Browser","userEmail":"auth@example.com","userId":"user-auth"},"service":"web3-student-lab-backend","timestamp":"2026-06-24 11:49:12.238"} +{"level":"info","logType":"audit","message":{"action":"LOGIN_ACTION","details":null,"entity":null,"entityId":null,"hash":"f0b8e1b9ca48c896bc893c7817f81c2313d1235f87d7f0d030722dfe393ead46","ipAddress":"10.0.0.1","timestamp":"2026-06-24T10:49:12.278Z","userAgent":null,"userEmail":"login@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 11:49:12.278"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"newstudent@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"92e14de7374d154c58f588cab8922b4679d805a162df766a8225e9afcfdd9e2f","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:26:43.879Z","userAgent":null,"userEmail":"newstudent@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:26:43.879"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"progressstudent@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"4b940b1f2532ac9d30cc31255a21ef71a22b326610e31031f9896c0db5675b22","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:26:44.273Z","userAgent":null,"userEmail":"progressstudent@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:26:44.273"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"student1@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"60ef785210e59b668a5caf0dc6cb79152c53301336505a3b3009f969470f1768","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:26:44.639Z","userAgent":null,"userEmail":"student1@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:26:44.639"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"student2@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"f449b822bef3ac7d0374e183526fc5668145f33293496b69af29cfc7d03612d4","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:26:44.953Z","userAgent":null,"userEmail":"student2@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:26:44.953"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"validation@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"5686632b2ea7f2ca56f66356bfa22f339589751070b2c6c8d701b0f6898023cd","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:26:45.306Z","userAgent":null,"userEmail":"validation@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:26:45.307"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"firstlesson@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"5483f69c6609a67aff159925fa94412f2c459654b357bc9d9ea70f131bb0c895","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:26:45.572Z","userAgent":null,"userEmail":"firstlesson@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:26:45.572"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"updateprogress@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"5045c48f6b8bbc7bd9075979ded343dd5a2b96c1ff6e13bd49e5bff110b1b431","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:26:45.986Z","userAgent":null,"userEmail":"updateprogress@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:26:45.987"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"percentage@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"7dd11300f5d74da558e81c8a4d61239b836d5ccefb8e5cb1d2250dd505297d97","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:26:46.373Z","userAgent":null,"userEmail":"percentage@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:26:46.373"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"explicit@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"4d0781fc511a163747a0410544c9f00b3074693679bc912cbdcaac8e6321e4ef","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:26:46.673Z","userAgent":null,"userEmail":"explicit@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:26:46.673"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"invalidpercentage@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"e5b2984913de08f2d6468c3a613156ed74adea0eccf9bf0fa468ec956d36bb4a","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:26:47.004Z","userAgent":null,"userEmail":"invalidpercentage@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:26:47.004"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"negativepercentage@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"bc6b94c2155c36098b4c3c9a9c8d0010b33b16f6911fd9c8a61be1913002b67f","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:26:47.338Z","userAgent":null,"userEmail":"negativepercentage@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:26:47.338"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"invalidlesson@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"7c2af8fdaae72330b85d52bfdc60e92f7341a4ea5bdb03fa3b7f63b27f516cfc","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:26:47.746Z","userAgent":null,"userEmail":"invalidlesson@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:26:47.747"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"wrongcourse@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"0d01e6ef60e75c268756accfdd422f5933fecb5364a9facc9b55752c461bf1a3","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:26:48.057Z","userAgent":null,"userEmail":"wrongcourse@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:26:48.057"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"duplicate@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"c228c68a0b3ecb08f4955940e4a3ed0609841da88d1cdf2dc1779df799a4eec2","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:26:48.440Z","userAgent":null,"userEmail":"duplicate@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:26:48.441"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"completecourse@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"d3600731633bc4bd1ffa55da2441f1590ba4c8e9bd229aa69ebc35417b16b5b7","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:26:49.044Z","userAgent":null,"userEmail":"completecourse@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:26:49.044"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"isolated1@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"caef47fc7b096a887cbfccdafeba42e30080c23410f1187c79435889eb22c461","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:26:49.628Z","userAgent":null,"userEmail":"isolated1@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:26:49.628"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"isolated2@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"f0ab6b74977b3b58c319e9054e3a5cc9c696dffa55a5a23645a4cd0e6da2e717","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:26:49.982Z","userAgent":null,"userEmail":"isolated2@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:26:49.983"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"uncomplete@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"d2ddaf0deb062f2681de2028ce19fd67e5dda3752f806973366622247550ba42","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:26:50.372Z","userAgent":null,"userEmail":"uncomplete@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:26:50.373"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"missingfields@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"ee6d0a281c3069fd846da9b9eb489fab4111a7b4c29f2fb7c1b0b7d8b26f6e17","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:26:50.710Z","userAgent":null,"userEmail":"missingfields@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:26:50.710"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"timestamp@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"44452245190f3ace1638ba538a2970ef963335359fad927c26bb41499d4a2d00","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:26:51.155Z","userAgent":null,"userEmail":"timestamp@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:26:51.155"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"journeystudent@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"4204bc7845a0f2157defec2aa149c57eceb16cd915f16a60c3c00a701c7940a9","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:26:51.534Z","userAgent":null,"userEmail":"journeystudent@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:26:51.534"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"newstudent@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"59d02bfb4b852ea306886386ce5fedce23c053a9bff390aad0a675ef433ae79a","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:49:57.646Z","userAgent":null,"userEmail":"newstudent@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:49:57.663"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"progressstudent@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"9079943e9ae0e1f3d11c227c561f25b2ec13c8d453accedc207e6e63e99fb4fc","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:50:00.784Z","userAgent":null,"userEmail":"progressstudent@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:50:00.785"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"student1@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"c2a74cb5a387ce4e2309e51e1af569162e75222237d55fd9c6b628c01e4440ea","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:50:03.080Z","userAgent":null,"userEmail":"student1@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:50:03.080"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"student2@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"3a1679fc1795a1e789c5f23cf53f1a3ef701a5fc77e2f5b60dce697bdff3c6d6","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:50:04.796Z","userAgent":null,"userEmail":"student2@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:50:04.796"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"validation@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"8f1414138e2486835b8e5905965835e5a28a81f3ac9506c159737f9f44881c0d","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:50:05.933Z","userAgent":null,"userEmail":"validation@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:50:05.934"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"firstlesson@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"f9ec17ed65d830b7c601cc7bbc5fd025ee5d56fe4ea747bc5a82084704635c61","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:50:06.709Z","userAgent":null,"userEmail":"firstlesson@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:50:06.709"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"updateprogress@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"70eb6cbdea8605329cbee6036d723fdf197d0a9c4b3458a92119e27eb3bbba0f","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:50:08.391Z","userAgent":null,"userEmail":"updateprogress@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:50:08.391"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"percentage@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"2e0512705b826b05e8487ad984e048f2a6e06cdaa7d9f283184f46456c009017","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:50:10.588Z","userAgent":null,"userEmail":"percentage@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:50:10.588"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"explicit@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"e1e975b403f2794fb10ecd0a59f279e1ebbaf1682d57c6f752446532d9943173","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:50:13.325Z","userAgent":null,"userEmail":"explicit@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:50:13.326"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"invalidpercentage@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"2697ae9fdb4977918d2378093bb0a7abab807d7abe850930ec169a3f36c165a3","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:50:14.705Z","userAgent":null,"userEmail":"invalidpercentage@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:50:14.706"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"negativepercentage@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"cd01de21824ffeedcb72e55e743081a3b67318990496fe4027d90673e9eee933","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:50:16.307Z","userAgent":null,"userEmail":"negativepercentage@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:50:16.307"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"invalidlesson@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"de8836c76205c7ee0dc70e2b044ef395c5d8098cf4919b7795093b01171f7244","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:50:17.753Z","userAgent":null,"userEmail":"invalidlesson@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:50:17.754"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"wrongcourse@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"2d115a07c70b56a8667d64cef0b4b101c27a85587fc41b3b7c73cbf495573630","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:50:19.686Z","userAgent":null,"userEmail":"wrongcourse@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:50:19.686"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"duplicate@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"9a035f66fa22e06fc6a3ac6d723a84baeecb66d03e5505ad8118aedfc1320401","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:50:21.117Z","userAgent":null,"userEmail":"duplicate@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:50:21.117"} +{"level":"info","logType":"audit","message":{"action":"CREATE_STUDENT","details":{"body":{"email":"test-isolation-1782301819805@example.com","firstName":"Isolation","lastName":"Test"},"method":"POST","path":"/","query":{}},"entity":"Student","entityId":"cmqs0hjbh0000d0ecryt27wgj","hash":"3c69d372c7619a2630d0e5380943acb0c9e61585b70e1725e87fe56156caa83a","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:50:22.708Z","userAgent":null,"userEmail":"test-isolation-1782301819805@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:50:22.709"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"completecourse@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"f4e1416c743a1df1a27373093ef14fb310f4ee8bdb5ec494728a84beec7f5837","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:50:23.263Z","userAgent":null,"userEmail":"completecourse@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:50:23.267"} +{"level":"info","logType":"audit","message":{"action":"CREATE_STUDENT","details":{"body":{"email":"update-isolation-1782301823210@example.com","firstName":"Original","lastName":"Student"},"method":"POST","path":"/","query":{}},"entity":"Student","entityId":"cmqs0hkc80002d0ecs0qnjed3","hash":"41e3fa3ced492fb711ff851a0985587a63897423017549e0d1cfe4bbcdd063ef","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:50:23.331Z","userAgent":null,"userEmail":"update-isolation-1782301823210@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:50:23.331"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"isolated1@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"bd54d32a54dce1fd52fe962abe4279b745d0a1c44183ad9127e439dd5bfa0887","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:50:25.607Z","userAgent":null,"userEmail":"isolated1@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:50:25.608"} +{"level":"info","logType":"audit","message":{"action":"CREATE_STUDENT","details":{"body":{"email":"delete-isolation-1782301826082@example.com","firstName":"To Be Deleted","lastName":"Student"},"method":"POST","path":"/","query":{}},"entity":"Student","entityId":"cmqs0hmj20004d0ec6i1ixlnc","hash":"6de4a4a8cc1101dbd762eaef67a6536343dc5f412d00c798294a2ac8d3552fca","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:50:26.133Z","userAgent":null,"userEmail":"delete-isolation-1782301826082@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:50:26.133"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"isolated2@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"24fa56ee7cb0317f0e25ca53c4d2930225e792fcaf3590aa143a3dae9e30737a","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:50:26.331Z","userAgent":null,"userEmail":"isolated2@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:50:26.331"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"uncomplete@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"a706271280d77a3ffc2f2c9cc24c6741cd441f684ab0299eee950fd70c1cca94","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:50:28.391Z","userAgent":null,"userEmail":"uncomplete@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:50:28.392"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"missingfields@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"5504cf4357de6935910c10675a04552c01a6e25e3ec0d79b8d58f414bbde000c","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:50:30.033Z","userAgent":null,"userEmail":"missingfields@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:50:30.033"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"timestamp@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"9e8a1798fbfb30d5dcd569f382d8cc5214bb204e99d7a4312ceade41e1a08998","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:50:32.296Z","userAgent":null,"userEmail":"timestamp@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:50:32.299"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"journeystudent@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"29136f344fd819a53952589354ae81e5f9ab0e88e698a1be005ccd8e62345eda","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:50:34.152Z","userAgent":null,"userEmail":"journeystudent@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:50:34.152"} +{"level":"info","logType":"audit","message":{"action":"USER_LOGIN","timestamp":"2026-06-24T11:50:36.370Z","userId":"user-123"},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:50:36.371"} +{"level":"info","logType":"audit","message":{"action":"TEST_MIDDLEWARE_ACTION","details":{"body":{"data":"test"},"method":"POST","path":"/test"},"entity":"TestEntity","entityId":"entity-1","hash":"843b8990e0f8024e21cf95c0ab04e6f0dc2718e67df3dd1e92e3ddd2649fcd02","ipAddress":"127.0.0.1","timestamp":"2026-06-24T11:50:42.736Z","userAgent":null,"userEmail":"test@example.com","userId":"user-1"},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:50:42.738"} +{"level":"info","logType":"audit","message":{"action":"TEST_MIDDLEWARE_ACTION","details":{"body":{"data":"test"},"method":"POST","path":"/test"},"entity":"TestEntity","entityId":"entity-1","hash":"b0ec92c15f835fe7f0dcb0e85b4b63934237c8675d341f10fcc47e445d81bee5","ipAddress":"127.0.0.1","timestamp":"2026-06-24T11:53:27.430Z","userAgent":null,"userEmail":"test@example.com","userId":"user-1"},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:53:27.437"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"newstudent@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"225ad3a19798d6cb5d6d6f1a81a511b914303e5fe78d91e5a896acacbd04436c","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:53:39.518Z","userAgent":null,"userEmail":"newstudent@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:53:39.519"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"progressstudent@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"77e5b64ab246e2d66161dadffaf20bca0e420b41dac78ec5d0226743b22476f3","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:53:39.918Z","userAgent":null,"userEmail":"progressstudent@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:53:39.918"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"student1@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"d01179753c4e7adabf52c607fc6293f73b34dc94da633105aeb8090b3f4d4316","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:53:40.505Z","userAgent":null,"userEmail":"student1@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:53:40.505"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"student2@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"341dbb0c0f9b7154f5eb81d5490f02ba01a52626f43458ab8902a08688ad1d01","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:53:40.854Z","userAgent":null,"userEmail":"student2@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:53:40.854"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"validation@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"efdfd1cd1d0c9212666e992b900d5ab3ab185149c0b8221975e5b450b0b59c9f","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:53:41.281Z","userAgent":null,"userEmail":"validation@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:53:41.281"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"firstlesson@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"215bda7f3bdd3cbf91ee57fa94d9deacdf55d8b6258980cb3d544ce90e1ac81d","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:53:41.766Z","userAgent":null,"userEmail":"firstlesson@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:53:41.766"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"updateprogress@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"c4eaaf9d03b1712376de3603ba2e9a53253132d4d289d8b7fc800fd0a84c654b","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:53:42.185Z","userAgent":null,"userEmail":"updateprogress@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:53:42.186"} +{"level":"info","logType":"audit","message":{"action":"CREATE_STUDENT","details":{"body":{"email":"test-isolation-1782302021935@example.com","firstName":"Isolation","lastName":"Test"},"method":"POST","path":"/","query":{}},"entity":"Student","entityId":"cmqs0lu180000saeczcqgsdil","hash":"6b1e063c84f3ce0a28bece0f0b3cbef7def34f34db54260e33bcea17d08c911f","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:53:42.675Z","userAgent":null,"userEmail":"test-isolation-1782302021935@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:53:42.676"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"percentage@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"62cc4c880641753d5d0b54e73d6c00dae37535340a658d3fa2bf86c0d21190cf","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:53:42.749Z","userAgent":null,"userEmail":"percentage@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:53:42.749"} +{"level":"info","logType":"audit","message":{"action":"CREATE_STUDENT","details":{"body":{"email":"update-isolation-1782302022860@example.com","firstName":"Original","lastName":"Student"},"method":"POST","path":"/","query":{}},"entity":"Student","entityId":"cmqs0luc30002saec47t4lzg0","hash":"3d61aff0215ccbcba37a0911d3e828a1ae75c7360f2eb00b72a0468ea6f5077a","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:53:42.873Z","userAgent":null,"userEmail":"update-isolation-1782302022860@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:53:42.874"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"explicit@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"e9e996412a64bcbb205e2f22443891f63a9a2d9683935ecb5869947f05dedfa5","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:53:43.197Z","userAgent":null,"userEmail":"explicit@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:53:43.197"} +{"level":"info","logType":"audit","message":{"action":"CREATE_STUDENT","details":{"body":{"email":"delete-isolation-1782302023514@example.com","firstName":"To Be Deleted","lastName":"Student"},"method":"POST","path":"/","query":{}},"entity":"Student","entityId":"cmqs0luu80004saecz2nopx6l","hash":"622a400dadf4ccc4db4791d96573b700f2e188c2cea3b46318458dc44618733d","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:53:43.532Z","userAgent":null,"userEmail":"delete-isolation-1782302023514@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:53:43.532"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"invalidpercentage@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"6b5933cf471b3d1317f495e76acecde8883ee52d84546649c47c7454070bd733","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:53:43.813Z","userAgent":null,"userEmail":"invalidpercentage@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:53:43.814"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"negativepercentage@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"47d62512eae3ef75325d98d3db6f22f81efa3445107077778ed1ecad60ec799e","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:53:44.224Z","userAgent":null,"userEmail":"negativepercentage@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:53:44.225"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"invalidlesson@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"ef2242cfe20ea4002664e98ef1abaef834ee46c4c1eae2fa5c1be9a464bd1a82","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:53:44.531Z","userAgent":null,"userEmail":"invalidlesson@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:53:44.531"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"wrongcourse@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"53988781fcdc2dc66acf504eaed580ac0c470ce92e8ecbe96c027b290a03d185","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:53:44.975Z","userAgent":null,"userEmail":"wrongcourse@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:53:44.975"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"duplicate@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"5216603894c19e4a98dd12fadfd40e904d6e37c70fe30e6ce6affdcc68dbb89b","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:53:45.318Z","userAgent":null,"userEmail":"duplicate@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:53:45.318"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"completecourse@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"80c14cc4699727f907cc7d1d9e4b627bf36257111e7abe145a35b5b935f75ce5","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:53:45.805Z","userAgent":null,"userEmail":"completecourse@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:53:45.805"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"isolated1@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"1190c70b90b38e9575ab9224b7973e1eb836e4c55127e40a434c567456a551d4","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:53:46.339Z","userAgent":null,"userEmail":"isolated1@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:53:46.339"} +{"level":"info","logType":"audit","message":{"action":"USER_LOGIN","timestamp":"2026-06-24T11:53:46.476Z","userId":"user-123"},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:53:46.476"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"isolated2@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"b87960d50b59823629ae557c370bdf17b1806d884ddb5fe379a161457a054833","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:53:46.687Z","userAgent":null,"userEmail":"isolated2@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:53:46.688"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"uncomplete@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"38dc6d5501790a792a89ec7ac015f523e4881121c76bebec3646da50c7a6da16","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:53:46.930Z","userAgent":null,"userEmail":"uncomplete@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:53:46.930"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"missingfields@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"5b5ecb7ac399ef26bbba975bc99e727a933540638a17669072f02fbad066ae8f","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:53:47.197Z","userAgent":null,"userEmail":"missingfields@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:53:47.197"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"timestamp@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"d7cd26b249d63d2037ea6c927cbf57214690ff3e14654eaa6cdcefdd307090d8","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:53:47.387Z","userAgent":null,"userEmail":"timestamp@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:53:47.387"} +{"level":"info","logType":"audit","message":{"action":"USER_REGISTER","details":{"body":{"email":"journeystudent@example.com","firstName":"Test","lastName":"Student","password":"SecurePass123!"},"method":"POST","path":"/register","query":{}},"entity":"User","entityId":null,"hash":"6b6873394be2f87659c0a06df894f5c62302194ffedda6b45e84ad1180e423e7","ipAddress":"::ffff:127.0.0.1","timestamp":"2026-06-24T11:53:47.599Z","userAgent":null,"userEmail":"journeystudent@example.com","userId":null},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:53:47.599"} +{"level":"info","logType":"audit","message":{"action":"TEST_MIDDLEWARE_ACTION","details":{"body":{"data":"test"},"method":"POST","path":"/test"},"entity":"TestEntity","entityId":"entity-1","hash":"5bae9c298321b23dd2f20880f6e664733b6ed0dc0f5ebff3c22d30269b891c17","ipAddress":"127.0.0.1","timestamp":"2026-06-24T11:54:19.538Z","userAgent":null,"userEmail":"test@example.com","userId":"user-1"},"service":"web3-student-lab-backend","timestamp":"2026-06-24 12:54:19.539"} diff --git a/backend/logs/combined.log b/backend/logs/combined.log index 99ce7f61..cc7da2c4 100644 --- a/backend/logs/combined.log +++ b/backend/logs/combined.log @@ -8495,3 +8495,1958 @@ {"level":"info","message":"Cache invalidated for block 1780921467","metadata":{"metadata":{"environment":"development","service":"web3-student-lab-backend"}},"timestamp":"2026-06-08 13:24:29.442"} {"level":"info","message":"Cache invalidated for block 1780921767","metadata":{"metadata":{"environment":"development","service":"web3-student-lab-backend"}},"timestamp":"2026-06-08 13:29:29.398"} {"level":"info","message":"Cache invalidated for block 1780922067","metadata":{"metadata":{"environment":"development","service":"web3-student-lab-backend"}},"timestamp":"2026-06-08 13:34:29.413"} +{"correlationId":"a4e2d2c0-b7a4-4721-947a-9542e55ae5ce","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:24:41.464"} +{"correlationId":"test-correlation-id-123","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent","x-correlation-id":"test-correlation-id-123"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:24:41.472"} +{"correlationId":"test-request-id-123","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent","x-request-id":"test-request-id-123"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:24:41.475"} +{"correlationId":"72ff3389-85b7-4d6d-801c-8320d4940b1c","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:24:41.478"} +{"correlationId":"53cda64c-06af-43b8-a0e0-44ba28e818c1","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:24:41.482"} +{"correlationId":"8b89e1cf-a7f9-4f8f-832e-60f9d03c380a","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:24:41.484"} +{"correlationId":"e48bb96d-1d38-49d2-bb78-c6c9b169713c","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:24:41.487"} +{"correlationId":"4ec08529-1ff7-4f18-b850-190260c0f210","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:24:41.491"} +{"correlationId":"34cb7171-25b2-451a-86c6-a495892e68ff","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:24:41.495"} +{"correlationId":"34cb7171-25b2-451a-86c6-a495892e68ff","level":"info","message":"Request completed","metadata":{"metadata":{"duration":"3ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":200,"url":"/api/test"}},"timestamp":"2026-06-24 11:24:41.499"} +{"correlationId":"237b90a3-e6cf-420d-bdba-e8c1ed5e1bf2","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:24:41.503"} +{"correlationId":"237b90a3-e6cf-420d-bdba-e8c1ed5e1bf2","level":"warn","message":"Request completed","metadata":{"metadata":{"duration":"2ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":404,"url":"/api/test"}},"timestamp":"2026-06-24 11:24:41.505"} +{"correlationId":"f47af035-26d6-4d15-92be-b662d2c30fce","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:24:41.508"} +{"correlationId":"f47af035-26d6-4d15-92be-b662d2c30fce","level":"error","message":"Request completed","metadata":{"metadata":{"duration":"1ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":500,"url":"/api/test"}},"timestamp":"2026-06-24 11:24:41.509"} +{"correlationId":"6c4ef538-e4dc-4a3d-9503-7428fbdc5742","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:24:41.514"} +{"correlationId":"6c4ef538-e4dc-4a3d-9503-7428fbdc5742","level":"info","message":"Request completed","metadata":{"metadata":{"duration":"2ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":200,"url":"/api/test"}},"timestamp":"2026-06-24 11:24:41.516"} +{"correlationId":"6bc6c534-bec6-4e23-97f2-e30c150a233b","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"authorization":"[REDACTED]","content-type":"application/json","cookie":"[REDACTED]","user-agent":"test-agent","x-api-key":"[REDACTED]"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:24:41.519"} +{"correlationId":"cba80d06-46d2-49f1-97d1-9491624d57c5","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{"password":"[REDACTED]","token":"[REDACTED]","username":"testuser"},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:24:41.521"} +{"correlationId":"4fdb2df3-a4fc-48a9-9229-98e8a5370400","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:24:41.524"} +{"correlationId":"f22de282-df8e-4bce-8ae9-8d9cbefffd06","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:24:41.526"} +{"correlationId":"f22de282-df8e-4bce-8ae9-8d9cbefffd06","level":"info","message":"Request completed","metadata":{"metadata":{"duration":"6ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":200,"url":"/api/test"}},"timestamp":"2026-06-24 11:24:41.554"} +{"level":"info","message":"GET /api/test","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:41.557"} +{"correlationId":"test-correlation-id-123","level":"info","message":"GET /api/test","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:41.561"} +{"level":"info","message":"GET /api/test","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:41.564"} +{"level":"info","message":"GET /api/test","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:41.568"} +{"correlationId":"4ff5f002-ac44-48b2-8947-693f8bb52c44","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{"email":"test@example.com","password":"[REDACTED]"},"environment":"test","headers":{"authorization":"[REDACTED]","content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"POST","query":{},"service":"web3-student-lab-backend","url":"/api/users","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:24:41.571"} +{"correlationId":"4ff5f002-ac44-48b2-8947-693f8bb52c44","level":"info","message":"Request completed","metadata":{"metadata":{"duration":"2ms","environment":"test","method":"POST","service":"web3-student-lab-backend","statusCode":201,"url":"/api/users"}},"timestamp":"2026-06-24 11:24:41.572"} +{"correlationId":"d28a701c-a8bd-4db4-8333-9d2e3bc4383c","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:24:41.575"} +{"correlationId":"d28a701c-a8bd-4db4-8333-9d2e3bc4383c","level":"warn","message":"Request completed","metadata":{"metadata":{"duration":"2ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":404,"url":"/api/test"}},"timestamp":"2026-06-24 11:24:41.578"} +{"correlationId":"1866e880-69d5-4d76-aa01-d59ec2455605","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:24:41.582"} +{"correlationId":"1866e880-69d5-4d76-aa01-d59ec2455605","level":"error","message":"Request completed","metadata":{"metadata":{"duration":"2ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":500,"url":"/api/test"}},"timestamp":"2026-06-24 11:24:41.583"} +{"level":"info","message":"Connecting to standalone Redis...","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:43.131"} +{"level":"error","message":"Redis ping failed: Stream isn't writeable and enableOfflineQueue options is false","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Stream isn't writeable and enableOfflineQueue options is false\n at EventEmitter.sendCommand (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Redis.js:376:32)\n at EventEmitter.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/utils/Commander.js:90:25)\n at RedisClient.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:94:40)\n at RedisClient.connect (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:83:18)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/cache-distributed.test.ts:11:23)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusHook (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:980:40)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:804:7)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:24:43.145"} +{"level":"info","message":"Invalidated all blockchain caches","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:43.156"} +{"level":"info","message":"BlockHeaderListener started","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:43.158"} +{"level":"info","message":"BlockHeaderListener stopped","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:43.159"} +{"level":"info","message":"Redis (standalone) connected successfully","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:43.176"} +{"level":"info","message":"Redis (standalone) ready","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:43.191"} +{"level":"info","message":"BlockHeaderListener stopped","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:43.263"} +{"level":"warn","message":"Redis (standalone) connection closed","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:44.095"} +{"correlationId":"test-correlation-id-123","level":"info","message":"Test info message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:43.788"} +{"correlationId":"test-correlation-id-123","level":"error","message":"Test error message Test error","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Test error\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/logger.test.ts:96:25)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:24:43.815"} +{"correlationId":"test-correlation-id-123","level":"warn","message":"Test warning message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:43.823"} +{"level":"info","message":"Test message","metadata":{"metadata":{"component":"TestComponent","environment":"test","service":"web3-student-lab-backend","userId":"user-123"}},"timestamp":"2026-06-24 11:24:43.830"} +{"correlationId":"test-correlation-id-123","level":"info","message":"Test message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:43.836"} +{"correlationId":"test-correlation-id-123","level":"info","message":"Test message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","userId":"user-123"}},"timestamp":"2026-06-24 11:24:43.839"} +{"correlationId":"test-correlation-id-123","level":"info","message":"Info message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:43.841"} +{"correlationId":"test-correlation-id-123","level":"warn","message":"Warn message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:43.842"} +{"correlationId":"test-correlation-id-123","level":"error","message":"Error message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:43.844"} +{"level":"info","message":"✅ Environment variables validated successfully","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:44.009"} +{"level":"info","message":"🌍 Environment: development","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:44.012"} +{"level":"info","message":"🔌 Port: 8080","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:44.013"} +{"level":"info","message":"🌐 Stellar Network: testnet","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:44.015"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: DATABASE_URL\nDescription: PostgreSQL connection string for database connectivity\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:44.018"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:44.035"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"short\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:44.038"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"short\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:44.040"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"your-secret-key-change-in-production\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:44.044"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"your-secret-key-change-in-production\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:44.046"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: DATABASE_URL\nDescription: PostgreSQL connection string for database connectivity\nCurrent value: \"invalid-url-format\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:44.049"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: DATABASE_URL\nDescription: PostgreSQL connection string for database connectivity\nCurrent value: \"invalid-url-format\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:44.051"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: STELLAR_ISSUER_SECRET_KEY\nDescription: Stellar secret key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nMissing required environment variable: STELLAR_ISSUER_PUBLIC_KEY\nDescription: Stellar public key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:44.053"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: STELLAR_ISSUER_SECRET_KEY\nDescription: Stellar secret key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nMissing required environment variable: STELLAR_ISSUER_PUBLIC_KEY\nDescription: Stellar public key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:44.059"} +{"level":"info","message":"✅ Environment variables validated successfully","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:44.064"} +{"level":"info","message":"🌍 Environment: production","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:44.065"} +{"level":"info","message":"🔌 Port: 8080","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:44.067"} +{"level":"info","message":"🌐 Stellar Network: testnet","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:44.068"} +{"level":"info","message":"✅ Environment variables validated successfully","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:44.071"} +{"level":"info","message":"🌍 Environment: development","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:44.072"} +{"level":"info","message":"🔌 Port: 8080","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:44.073"} +{"level":"info","message":"🌐 Stellar Network: testnet","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:44.075"} +{"level":"info","message":"✅ Environment variables validated successfully","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:44.079"} +{"level":"info","message":"🌍 Environment: development","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:44.080"} +{"level":"info","message":"🔌 Port: 3000","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:44.082"} +{"level":"info","message":"🌐 Stellar Network: mainnet","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:44.083"} +{"level":"info","message":"Delivered webhook delivery_1 to https://example.com/webhook with status 200","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:45.815"} +{"level":"info","message":"Pinned decentralized asset project/project-1/example -> bafyd37873b9cdea335789ab00f55e95233b9090e32bb1162154b65bc6c2","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:46.270"} +{"level":"info","message":"Unpinned stale decentralized asset bafy123","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:46.273"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:46.639"} +{"level":"info","message":"Smart contract compilation completed","metadata":{"metadata":{"compiled":true,"compilerVersion":"0.8.10","durationMs":0.159945,"environment":"test","errorCount":0,"optimization":false,"service":"web3-student-lab-backend","sourceHash":"1d7028b29df88b09f9297265b8f8c52870c5950670d50fc9c71b99fb63f8c9f3","target":"solidity","warningCount":0}},"timestamp":"2026-06-24 11:24:46.643"} +{"level":"info","message":"Smart contract compilation completed","metadata":{"metadata":{"compiled":false,"compilerVersion":"0.8.10","durationMs":0.055073,"environment":"test","errorCount":1,"optimization":false,"service":"web3-student-lab-backend","sourceHash":"a25af2a7b44af159360737771d82102721af99a7e77e37879498aeab7e5b4260","target":"solidity","warningCount":0}},"timestamp":"2026-06-24 11:24:46.648"} +{"level":"info","message":"Smart contract execution result","metadata":{"metadata":{"caller":"tester","contractAddress":"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef","durationMs":50.751479,"environment":"test","executionId":"be84fd70-7b2f-41e5-bcb7-e2192efe55de","functionName":"execute","gasUsed":380656,"logCount":3,"service":"web3-student-lab-backend","success":true}},"timestamp":"2026-06-24 11:24:46.702"} +{"level":"warn","message":"DB health alerts","metadata":{"metadata":{"alerts":["Warning: DB connection utilization is 90% of configured pool max (10)"],"environment":"test","latencyMs":0,"poolUsage":{"active":9,"idle":1,"total":10,"utilizationPct":90},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:47.317"} +{"level":"error","message":"DB health check failed","metadata":{"metadata":{"environment":"test","error":"database unavailable","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:47.320"} +{"level":"info","message":"Queued webhook delivery 8b1cccac-dbcd-402d-8627-2916e4396e92 for https://example.com/webhook","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:47.593"} +{"level":"info","message":"Connecting to standalone Redis...","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:48.148"} +{"level":"error","message":"Redis ping failed: Stream isn't writeable and enableOfflineQueue options is false","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Stream isn't writeable and enableOfflineQueue options is false\n at EventEmitter.sendCommand (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Redis.js:376:32)\n at EventEmitter.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/utils/Commander.js:90:25)\n at RedisClient.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:94:40)\n at RedisClient.connect (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:83:18)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/cache.test.ts:7:23)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusHook (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:980:40)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:804:7)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:24:48.159"} +{"level":"warn","message":"Error during Redis disconnect: Stream isn't writeable and enableOfflineQueue options is false","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Stream isn't writeable and enableOfflineQueue options is false\n at EventEmitter.sendCommand (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Redis.js:376:32)\n at EventEmitter.quit (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/utils/Commander.js:90:25)\n at RedisClient.disconnect (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:123:27)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/cache.test.ts:11:23)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusHook (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:980:40)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:895:7)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:24:48.170"} +{"level":"warn","message":"Failed to load .env file, using environment variables from system.","metadata":{"metadata":{"environment":"development","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:48.285"} +{"level":"info","message":"✅ Environment variables validated successfully","metadata":{"metadata":{"environment":"development","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:48.286"} +{"level":"info","message":"🌍 Environment: development","metadata":{"metadata":{"environment":"development","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:48.287"} +{"level":"info","message":"🔌 Port: 8080","metadata":{"metadata":{"environment":"development","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:48.288"} +{"level":"info","message":"🌐 Stellar Network: testnet","metadata":{"metadata":{"environment":"development","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:48.289"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1011","meta":{"driverAdapterError":{"cause":{"kind":"TlsConnectionError","reason":"The server does not support SSL connections"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:22.526"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1011","meta":{"driverAdapterError":{"cause":{"kind":"TlsConnectionError","reason":"The server does not support SSL connections"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:22.585"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1011","meta":{"driverAdapterError":{"cause":{"kind":"TlsConnectionError","reason":"The server does not support SSL connections"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:22.616"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1011","meta":{"driverAdapterError":{"cause":{"kind":"TlsConnectionError","reason":"The server does not support SSL connections"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:22.627"} +{"level":"info","message":"RSA Key rotated. New Key ID: 4f041844-a029-4b27-b510-cc2192a3af31","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:24.342"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:25.805"} +{"level":"info","message":"POST /api/v1/students","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:27.203"} +{"level":"info","message":"GET /api/v1/students","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:27.420"} +{"level":"info","message":"POST /api/v1/students","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:27.428"} +{"level":"info","message":"PUT /api/v1/students/undefined","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:27.445"} +{"level":"info","message":"POST /api/v1/students","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:27.459"} +{"level":"info","message":"DELETE /api/v1/students/undefined","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:27.474"} +{"level":"info","message":"GET /api/v1/students/undefined","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:27.499"} +{"level":"info","message":"RSA Key rotated. New Key ID: ac828100-05f9-4b03-bac7-3da685229478","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:28.952"} +{"level":"info","message":"RSA Key rotated. New Key ID: 7bbf711a-e4fc-4e60-adf4-3d86d96de25c","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:31.315"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:29.082"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:31.453"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:18:45)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:25:31.647"} +{"level":"info","message":"Notification created [course_created] Web3 101 — New Course","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:31.648"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:35:45)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:25:31.651"} +{"level":"info","message":"Notification created [learning_opportunity] — Recommended Course","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:31.652"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:47:45)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:25:31.654"} +{"level":"info","message":"Notification created [announcement] — Platform Update","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:31.655"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:60:31)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:25:31.663"} +{"level":"info","message":"Notification created [course_created] — Broadcast","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:31.664"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:66:31)"}},"timestamp":"2026-06-24 11:25:31.666"} +{"level":"info","message":"Notification created [course_updated] — User-specific","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:31.666"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:73:31)"}},"timestamp":"2026-06-24 11:25:31.667"} +{"level":"info","message":"Notification created [course_created] — Other user","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:31.668"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:88:31)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:25:31.670"} +{"level":"info","message":"Notification created [course_created] — A","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:31.671"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:89:31)"}},"timestamp":"2026-06-24 11:25:31.672"} +{"level":"info","message":"Notification created [course_created] — B","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:31.673"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:96:31)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:25:31.675"} +{"level":"info","message":"Notification created [course_created] — First","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:31.675"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:98:31)"}},"timestamp":"2026-06-24 11:25:31.684"} +{"level":"info","message":"Notification created [course_created] — Second","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:31.685"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:108:45)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:25:31.687"} +{"level":"info","message":"Notification created [course_created] — Test","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:31.688"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:129:31)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:25:31.691"} +{"level":"info","message":"Notification created [course_created] — A","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:31.692"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:130:31)"}},"timestamp":"2026-06-24 11:25:31.692"} +{"level":"info","message":"Notification created [course_created] — B","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:31.693"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:131:31)"}},"timestamp":"2026-06-24 11:25:31.696"} +{"level":"info","message":"Notification created [announcement] — C","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:31.697"} +{"level":"info","message":"GET /api/v1/notifications","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:31.705"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:151:31)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:25:31.713"} +{"level":"info","message":"Notification created [course_created] Web3 101 — New Course","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:31.715"} +{"level":"info","message":"GET /api/v1/notifications?userId=test-user","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:31.728"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:168:45)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:25:31.739"} +{"level":"info","message":"Notification created [course_created] — Read test","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:31.740"} +{"level":"info","message":"PUT /api/v1/notifications/notif-1782296731737-1/read","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:31.752"} +{"level":"info","message":"PUT /api/v1/notifications/bad-id/read","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:31.759"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:187:31)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:25:31.766"} +{"level":"info","message":"Notification created [course_created] — A","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:31.769"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:188:31)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)"}},"timestamp":"2026-06-24 11:25:31.770"} +{"level":"info","message":"Notification created [course_created] — B","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:31.771"} +{"level":"info","message":"PUT /api/v1/notifications/read-all","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:31.780"} +{"level":"info","message":"PUT /api/v1/notifications/read-all","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:31.786"} +{"level":"info","message":"RSA Key rotated. New Key ID: 34cc096b-8325-41fa-823f-eca192a49aae","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:32.540"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:32.680"} +{"level":"info","message":"RSA Key rotated. New Key ID: 1b8432ff-7155-4896-9bb4-c2a4a016e65f","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:33.508"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:33.648"} +{"level":"info","message":"GET /health","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:33.837"} +{"level":"info","message":"GET /health","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:33.845"} +{"level":"info","message":"GET /health","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:33.858"} +{"level":"info","message":"GET /health","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:33.866"} +{"level":"info","message":"GET /non-existent-route","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:33.871"} +{"level":"info","message":"RSA Key rotated. New Key ID: ab4f036c-9333-4fba-8582-c039923d2ef2","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:34.548"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:34.691"} +{"level":"info","message":"RSA Key rotated. New Key ID: be00ace0-a3f7-4c90-9a31-3cd3b17f0110","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:35.571"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:35.725"} +{"level":"info","message":"RSA Key rotated. New Key ID: cc9fe72c-1355-405e-b27e-d6408be7f978","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:38.801"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:38.952"} +{"level":"info","message":"POST /api/v1/contracts/compile","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:39.154"} +{"level":"info","message":"RSA Key rotated. New Key ID: 369a2bd8-0118-4cfb-a405-e8a031140280","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:40.129"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:40.279"} +{"level":"info","message":"POST /api/v1/contracts/compile","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:40.476"} +{"level":"info","message":"Smart contract compilation completed","metadata":{"metadata":{"compiled":true,"compilerVersion":"0.8.10","durationMs":0.504769,"environment":"test","errorCount":0,"optimization":false,"service":"web3-student-lab-backend","sourceHash":"57d27b75f33e2f1ce11a20d6b9dad629e025993c91437eafce7ef6be749b90b2","target":"solidity","warningCount":0}},"timestamp":"2026-06-24 11:25:40.481"} +{"level":"info","message":"POST /api/v1/contracts/compile","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:40.505"} +{"level":"info","message":"POST /api/v1/contracts/execute","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:40.521"} +{"level":"info","message":"Smart contract execution result","metadata":{"metadata":{"caller":"test-suite","contractAddress":"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef","durationMs":50.943753,"environment":"test","executionId":"e548b9ef-5b27-4bfc-a84f-a32f3a96fc81","functionName":"execute","gasUsed":1308,"logCount":3,"service":"web3-student-lab-backend","success":true}},"timestamp":"2026-06-24 11:25:40.575"} +{"level":"info","message":"RSA Key rotated. New Key ID: 5849a008-9c69-4b04-81f6-7c237f0b3b21","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:44.180"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:44.464"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:44.724"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:44.735"} +{"level":"info","message":"RSA Key rotated. New Key ID: 0d00e63e-0b53-4b20-8001-31cb4f885f99","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:45.727"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:45.970"} +{"level":"info","message":"RSA Key rotated. New Key ID: 803434d0-a491-4514-9a50-513dd42be817","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:47.347"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:47.485"} +{"level":"info","message":"Connecting to standalone Redis...","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:47.820"} +{"level":"error","message":"Redis ping failed: Stream isn't writeable and enableOfflineQueue options is false","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Stream isn't writeable and enableOfflineQueue options is false\n at EventEmitter.sendCommand (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Redis.js:376:32)\n at EventEmitter.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/utils/Commander.js:90:25)\n at RedisClient.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:94:40)\n at RedisClient.connect (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:83:18)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/cache-distributed.test.ts:11:23)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusHook (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:980:40)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:804:7)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:25:47.837"} +{"level":"info","message":"Invalidated all blockchain caches","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:47.859"} +{"level":"info","message":"BlockHeaderListener started","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:47.863"} +{"level":"info","message":"BlockHeaderListener stopped","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:47.864"} +{"level":"info","message":"Redis (standalone) connected successfully","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:47.870"} +{"level":"info","message":"Redis (standalone) ready","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:47.879"} +{"level":"info","message":"BlockHeaderListener stopped","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:47.968"} +{"level":"warn","message":"Redis (standalone) connection closed","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:48.493"} +{"level":"info","message":"Delivered webhook delivery_1 to https://example.com/webhook with status 200","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:48.800"} +{"correlationId":"c11ed112-9e25-457b-b77f-7f291533c84b","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:25:49.093"} +{"correlationId":"test-correlation-id-123","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent","x-correlation-id":"test-correlation-id-123"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:25:49.099"} +{"correlationId":"test-request-id-123","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent","x-request-id":"test-request-id-123"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:25:49.102"} +{"correlationId":"180b8151-b183-4cab-86af-92dabb7ef2e0","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:25:49.105"} +{"correlationId":"030a70b5-b3d3-4fef-9f95-a268500ec3c8","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:25:49.113"} +{"correlationId":"a844583e-e564-46cf-96ab-b7acc7f7e633","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:25:49.117"} +{"correlationId":"3a5edac3-db85-4172-947a-0f20f748ed60","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:25:49.120"} +{"correlationId":"ee25beb2-4482-402d-8afb-7407da683bf5","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:25:49.123"} +{"correlationId":"bf579f51-d305-466a-b41a-dd00d2f1b09a","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:25:49.125"} +{"correlationId":"bf579f51-d305-466a-b41a-dd00d2f1b09a","level":"info","message":"Request completed","metadata":{"metadata":{"duration":"1ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":200,"url":"/api/test"}},"timestamp":"2026-06-24 11:25:49.127"} +{"correlationId":"ccbcf7e0-a3f3-4f8f-af09-882e6ec2b69e","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:25:49.132"} +{"correlationId":"ccbcf7e0-a3f3-4f8f-af09-882e6ec2b69e","level":"warn","message":"Request completed","metadata":{"metadata":{"duration":"2ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":404,"url":"/api/test"}},"timestamp":"2026-06-24 11:25:49.133"} +{"correlationId":"547b95c3-fc76-4382-b3eb-2cd6d938efa1","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:25:49.137"} +{"correlationId":"547b95c3-fc76-4382-b3eb-2cd6d938efa1","level":"error","message":"Request completed","metadata":{"metadata":{"duration":"1ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":500,"url":"/api/test"}},"timestamp":"2026-06-24 11:25:49.138"} +{"correlationId":"d7866f83-9c9b-41af-882e-93304d21ae1a","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:25:49.142"} +{"correlationId":"d7866f83-9c9b-41af-882e-93304d21ae1a","level":"info","message":"Request completed","metadata":{"metadata":{"duration":"1ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":200,"url":"/api/test"}},"timestamp":"2026-06-24 11:25:49.143"} +{"correlationId":"82748b31-cd22-4cc6-9676-90b2ade8ed94","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"authorization":"[REDACTED]","content-type":"application/json","cookie":"[REDACTED]","user-agent":"test-agent","x-api-key":"[REDACTED]"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:25:49.147"} +{"correlationId":"f3485944-ebd1-4167-8807-50c99c99d88a","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{"password":"[REDACTED]","token":"[REDACTED]","username":"testuser"},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:25:49.155"} +{"correlationId":"25d997eb-edfe-49f5-a2ab-c0327919c3c2","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:25:49.158"} +{"correlationId":"c0d9a8fe-a0d4-4ad5-b71f-223f995ec13a","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:25:49.162"} +{"correlationId":"c0d9a8fe-a0d4-4ad5-b71f-223f995ec13a","level":"info","message":"Request completed","metadata":{"metadata":{"duration":"5ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":200,"url":"/api/test"}},"timestamp":"2026-06-24 11:25:49.167"} +{"level":"info","message":"GET /api/test","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:49.171"} +{"correlationId":"test-correlation-id-123","level":"info","message":"GET /api/test","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:49.174"} +{"level":"info","message":"GET /api/test","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:49.177"} +{"level":"info","message":"GET /api/test","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:49.182"} +{"correlationId":"f43328e3-fa62-456b-85e5-5355ec6df51a","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{"email":"test@example.com","password":"[REDACTED]"},"environment":"test","headers":{"authorization":"[REDACTED]","content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"POST","query":{},"service":"web3-student-lab-backend","url":"/api/users","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:25:49.185"} +{"correlationId":"f43328e3-fa62-456b-85e5-5355ec6df51a","level":"info","message":"Request completed","metadata":{"metadata":{"duration":"1ms","environment":"test","method":"POST","service":"web3-student-lab-backend","statusCode":201,"url":"/api/users"}},"timestamp":"2026-06-24 11:25:49.186"} +{"correlationId":"b27a2a8f-4dba-467b-9523-34600fe986a8","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:25:49.189"} +{"correlationId":"b27a2a8f-4dba-467b-9523-34600fe986a8","level":"warn","message":"Request completed","metadata":{"metadata":{"duration":"1ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":404,"url":"/api/test"}},"timestamp":"2026-06-24 11:25:49.191"} +{"correlationId":"934e3539-afb2-4d5d-8a5c-0bc2ae167dc0","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:25:49.194"} +{"correlationId":"934e3539-afb2-4d5d-8a5c-0bc2ae167dc0","level":"error","message":"Request completed","metadata":{"metadata":{"duration":"1ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":500,"url":"/api/test"}},"timestamp":"2026-06-24 11:25:49.196"} +{"correlationId":"test-correlation-id-123","level":"info","message":"Test info message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:49.464"} +{"correlationId":"test-correlation-id-123","level":"error","message":"Test error message Test error","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Test error\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/logger.test.ts:96:25)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:25:49.484"} +{"correlationId":"test-correlation-id-123","level":"warn","message":"Test warning message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:49.486"} +{"level":"info","message":"Test message","metadata":{"metadata":{"component":"TestComponent","environment":"test","service":"web3-student-lab-backend","userId":"user-123"}},"timestamp":"2026-06-24 11:25:49.492"} +{"correlationId":"test-correlation-id-123","level":"info","message":"Test message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:49.500"} +{"correlationId":"test-correlation-id-123","level":"info","message":"Test message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","userId":"user-123"}},"timestamp":"2026-06-24 11:25:49.503"} +{"correlationId":"test-correlation-id-123","level":"info","message":"Info message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:49.506"} +{"correlationId":"test-correlation-id-123","level":"warn","message":"Warn message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:49.507"} +{"correlationId":"test-correlation-id-123","level":"error","message":"Error message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:49.508"} +{"level":"info","message":"✅ Environment variables validated successfully","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:49.609"} +{"level":"info","message":"🌍 Environment: development","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:49.610"} +{"level":"info","message":"🔌 Port: 8080","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:49.611"} +{"level":"info","message":"🌐 Stellar Network: testnet","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:49.613"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: DATABASE_URL\nDescription: PostgreSQL connection string for database connectivity\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:49.616"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:49.634"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"short\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:49.637"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"short\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:49.639"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"your-secret-key-change-in-production\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:49.642"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"your-secret-key-change-in-production\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:49.643"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: DATABASE_URL\nDescription: PostgreSQL connection string for database connectivity\nCurrent value: \"invalid-url-format\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:49.648"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: DATABASE_URL\nDescription: PostgreSQL connection string for database connectivity\nCurrent value: \"invalid-url-format\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:49.650"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: STELLAR_ISSUER_SECRET_KEY\nDescription: Stellar secret key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nMissing required environment variable: STELLAR_ISSUER_PUBLIC_KEY\nDescription: Stellar public key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:49.656"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: STELLAR_ISSUER_SECRET_KEY\nDescription: Stellar secret key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nMissing required environment variable: STELLAR_ISSUER_PUBLIC_KEY\nDescription: Stellar public key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:49.658"} +{"level":"info","message":"✅ Environment variables validated successfully","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:49.661"} +{"level":"info","message":"🌍 Environment: production","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:49.663"} +{"level":"info","message":"🔌 Port: 8080","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:49.664"} +{"level":"info","message":"🌐 Stellar Network: testnet","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:49.665"} +{"level":"info","message":"✅ Environment variables validated successfully","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:49.669"} +{"level":"info","message":"🌍 Environment: development","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:49.670"} +{"level":"info","message":"🔌 Port: 8080","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:49.671"} +{"level":"info","message":"🌐 Stellar Network: testnet","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:49.671"} +{"level":"info","message":"✅ Environment variables validated successfully","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:49.674"} +{"level":"info","message":"🌍 Environment: development","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:49.675"} +{"level":"info","message":"🔌 Port: 3000","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:49.675"} +{"level":"info","message":"🌐 Stellar Network: mainnet","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:49.676"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:49.882"} +{"level":"info","message":"Smart contract compilation completed","metadata":{"metadata":{"compiled":true,"compilerVersion":"0.8.10","durationMs":0.089949,"environment":"test","errorCount":0,"optimization":false,"service":"web3-student-lab-backend","sourceHash":"1d7028b29df88b09f9297265b8f8c52870c5950670d50fc9c71b99fb63f8c9f3","target":"solidity","warningCount":0}},"timestamp":"2026-06-24 11:25:49.886"} +{"level":"info","message":"Smart contract compilation completed","metadata":{"metadata":{"compiled":false,"compilerVersion":"0.8.10","durationMs":0.061441,"environment":"test","errorCount":1,"optimization":false,"service":"web3-student-lab-backend","sourceHash":"a25af2a7b44af159360737771d82102721af99a7e77e37879498aeab7e5b4260","target":"solidity","warningCount":0}},"timestamp":"2026-06-24 11:25:49.889"} +{"level":"info","message":"Smart contract execution result","metadata":{"metadata":{"caller":"tester","contractAddress":"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef","durationMs":49.930637,"environment":"test","executionId":"d7bfc9bf-0d21-4bd7-90c2-65d8691bbd7f","functionName":"execute","gasUsed":390484,"logCount":3,"service":"web3-student-lab-backend","success":true}},"timestamp":"2026-06-24 11:25:49.942"} +{"level":"info","message":"Pinned decentralized asset project/project-1/example -> bafyd37873b9cdea335789ab00f55e95233b9090e32bb1162154b65bc6c2","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:50.060"} +{"level":"info","message":"Unpinned stale decentralized asset bafy123","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:50.071"} +{"level":"info","message":"Queued webhook delivery fb68b6c8-d2fc-4b90-ab93-3ebbd501a8fa for https://example.com/webhook","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:50.187"} +{"level":"info","message":"Connecting to standalone Redis...","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:50.341"} +{"level":"error","message":"Redis ping failed: Stream isn't writeable and enableOfflineQueue options is false","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Stream isn't writeable and enableOfflineQueue options is false\n at EventEmitter.sendCommand (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Redis.js:376:32)\n at EventEmitter.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/utils/Commander.js:90:25)\n at RedisClient.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:94:40)\n at RedisClient.connect (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:83:18)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/cache.test.ts:7:23)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusHook (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:980:40)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:804:7)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:25:50.355"} +{"level":"warn","message":"Error during Redis disconnect: Stream isn't writeable and enableOfflineQueue options is false","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Stream isn't writeable and enableOfflineQueue options is false\n at EventEmitter.sendCommand (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Redis.js:376:32)\n at EventEmitter.quit (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/utils/Commander.js:90:25)\n at RedisClient.disconnect (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:123:27)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/cache.test.ts:11:23)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusHook (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:980:40)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:895:7)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:25:50.373"} +{"level":"warn","message":"Failed to load .env file, using environment variables from system.","metadata":{"metadata":{"environment":"development","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:50.655"} +{"level":"info","message":"✅ Environment variables validated successfully","metadata":{"metadata":{"environment":"development","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:50.656"} +{"level":"info","message":"🌍 Environment: development","metadata":{"metadata":{"environment":"development","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:50.657"} +{"level":"info","message":"🔌 Port: 8080","metadata":{"metadata":{"environment":"development","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:50.658"} +{"level":"info","message":"🌐 Stellar Network: testnet","metadata":{"metadata":{"environment":"development","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:50.659"} +{"level":"warn","message":"DB health alerts","metadata":{"metadata":{"alerts":["Warning: DB connection utilization is 90% of configured pool max (10)"],"environment":"test","latencyMs":0,"poolUsage":{"active":9,"idle":1,"total":10,"utilizationPct":90},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:50.751"} +{"level":"error","message":"DB health check failed","metadata":{"metadata":{"environment":"test","error":"database unavailable","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:50.754"} +{"level":"info","message":"RSA Key rotated. New Key ID: 341523ee-0310-4447-a41b-589affd3b9e3","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:40.128"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:41.147"} +{"level":"info","message":"POST /api/v1/students","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:41.890"} +{"level":"info","message":"GET /api/v1/students","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:42.333"} +{"level":"info","message":"POST /api/v1/students","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:42.342"} +{"level":"info","message":"PUT /api/v1/students/undefined","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:42.368"} +{"level":"info","message":"POST /api/v1/students","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:42.406"} +{"level":"info","message":"DELETE /api/v1/students/undefined","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:42.428"} +{"level":"info","message":"GET /api/v1/students/undefined","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:42.459"} +{"level":"info","message":"RSA Key rotated. New Key ID: c4c0d88e-ac4b-47ce-af6c-4d48d9c99b69","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:43.542"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:43.692"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1000","meta":{"driverAdapterError":{"cause":{"kind":"AuthenticationFailed","originalCode":"28P01","originalMessage":"password authentication failed for user \"dummy\"","user":"dummy"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:45.113"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1000","meta":{"driverAdapterError":{"cause":{"kind":"AuthenticationFailed","originalCode":"28P01","originalMessage":"password authentication failed for user \"dummy\"","user":"dummy"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:45.185"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1000","meta":{"driverAdapterError":{"cause":{"kind":"AuthenticationFailed","originalCode":"28P01","originalMessage":"password authentication failed for user \"dummy\"","user":"dummy"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:45.226"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1000","meta":{"driverAdapterError":{"cause":{"kind":"AuthenticationFailed","originalCode":"28P01","originalMessage":"password authentication failed for user \"dummy\"","user":"dummy"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:45.253"} +{"level":"info","message":"RSA Key rotated. New Key ID: 616d07b7-0c3d-40a1-ae32-6252179d2998","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:47.776"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:47.923"} +{"level":"info","message":"RSA Key rotated. New Key ID: b4fca5b3-763a-4eda-b25c-535247970240","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:49.158"} +{"level":"info","message":"RSA Key rotated. New Key ID: 6dd40421-c935-4133-a9d2-6156d9394455","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:50.777"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:49.342"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:51.066"} +{"level":"info","message":"RSA Key rotated. New Key ID: a11a956c-4e17-4a45-897f-9286f19a93ad","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:52.055"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:52.219"} +{"level":"info","message":"RSA Key rotated. New Key ID: 280d57c7-e0a8-42be-bdbe-e0730ebd037d","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:53.089"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:53.232"} +{"level":"info","message":"RSA Key rotated. New Key ID: 997a722d-9c7d-41a3-a7fe-23251abcf9ca","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:54.091"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:54.238"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:54.477"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:54.521"} +{"level":"info","message":"RSA Key rotated. New Key ID: 81a89a9a-2f85-4b8a-a4bc-2bbd14d8671c","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:55.106"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:55.257"} +{"level":"info","message":"POST /api/v1/contracts/compile","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:55.501"} +{"level":"info","message":"RSA Key rotated. New Key ID: 2e2d0088-f4ca-4ed1-8075-da459464e6b7","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:56.919"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:57.058"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:18:45)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:35:57.266"} +{"level":"info","message":"Notification created [course_created] Web3 101 — New Course","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:57.267"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:35:45)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:35:57.271"} +{"level":"info","message":"Notification created [learning_opportunity] — Recommended Course","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:57.272"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:47:45)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:35:57.275"} +{"level":"info","message":"Notification created [announcement] — Platform Update","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:57.277"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:60:31)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:35:57.281"} +{"level":"info","message":"Notification created [course_created] — Broadcast","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:57.282"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:66:31)"}},"timestamp":"2026-06-24 11:35:57.283"} +{"level":"info","message":"Notification created [course_updated] — User-specific","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:57.284"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:73:31)"}},"timestamp":"2026-06-24 11:35:57.285"} +{"level":"info","message":"Notification created [course_created] — Other user","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:57.286"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:88:31)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:35:57.289"} +{"level":"info","message":"Notification created [course_created] — A","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:57.290"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:89:31)"}},"timestamp":"2026-06-24 11:35:57.292"} +{"level":"info","message":"Notification created [course_created] — B","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:57.293"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:96:31)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:35:57.297"} +{"level":"info","message":"Notification created [course_created] — First","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:57.299"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:98:31)"}},"timestamp":"2026-06-24 11:35:57.316"} +{"level":"info","message":"Notification created [course_created] — Second","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:57.317"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:108:45)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:35:57.320"} +{"level":"info","message":"Notification created [course_created] — Test","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:57.321"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:129:31)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:35:57.325"} +{"level":"info","message":"Notification created [course_created] — A","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:57.326"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:130:31)"}},"timestamp":"2026-06-24 11:35:57.328"} +{"level":"info","message":"Notification created [course_created] — B","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:57.328"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:131:31)"}},"timestamp":"2026-06-24 11:35:57.330"} +{"level":"info","message":"Notification created [announcement] — C","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:57.330"} +{"level":"info","message":"GET /api/v1/notifications","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:57.339"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:151:31)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:35:57.346"} +{"level":"info","message":"Notification created [course_created] Web3 101 — New Course","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:57.347"} +{"level":"info","message":"GET /api/v1/notifications?userId=test-user","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:57.355"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:168:45)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:35:57.366"} +{"level":"info","message":"Notification created [course_created] — Read test","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:57.367"} +{"level":"info","message":"PUT /api/v1/notifications/notif-1782297357364-1/read","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:57.374"} +{"level":"info","message":"PUT /api/v1/notifications/bad-id/read","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:57.382"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:187:31)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:35:57.387"} +{"level":"info","message":"Notification created [course_created] — A","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:57.388"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:188:31)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)"}},"timestamp":"2026-06-24 11:35:57.389"} +{"level":"info","message":"Notification created [course_created] — B","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:57.390"} +{"level":"info","message":"PUT /api/v1/notifications/read-all","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:57.401"} +{"level":"info","message":"PUT /api/v1/notifications/read-all","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:57.413"} +{"level":"info","message":"RSA Key rotated. New Key ID: 38862f8c-468e-4f1e-9365-10e0712e4309","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:58.378"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:58.519"} +{"level":"info","message":"POST /api/v1/contracts/compile","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:58.715"} +{"level":"info","message":"Smart contract compilation completed","metadata":{"metadata":{"compiled":true,"compilerVersion":"0.8.10","durationMs":0.36388,"environment":"test","errorCount":0,"optimization":false,"service":"web3-student-lab-backend","sourceHash":"57d27b75f33e2f1ce11a20d6b9dad629e025993c91437eafce7ef6be749b90b2","target":"solidity","warningCount":0}},"timestamp":"2026-06-24 11:35:58.728"} +{"level":"info","message":"POST /api/v1/contracts/compile","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:58.743"} +{"level":"info","message":"POST /api/v1/contracts/execute","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:58.754"} +{"level":"info","message":"Smart contract execution result","metadata":{"metadata":{"caller":"test-suite","contractAddress":"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef","durationMs":51.098748,"environment":"test","executionId":"462b5c49-82c5-409c-90b7-254ecc63be3b","functionName":"execute","gasUsed":20228,"logCount":3,"service":"web3-student-lab-backend","success":true}},"timestamp":"2026-06-24 11:35:58.808"} +{"level":"info","message":"RSA Key rotated. New Key ID: bc2e3466-c69c-4ca6-a4cf-399e4dc38d76","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:00.179"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:00.310"} +{"level":"info","message":"GET /health","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:00.509"} +{"level":"info","message":"GET /health","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:00.518"} +{"level":"info","message":"GET /health","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:00.527"} +{"level":"info","message":"GET /health","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:00.535"} +{"level":"info","message":"GET /non-existent-route","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:00.541"} +{"level":"info","message":"Connecting to standalone Redis...","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:00.657"} +{"level":"error","message":"Redis ping failed: Stream isn't writeable and enableOfflineQueue options is false","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Stream isn't writeable and enableOfflineQueue options is false\n at EventEmitter.sendCommand (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Redis.js:376:32)\n at EventEmitter.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/utils/Commander.js:90:25)\n at RedisClient.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:94:40)\n at RedisClient.connect (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:83:18)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/cache-distributed.test.ts:11:23)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusHook (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:980:40)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:804:7)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:36:00.675"} +{"level":"info","message":"Invalidated all blockchain caches","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:00.702"} +{"level":"info","message":"BlockHeaderListener started","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:00.706"} +{"level":"info","message":"BlockHeaderListener stopped","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:00.708"} +{"level":"info","message":"Redis (standalone) connected successfully","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:00.719"} +{"level":"info","message":"Redis (standalone) ready","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:00.725"} +{"level":"info","message":"BlockHeaderListener stopped","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:00.815"} +{"level":"warn","message":"Redis (standalone) connection closed","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:01.632"} +{"correlationId":"abff655c-cb55-43ba-983b-7c0613e11dd9","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:36:01.919"} +{"correlationId":"test-correlation-id-123","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent","x-correlation-id":"test-correlation-id-123"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:36:01.924"} +{"correlationId":"test-request-id-123","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent","x-request-id":"test-request-id-123"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:36:01.927"} +{"correlationId":"1e973454-d8da-4fbc-976e-f111025dcaf7","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:36:01.935"} +{"correlationId":"edbc12fd-aac3-497a-92a2-8ca6759eae06","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:36:01.938"} +{"correlationId":"d15223ec-838f-402d-b800-3768ef28a4f0","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:36:01.941"} +{"correlationId":"eb14e1bf-9bc8-4434-a7ab-a23107f985b9","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:36:01.945"} +{"correlationId":"e9627c8a-7736-4bb3-b75e-54104aef2dff","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:36:01.949"} +{"correlationId":"86ed9f88-d627-46b3-a850-f1bb05d82f69","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:36:01.953"} +{"correlationId":"86ed9f88-d627-46b3-a850-f1bb05d82f69","level":"info","message":"Request completed","metadata":{"metadata":{"duration":"1ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":200,"url":"/api/test"}},"timestamp":"2026-06-24 11:36:01.954"} +{"correlationId":"08b999ee-9d25-48e7-88ed-bba4176e76e9","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:36:01.957"} +{"correlationId":"08b999ee-9d25-48e7-88ed-bba4176e76e9","level":"warn","message":"Request completed","metadata":{"metadata":{"duration":"2ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":404,"url":"/api/test"}},"timestamp":"2026-06-24 11:36:01.959"} +{"correlationId":"94ee1c3d-049b-442f-a006-ec6c0f9c81dd","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:36:01.963"} +{"correlationId":"94ee1c3d-049b-442f-a006-ec6c0f9c81dd","level":"error","message":"Request completed","metadata":{"metadata":{"duration":"1ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":500,"url":"/api/test"}},"timestamp":"2026-06-24 11:36:01.964"} +{"correlationId":"03e85008-e0d8-4f67-8220-491812e1e03c","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:36:01.968"} +{"correlationId":"03e85008-e0d8-4f67-8220-491812e1e03c","level":"info","message":"Request completed","metadata":{"metadata":{"duration":"1ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":200,"url":"/api/test"}},"timestamp":"2026-06-24 11:36:01.969"} +{"correlationId":"0ae35fbb-a09a-4cd0-b3d8-12d43f87ca6b","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"authorization":"[REDACTED]","content-type":"application/json","cookie":"[REDACTED]","user-agent":"test-agent","x-api-key":"[REDACTED]"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:36:01.975"} +{"correlationId":"720c860e-a391-4973-ba0e-ad524a1bd3ca","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{"password":"[REDACTED]","token":"[REDACTED]","username":"testuser"},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:36:01.979"} +{"correlationId":"4479c126-4290-435d-9b47-8e2a5a44a3b7","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:36:01.983"} +{"correlationId":"6c9b27f6-d86e-4ce4-a2a1-2c7e6a7047d1","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:36:01.986"} +{"correlationId":"6c9b27f6-d86e-4ce4-a2a1-2c7e6a7047d1","level":"info","message":"Request completed","metadata":{"metadata":{"duration":"3ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":200,"url":"/api/test"}},"timestamp":"2026-06-24 11:36:01.989"} +{"level":"info","message":"GET /api/test","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:01.993"} +{"correlationId":"test-correlation-id-123","level":"info","message":"GET /api/test","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:01.997"} +{"level":"info","message":"GET /api/test","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:02.000"} +{"level":"info","message":"GET /api/test","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:02.003"} +{"correlationId":"e3fa5096-4ce5-49aa-b42b-9afa838dcfba","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{"email":"test@example.com","password":"[REDACTED]"},"environment":"test","headers":{"authorization":"[REDACTED]","content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"POST","query":{},"service":"web3-student-lab-backend","url":"/api/users","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:36:02.006"} +{"correlationId":"e3fa5096-4ce5-49aa-b42b-9afa838dcfba","level":"info","message":"Request completed","metadata":{"metadata":{"duration":"2ms","environment":"test","method":"POST","service":"web3-student-lab-backend","statusCode":201,"url":"/api/users"}},"timestamp":"2026-06-24 11:36:02.007"} +{"correlationId":"3e82f27c-1d85-4934-947f-92cb5a5a2e39","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:36:02.011"} +{"correlationId":"3e82f27c-1d85-4934-947f-92cb5a5a2e39","level":"warn","message":"Request completed","metadata":{"metadata":{"duration":"2ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":404,"url":"/api/test"}},"timestamp":"2026-06-24 11:36:02.013"} +{"correlationId":"d756e1af-b2a9-4c36-842f-1287501d1bea","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:36:02.019"} +{"correlationId":"d756e1af-b2a9-4c36-842f-1287501d1bea","level":"error","message":"Request completed","metadata":{"metadata":{"duration":"4ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":500,"url":"/api/test"}},"timestamp":"2026-06-24 11:36:02.020"} +{"level":"info","message":"✅ Environment variables validated successfully","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:02.216"} +{"level":"info","message":"🌍 Environment: development","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:02.230"} +{"level":"info","message":"🔌 Port: 8080","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:02.232"} +{"level":"info","message":"🌐 Stellar Network: testnet","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:02.236"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: DATABASE_URL\nDescription: PostgreSQL connection string for database connectivity\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:02.242"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:02.281"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"short\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:02.287"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"short\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:02.291"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"your-secret-key-change-in-production\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:02.302"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"your-secret-key-change-in-production\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:02.305"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: DATABASE_URL\nDescription: PostgreSQL connection string for database connectivity\nCurrent value: \"invalid-url-format\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:02.312"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: DATABASE_URL\nDescription: PostgreSQL connection string for database connectivity\nCurrent value: \"invalid-url-format\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:02.315"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: STELLAR_ISSUER_SECRET_KEY\nDescription: Stellar secret key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nMissing required environment variable: STELLAR_ISSUER_PUBLIC_KEY\nDescription: Stellar public key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:02.323"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: STELLAR_ISSUER_SECRET_KEY\nDescription: Stellar secret key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nMissing required environment variable: STELLAR_ISSUER_PUBLIC_KEY\nDescription: Stellar public key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:02.326"} +{"level":"info","message":"✅ Environment variables validated successfully","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:02.333"} +{"level":"info","message":"🌍 Environment: production","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:02.336"} +{"level":"info","message":"🔌 Port: 8080","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:02.338"} +{"level":"info","message":"🌐 Stellar Network: testnet","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:02.340"} +{"level":"info","message":"✅ Environment variables validated successfully","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:02.357"} +{"level":"info","message":"🌍 Environment: development","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:02.359"} +{"level":"info","message":"🔌 Port: 8080","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:02.361"} +{"level":"info","message":"🌐 Stellar Network: testnet","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:02.363"} +{"level":"info","message":"✅ Environment variables validated successfully","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:02.369"} +{"level":"info","message":"🌍 Environment: development","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:02.371"} +{"level":"info","message":"🔌 Port: 3000","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:02.373"} +{"level":"info","message":"🌐 Stellar Network: mainnet","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:02.375"} +{"correlationId":"test-correlation-id-123","level":"info","message":"Test info message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:03.043"} +{"correlationId":"test-correlation-id-123","level":"error","message":"Test error message Test error","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Test error\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/logger.test.ts:96:25)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:36:03.069"} +{"correlationId":"test-correlation-id-123","level":"warn","message":"Test warning message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:03.074"} +{"level":"info","message":"Test message","metadata":{"metadata":{"component":"TestComponent","environment":"test","service":"web3-student-lab-backend","userId":"user-123"}},"timestamp":"2026-06-24 11:36:03.088"} +{"correlationId":"test-correlation-id-123","level":"info","message":"Test message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:03.101"} +{"correlationId":"test-correlation-id-123","level":"info","message":"Test message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","userId":"user-123"}},"timestamp":"2026-06-24 11:36:03.112"} +{"correlationId":"test-correlation-id-123","level":"info","message":"Info message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:03.118"} +{"correlationId":"test-correlation-id-123","level":"warn","message":"Warn message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:03.120"} +{"correlationId":"test-correlation-id-123","level":"error","message":"Error message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:03.122"} +{"level":"info","message":"Delivered webhook delivery_1 to https://example.com/webhook with status 200","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:03.975"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:04.085"} +{"level":"info","message":"Smart contract compilation completed","metadata":{"metadata":{"compiled":true,"compilerVersion":"0.8.10","durationMs":0.083603,"environment":"test","errorCount":0,"optimization":false,"service":"web3-student-lab-backend","sourceHash":"1d7028b29df88b09f9297265b8f8c52870c5950670d50fc9c71b99fb63f8c9f3","target":"solidity","warningCount":0}},"timestamp":"2026-06-24 11:36:04.089"} +{"level":"info","message":"Smart contract compilation completed","metadata":{"metadata":{"compiled":false,"compilerVersion":"0.8.10","durationMs":0.127452,"environment":"test","errorCount":1,"optimization":false,"service":"web3-student-lab-backend","sourceHash":"a25af2a7b44af159360737771d82102721af99a7e77e37879498aeab7e5b4260","target":"solidity","warningCount":0}},"timestamp":"2026-06-24 11:36:04.093"} +{"level":"info","message":"Smart contract execution result","metadata":{"metadata":{"caller":"tester","contractAddress":"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef","durationMs":49.562372,"environment":"test","executionId":"88a16746-0843-499e-83cb-9fa41c923c18","functionName":"execute","gasUsed":374833,"logCount":3,"service":"web3-student-lab-backend","success":true}},"timestamp":"2026-06-24 11:36:04.146"} +{"level":"info","message":"Pinned decentralized asset project/project-1/example -> bafyd37873b9cdea335789ab00f55e95233b9090e32bb1162154b65bc6c2","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:04.275"} +{"level":"info","message":"Unpinned stale decentralized asset bafy123","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:04.300"} +{"level":"info","message":"Connecting to standalone Redis...","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:04.447"} +{"level":"error","message":"Redis ping failed: Stream isn't writeable and enableOfflineQueue options is false","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Stream isn't writeable and enableOfflineQueue options is false\n at EventEmitter.sendCommand (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Redis.js:376:32)\n at EventEmitter.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/utils/Commander.js:90:25)\n at RedisClient.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:94:40)\n at RedisClient.connect (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:83:18)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/cache.test.ts:7:23)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusHook (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:980:40)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:804:7)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:36:04.462"} +{"level":"warn","message":"Error during Redis disconnect: Stream isn't writeable and enableOfflineQueue options is false","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Stream isn't writeable and enableOfflineQueue options is false\n at EventEmitter.sendCommand (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Redis.js:376:32)\n at EventEmitter.quit (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/utils/Commander.js:90:25)\n at RedisClient.disconnect (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:123:27)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/cache.test.ts:11:23)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusHook (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:980:40)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:895:7)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:36:04.473"} +{"level":"info","message":"Queued webhook delivery bf40c946-0d26-4590-aea5-72f09cf74673 for https://example.com/webhook","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:04.608"} +{"level":"warn","message":"Failed to load .env file, using environment variables from system.","metadata":{"metadata":{"environment":"development","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:05.163"} +{"level":"info","message":"✅ Environment variables validated successfully","metadata":{"metadata":{"environment":"development","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:05.164"} +{"level":"info","message":"🌍 Environment: development","metadata":{"metadata":{"environment":"development","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:05.166"} +{"level":"info","message":"🔌 Port: 8080","metadata":{"metadata":{"environment":"development","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:05.167"} +{"level":"info","message":"🌐 Stellar Network: testnet","metadata":{"metadata":{"environment":"development","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:05.168"} +{"level":"warn","message":"DB health alerts","metadata":{"metadata":{"alerts":["Warning: DB connection utilization is 90% of configured pool max (10)"],"environment":"test","latencyMs":1,"poolUsage":{"active":9,"idle":1,"total":10,"utilizationPct":90},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:05.264"} +{"level":"error","message":"DB health check failed","metadata":{"metadata":{"environment":"test","error":"database unavailable","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:05.269"} +{"level":"info","message":"RSA Key rotated. New Key ID: 8bbf9c7d-6dfb-418b-960e-719898828148","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:46.406"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:46.875"} +{"level":"info","message":"POST /api/v1/students","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:47.553"} +{"level":"info","message":"GET /api/v1/students","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:47.773"} +{"level":"info","message":"POST /api/v1/students","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:47.790"} +{"level":"info","message":"PUT /api/v1/students/undefined","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:47.802"} +{"level":"info","message":"POST /api/v1/students","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:48.087"} +{"level":"info","message":"DELETE /api/v1/students/undefined","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:48.104"} +{"level":"info","message":"GET /api/v1/students/undefined","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:48.132"} +{"level":"info","message":"RSA Key rotated. New Key ID: e2b579b1-3eb9-451c-a84a-adc6bf53cb9c","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:49.163"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:49.310"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:49.653"} +{"level":"info","message":"Simulated mint for token 787237","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:49.872"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297409667 -> token 787237","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297409667","environment":"test","service":"web3-student-lab-backend","tokenId":"787237","txHash":"0xef7d6e4f25b60fbc44e8ce4792836c2bcf7f1b7bf07fc388f65acceb083bd4fd"}},"timestamp":"2026-06-24 11:36:49.882"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297409667","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297409667","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:49.884"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:49.899"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:49.931"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:49.938"} +{"level":"error","message":"Mint certificate error: Student with ID non-existent-student not found","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:49.944"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:49.952"} +{"level":"error","message":"Mint certificate error: Course with ID non-existent-course not found","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:49.957"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:49.969"} +{"level":"info","message":"Simulated mint for token 533475","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:50.107"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297409974 -> token 533475","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297409974","environment":"test","service":"web3-student-lab-backend","tokenId":"533475","txHash":"0x113198b0df20cb62e9c67d06bc3ad2db6153d01b8a40e9f36d1b33c92eaf9980"}},"timestamp":"2026-06-24 11:36:50.114"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297409974","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297409974","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:50.115"} +{"level":"info","message":"GET /api/v1/certificates/verify/533475","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:50.123"} +{"level":"info","message":"GET /api/v1/certificates/verify/nonexistenttoken123","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:50.164"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:50.185"} +{"level":"info","message":"Simulated mint for token 686908","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:50.323"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297410192 -> token 686908","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297410192","environment":"test","service":"web3-student-lab-backend","tokenId":"686908","txHash":"0xf98da8ac8c8633955e63f6477bbe56e93001ae3467c92b7b5a9e90db24254543"}},"timestamp":"2026-06-24 11:36:50.336"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297410192","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297410192","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:50.337"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:50.344"} +{"level":"info","message":"Simulated mint for token batch-token-2","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:50.490"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297410353 -> token batch-token-2","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297410353","environment":"test","service":"web3-student-lab-backend","tokenId":"batch-token-2","txHash":"0xb97555ac2ca777cc6843bec301376c46c2767caeea5fbb3788dd56c1cafa2d3e"}},"timestamp":"2026-06-24 11:36:50.503"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297410353","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297410353","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:50.505"} +{"level":"info","message":"POST /api/v1/certificates/verify/batch","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:50.520"} +{"level":"info","message":"POST /api/v1/certificates/verify/batch","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:50.545"} +{"level":"info","message":"POST /api/v1/certificates/verify/batch","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:50.552"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:50.558"} +{"level":"info","message":"Simulated mint for token 500413","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:50.689"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297410565 -> token 500413","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297410565","environment":"test","service":"web3-student-lab-backend","tokenId":"500413","txHash":"0xbda0b0d2d3792a67ad521cc21aacd2293e955dc52a1c0da516dc8e4eed01ff52"}},"timestamp":"2026-06-24 11:36:50.701"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297410565","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297410565","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:50.704"} +{"level":"info","message":"GET /api/v1/certificates/500413/metadata","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:50.716"} +{"level":"info","message":"GET /api/v1/certificates/nonexistent/metadata","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:50.734"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:50.743"} +{"level":"info","message":"Simulated mint for token 458323","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:50.877"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297410753 -> token 458323","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297410753","environment":"test","service":"web3-student-lab-backend","tokenId":"458323","txHash":"0xabc583a70a133418df083b279ee740905ce2cedf4095aa3029aa022541c01267"}},"timestamp":"2026-06-24 11:36:50.949"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297410753","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297410753","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:50.950"} +{"level":"info","message":"GET /api/v1/certificates/458323/metadata","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:50.954"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:50.966"} +{"level":"info","message":"Simulated mint for token 309296","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:51.096"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297410972 -> token 309296","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297410972","environment":"test","service":"web3-student-lab-backend","tokenId":"309296","txHash":"0x2883b7e975d06ad7ef6eff760b7547ee935d06bd9a93cbf96992f699592b8b26"}},"timestamp":"2026-06-24 11:36:51.105"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297410972","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297410972","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:51.107"} +{"level":"info","message":"GET /api/v1/certificates/cert-api-stud-api-cour-1782297410972","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:51.112"} +{"level":"info","message":"GET /api/v1/certificates/nonexistent-id","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:51.124"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:51.133"} +{"level":"info","message":"Simulated mint for token 961928","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:51.268"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297411139 -> token 961928","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297411139","environment":"test","service":"web3-student-lab-backend","tokenId":"961928","txHash":"0xf86a7638a1645d5f98daf5e2c71d82b706eb31e2df029223cc04e39051392b67"}},"timestamp":"2026-06-24 11:36:51.277"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297411139","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297411139","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:51.281"} +{"level":"info","message":"GET /api/v1/certificates/student/api-student-123","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:51.293"} +{"level":"info","message":"GET /api/v1/certificates/student/nonexistent-student","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:51.318"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:51.329"} +{"level":"info","message":"Simulated mint for token 45743","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:51.462"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297411336 -> token 45743","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297411336","environment":"test","service":"web3-student-lab-backend","tokenId":"45743","txHash":"0xc96e8e955b98185ea79c3636c76a135fd5055beac8ad07ced9f8b768ae54086c"}},"timestamp":"2026-06-24 11:36:51.478"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297411336","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297411336","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:51.483"} +{"level":"info","message":"PUT /api/v1/certificates/cert-api-stud-api-cour-1782297411336/revoke","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:51.499"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:51.519"} +{"level":"info","message":"Simulated mint for token 917680","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:51.656"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297411530 -> token 917680","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297411530","environment":"test","service":"web3-student-lab-backend","tokenId":"917680","txHash":"0x71aa25c78228be92b2cb15e56903ba70aa111ff22c5a612daa4eaaeee088f223"}},"timestamp":"2026-06-24 11:36:51.670"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297411530","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297411530","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:51.672"} +{"level":"info","message":"PUT /api/v1/certificates/cert-api-stud-api-cour-1782297411530/revoke","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:51.685"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:51.715"} +{"level":"info","message":"Simulated mint for token 384990","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:51.885"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297411729 -> token 384990","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297411729","environment":"test","service":"web3-student-lab-backend","tokenId":"384990","txHash":"0xa49b770fd7323f9fc99244b30f6f62cb031d15080310f91eb32f635b8f7693f1"}},"timestamp":"2026-06-24 11:36:51.889"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297411729","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297411729","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:51.889"} +{"level":"info","message":"PUT /api/v1/certificates/cert-api-stud-api-cour-1782297411729/revoke","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:51.894"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:51.901"} +{"level":"info","message":"Simulated mint for token 509459","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:52.028"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297411906 -> token 509459","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297411906","environment":"test","service":"web3-student-lab-backend","tokenId":"509459","txHash":"0xa8b6347910bea279253bc003799a29611ddb53c0b17e9c04c6c74415b35e8fc9"}},"timestamp":"2026-06-24 11:36:52.039"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297411906","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297411906","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:52.040"} +{"level":"info","message":"POST /api/v1/certificates/cert-api-stud-api-cour-1782297411906/reissue","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:52.045"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:52.054"} +{"level":"info","message":"Simulated mint for token 722904","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:52.183"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297412060 -> token 722904","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297412060","environment":"test","service":"web3-student-lab-backend","tokenId":"722904","txHash":"0x07d0c7e58c768e5ee3edf549e857a0a905ad1efd5ecf2c8dcc961504f2d94469"}},"timestamp":"2026-06-24 11:36:52.187"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297412060","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297412060","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:52.187"} +{"level":"info","message":"POST /api/v1/certificates/cert-api-stud-api-cour-1782297412060/reissue","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:52.191"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:52.204"} +{"level":"info","message":"Simulated mint for token 411472","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:52.330"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297412210 -> token 411472","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297412210","environment":"test","service":"web3-student-lab-backend","tokenId":"411472","txHash":"0xf5272521a5ae41d38f99cc53ad2f76c3b7ab692550688a0364f96e9cc3c21a79"}},"timestamp":"2026-06-24 11:36:52.342"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297412210","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297412210","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:52.343"} +{"level":"info","message":"POST /api/v1/certificates/cert-api-stud-api-cour-1782297412210/reissue","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:52.349"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:52.355"} +{"level":"info","message":"Simulated mint for token 67540","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:52.487"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297412361 -> token 67540","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297412361","environment":"test","service":"web3-student-lab-backend","tokenId":"67540","txHash":"0xe09300062a90f64bb0dd65d3a305c8b518a97355ecac5687046673b61c9d9c26"}},"timestamp":"2026-06-24 11:36:52.502"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297412361","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297412361","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:52.504"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:52.517"} +{"level":"info","message":"Simulated mint for token 115918","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:52.652"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297412525 -> token 115918","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297412525","environment":"test","service":"web3-student-lab-backend","tokenId":"115918","txHash":"0x6fc68ce4001375df7015df55aaa9162abb29511f969ebbb28b92e37e0b6dc0b7"}},"timestamp":"2026-06-24 11:36:52.657"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297412525","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297412525","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:52.659"} +{"level":"info","message":"GET /api/v1/certificates/analytics","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:52.666"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:52.738"} +{"level":"info","message":"Simulated mint for token 403896","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:52.904"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297412758 -> token 403896","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297412758","environment":"test","service":"web3-student-lab-backend","tokenId":"403896","txHash":"0x4bad08cdc6aab79f6766e2714e82905cff42a68819d920541988b3430d87a449"}},"timestamp":"2026-06-24 11:36:52.917"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297412758","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297412758","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:52.920"} +{"level":"info","message":"GET /api/v1/certificates/cert-api-stud-api-cour-1782297412758/image","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:52.934"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:52.967"} +{"level":"info","message":"Simulated mint for token 330803","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:53.180"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297412992 -> token 330803","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297412992","environment":"test","service":"web3-student-lab-backend","tokenId":"330803","txHash":"0x94791b68b084175004c6d1d5e01a007517f2147d132e99d33d3c8d721cf07cb3"}},"timestamp":"2026-06-24 11:36:53.255"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297412992","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297412992","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:53.257"} +{"level":"info","message":"GET /api/v1/certificates/cert-api-stud-api-cour-1782297412992/qr","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:53.271"} +{"level":"info","message":"GET /api/v1/certificates?limit=10&offset=0","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:53.957"} +{"level":"info","message":"GET /api/v1/certificates?limit=5","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:53.970"} +{"level":"info","message":"GET /api/v1/certificates?limit=200","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:53.982"} +{"level":"info","message":"GET /api/etc/passwd","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:53.988"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:53.997"} +{"level":"info","message":"Simulated mint for token 913530","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:54.205"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297414003 -> token 913530","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297414003","environment":"test","service":"web3-student-lab-backend","tokenId":"913530","txHash":"0xa206c022f343e4d830853bef2e465d1d703773a81d3499bd68cba662eeb34123"}},"timestamp":"2026-06-24 11:36:54.213"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297414003","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297414003","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:54.217"} +{"level":"info","message":"GET /api/v1/certificates/verify/913530","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:54.228"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1000","meta":{"driverAdapterError":{"cause":{"kind":"AuthenticationFailed","originalCode":"28P01","originalMessage":"password authentication failed for user \"dummy\"","user":"dummy"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:54.833"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1000","meta":{"driverAdapterError":{"cause":{"kind":"AuthenticationFailed","originalCode":"28P01","originalMessage":"password authentication failed for user \"dummy\"","user":"dummy"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:54.850"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1000","meta":{"driverAdapterError":{"cause":{"kind":"AuthenticationFailed","originalCode":"28P01","originalMessage":"password authentication failed for user \"dummy\"","user":"dummy"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:54.926"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1000","meta":{"driverAdapterError":{"cause":{"kind":"AuthenticationFailed","originalCode":"28P01","originalMessage":"password authentication failed for user \"dummy\"","user":"dummy"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:54.942"} +{"level":"info","message":"RSA Key rotated. New Key ID: 677ba870-4671-4168-a6a7-b76a14aa3575","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:57.815"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:57.970"} +{"level":"info","message":"RSA Key rotated. New Key ID: 00cab619-0b73-4e39-95c6-2cc9153b2f8d","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:58.981"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:59.115"} +{"level":"info","message":"RSA Key rotated. New Key ID: c89bdede-cb5f-446b-a946-1987fc324c7d","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:59.945"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:00.086"} +{"level":"info","message":"RSA Key rotated. New Key ID: ff28c53c-bd30-4951-8322-d72df1900bb4","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:02.643"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:02.784"} +{"level":"info","message":"RSA Key rotated. New Key ID: 2261462a-8ef8-44a8-9ba3-000052cba671","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:03.974"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:04.190"} +{"level":"info","message":"RSA Key rotated. New Key ID: c1105fd3-49aa-4ce5-8a00-ad4427ac8092","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:05.472"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:05.609"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:18:45)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:37:05.804"} +{"level":"info","message":"Notification created [course_created] Web3 101 — New Course","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:05.805"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:35:45)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:37:05.808"} +{"level":"info","message":"Notification created [learning_opportunity] — Recommended Course","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:05.809"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:47:45)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:37:05.818"} +{"level":"info","message":"Notification created [announcement] — Platform Update","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:05.820"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:60:31)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:37:05.822"} +{"level":"info","message":"Notification created [course_created] — Broadcast","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:05.823"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:66:31)"}},"timestamp":"2026-06-24 11:37:05.824"} +{"level":"info","message":"Notification created [course_updated] — User-specific","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:05.825"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:73:31)"}},"timestamp":"2026-06-24 11:37:05.826"} +{"level":"info","message":"Notification created [course_created] — Other user","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:05.827"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:88:31)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:37:05.831"} +{"level":"info","message":"Notification created [course_created] — A","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:05.832"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:89:31)"}},"timestamp":"2026-06-24 11:37:05.834"} +{"level":"info","message":"Notification created [course_created] — B","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:05.835"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:96:31)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:37:05.837"} +{"level":"info","message":"Notification created [course_created] — First","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:05.838"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:98:31)"}},"timestamp":"2026-06-24 11:37:05.848"} +{"level":"info","message":"Notification created [course_created] — Second","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:05.848"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:108:45)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:37:05.852"} +{"level":"info","message":"Notification created [course_created] — Test","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:05.853"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:129:31)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:37:05.857"} +{"level":"info","message":"Notification created [course_created] — A","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:05.857"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:130:31)"}},"timestamp":"2026-06-24 11:37:05.858"} +{"level":"info","message":"Notification created [course_created] — B","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:05.859"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:131:31)"}},"timestamp":"2026-06-24 11:37:05.861"} +{"level":"info","message":"Notification created [announcement] — C","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:05.862"} +{"level":"info","message":"GET /api/v1/notifications","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:05.886"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:151:31)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:37:05.899"} +{"level":"info","message":"Notification created [course_created] Web3 101 — New Course","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:05.901"} +{"level":"info","message":"GET /api/v1/notifications?userId=test-user","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:05.913"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:168:45)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:37:05.921"} +{"level":"info","message":"Notification created [course_created] — Read test","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:05.922"} +{"level":"info","message":"PUT /api/v1/notifications/notif-1782297425920-1/read","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:05.929"} +{"level":"info","message":"PUT /api/v1/notifications/bad-id/read","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:05.936"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:187:31)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:37:05.941"} +{"level":"info","message":"Notification created [course_created] — A","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:05.942"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:188:31)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)"}},"timestamp":"2026-06-24 11:37:05.943"} +{"level":"info","message":"Notification created [course_created] — B","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:05.943"} +{"level":"info","message":"PUT /api/v1/notifications/read-all","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:05.952"} +{"level":"info","message":"PUT /api/v1/notifications/read-all","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:05.962"} +{"level":"info","message":"RSA Key rotated. New Key ID: a5747496-8a8f-4935-af2a-772c3182b826","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:07.843"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:07.979"} +{"level":"info","message":"GET /health","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:08.210"} +{"level":"info","message":"GET /health","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:08.222"} +{"level":"info","message":"GET /health","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:08.231"} +{"level":"info","message":"GET /health","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:08.239"} +{"level":"info","message":"GET /non-existent-route","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:08.245"} +{"level":"info","message":"RSA Key rotated. New Key ID: 81649fc1-7d59-49cd-b585-12d6ed667c36","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:09.767"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:09.922"} +{"level":"info","message":"POST /api/v1/contracts/compile","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:10.133"} +{"level":"info","message":"Smart contract compilation completed","metadata":{"metadata":{"compiled":true,"compilerVersion":"0.8.10","durationMs":0.454159,"environment":"test","errorCount":0,"optimization":false,"service":"web3-student-lab-backend","sourceHash":"57d27b75f33e2f1ce11a20d6b9dad629e025993c91437eafce7ef6be749b90b2","target":"solidity","warningCount":0}},"timestamp":"2026-06-24 11:37:10.140"} +{"level":"info","message":"POST /api/v1/contracts/compile","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:10.154"} +{"level":"info","message":"POST /api/v1/contracts/execute","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:10.168"} +{"level":"info","message":"Smart contract execution result","metadata":{"metadata":{"caller":"test-suite","contractAddress":"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef","durationMs":51.295946,"environment":"test","executionId":"cd97d186-b481-4626-b762-f96c28f49738","functionName":"execute","gasUsed":35540,"logCount":3,"service":"web3-student-lab-backend","success":true}},"timestamp":"2026-06-24 11:37:10.223"} +{"level":"info","message":"RSA Key rotated. New Key ID: ca01bf36-4674-4dd7-acdd-21955a579a3b","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:11.784"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:11.934"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:12.128"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:12.138"} +{"level":"info","message":"RSA Key rotated. New Key ID: 31a45b5d-b37d-4715-874e-ee1321704545","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:13.187"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:13.308"} +{"level":"info","message":"POST /api/v1/contracts/compile","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:13.609"} +{"level":"info","message":"Connecting to standalone Redis...","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:13.724"} +{"level":"error","message":"Redis ping failed: Stream isn't writeable and enableOfflineQueue options is false","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Stream isn't writeable and enableOfflineQueue options is false\n at EventEmitter.sendCommand (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Redis.js:376:32)\n at EventEmitter.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/utils/Commander.js:90:25)\n at RedisClient.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:94:40)\n at RedisClient.connect (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:83:18)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/cache-distributed.test.ts:11:23)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusHook (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:980:40)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:804:7)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:37:13.748"} +{"level":"info","message":"Invalidated all blockchain caches","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:13.773"} +{"level":"info","message":"BlockHeaderListener started","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:13.776"} +{"level":"info","message":"BlockHeaderListener stopped","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:13.777"} +{"level":"info","message":"Redis (standalone) connected successfully","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:13.790"} +{"level":"info","message":"Redis (standalone) ready","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:13.800"} +{"level":"info","message":"BlockHeaderListener stopped","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:13.885"} +{"level":"warn","message":"Redis (standalone) connection closed","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:14.407"} +{"level":"info","message":"✅ Environment variables validated successfully","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:14.636"} +{"level":"info","message":"🌍 Environment: development","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:14.637"} +{"level":"info","message":"🔌 Port: 8080","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:14.638"} +{"level":"info","message":"🌐 Stellar Network: testnet","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:14.638"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: DATABASE_URL\nDescription: PostgreSQL connection string for database connectivity\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:14.641"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:14.658"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"short\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:14.667"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"short\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:14.669"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"your-secret-key-change-in-production\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:14.672"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"your-secret-key-change-in-production\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:14.674"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: DATABASE_URL\nDescription: PostgreSQL connection string for database connectivity\nCurrent value: \"invalid-url-format\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:14.677"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: DATABASE_URL\nDescription: PostgreSQL connection string for database connectivity\nCurrent value: \"invalid-url-format\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:14.680"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: STELLAR_ISSUER_SECRET_KEY\nDescription: Stellar secret key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nMissing required environment variable: STELLAR_ISSUER_PUBLIC_KEY\nDescription: Stellar public key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:14.684"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: STELLAR_ISSUER_SECRET_KEY\nDescription: Stellar secret key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nMissing required environment variable: STELLAR_ISSUER_PUBLIC_KEY\nDescription: Stellar public key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:14.687"} +{"level":"info","message":"✅ Environment variables validated successfully","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:14.692"} +{"level":"info","message":"🌍 Environment: production","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:14.694"} +{"level":"info","message":"🔌 Port: 8080","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:14.696"} +{"level":"info","message":"🌐 Stellar Network: testnet","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:14.698"} +{"level":"info","message":"✅ Environment variables validated successfully","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:14.703"} +{"level":"info","message":"🌍 Environment: development","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:14.704"} +{"level":"info","message":"🔌 Port: 8080","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:14.705"} +{"level":"info","message":"🌐 Stellar Network: testnet","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:14.706"} +{"level":"info","message":"✅ Environment variables validated successfully","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:14.713"} +{"level":"info","message":"🌍 Environment: development","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:14.714"} +{"level":"info","message":"🔌 Port: 3000","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:14.716"} +{"level":"info","message":"🌐 Stellar Network: mainnet","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:14.717"} +{"level":"info","message":"Delivered webhook delivery_1 to https://example.com/webhook with status 200","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:15.035"} +{"correlationId":"test-correlation-id-123","level":"info","message":"Test info message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:15.156"} +{"correlationId":"test-correlation-id-123","level":"error","message":"Test error message Test error","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Test error\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/logger.test.ts:96:25)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:37:15.174"} +{"correlationId":"test-correlation-id-123","level":"warn","message":"Test warning message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:15.184"} +{"level":"info","message":"Test message","metadata":{"metadata":{"component":"TestComponent","environment":"test","service":"web3-student-lab-backend","userId":"user-123"}},"timestamp":"2026-06-24 11:37:15.197"} +{"correlationId":"test-correlation-id-123","level":"info","message":"Test message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:15.208"} +{"correlationId":"test-correlation-id-123","level":"info","message":"Test message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","userId":"user-123"}},"timestamp":"2026-06-24 11:37:15.214"} +{"correlationId":"test-correlation-id-123","level":"info","message":"Info message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:15.220"} +{"correlationId":"test-correlation-id-123","level":"warn","message":"Warn message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:15.223"} +{"correlationId":"test-correlation-id-123","level":"error","message":"Error message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:15.225"} +{"correlationId":"be06117c-9c60-4ef6-a160-4f7afed17920","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:37:15.628"} +{"correlationId":"test-correlation-id-123","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent","x-correlation-id":"test-correlation-id-123"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:37:15.636"} +{"correlationId":"test-request-id-123","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent","x-request-id":"test-request-id-123"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:37:15.641"} +{"correlationId":"0decb846-2eb2-4fea-bd15-929c96b1a9fe","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:37:15.647"} +{"correlationId":"1065011a-62e0-4e0d-91e6-bd801b515a15","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:37:15.653"} +{"correlationId":"88cfda64-ee61-41a2-9fb2-76471e7bd54c","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:37:15.659"} +{"correlationId":"94d2a728-3492-4e86-af5f-20cad5d7d7b3","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:37:15.670"} +{"correlationId":"fb15a13d-189b-4044-ac06-9751ae1fc114","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:37:15.675"} +{"correlationId":"d13a8c23-1dbe-4d21-aeaa-db73afefeaaf","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:37:15.681"} +{"correlationId":"d13a8c23-1dbe-4d21-aeaa-db73afefeaaf","level":"info","message":"Request completed","metadata":{"metadata":{"duration":"2ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":200,"url":"/api/test"}},"timestamp":"2026-06-24 11:37:15.683"} +{"correlationId":"0ffcc5b9-10a3-4ff3-82ac-b10f8705d57e","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:37:15.688"} +{"correlationId":"0ffcc5b9-10a3-4ff3-82ac-b10f8705d57e","level":"warn","message":"Request completed","metadata":{"metadata":{"duration":"1ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":404,"url":"/api/test"}},"timestamp":"2026-06-24 11:37:15.689"} +{"correlationId":"f6031a68-cd49-4045-8bf3-7a228c1cd039","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:37:15.691"} +{"correlationId":"f6031a68-cd49-4045-8bf3-7a228c1cd039","level":"error","message":"Request completed","metadata":{"metadata":{"duration":"1ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":500,"url":"/api/test"}},"timestamp":"2026-06-24 11:37:15.693"} +{"correlationId":"0c424bff-d0fe-4bcf-a727-db0d2ea23a8b","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:37:15.697"} +{"correlationId":"0c424bff-d0fe-4bcf-a727-db0d2ea23a8b","level":"info","message":"Request completed","metadata":{"metadata":{"duration":"1ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":200,"url":"/api/test"}},"timestamp":"2026-06-24 11:37:15.699"} +{"correlationId":"e0892a33-5b88-4e16-bd7a-0bc3fba09c02","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"authorization":"[REDACTED]","content-type":"application/json","cookie":"[REDACTED]","user-agent":"test-agent","x-api-key":"[REDACTED]"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:37:15.702"} +{"correlationId":"726e5675-cdaa-4f6e-b555-839be6d99de0","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{"password":"[REDACTED]","token":"[REDACTED]","username":"testuser"},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:37:15.705"} +{"correlationId":"7acf0712-b2f5-4fe9-a7a8-e7e399e90506","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:37:15.712"} +{"correlationId":"46498c27-5ac2-4ec2-be5c-cb96604161b2","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:37:15.715"} +{"correlationId":"46498c27-5ac2-4ec2-be5c-cb96604161b2","level":"info","message":"Request completed","metadata":{"metadata":{"duration":"4ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":200,"url":"/api/test"}},"timestamp":"2026-06-24 11:37:15.719"} +{"level":"info","message":"GET /api/test","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:15.722"} +{"correlationId":"test-correlation-id-123","level":"info","message":"GET /api/test","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:15.725"} +{"level":"info","message":"GET /api/test","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:15.729"} +{"level":"info","message":"GET /api/test","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:15.733"} +{"correlationId":"3d2aa4f7-58b7-4288-9110-70971491f398","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{"email":"test@example.com","password":"[REDACTED]"},"environment":"test","headers":{"authorization":"[REDACTED]","content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"POST","query":{},"service":"web3-student-lab-backend","url":"/api/users","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:37:15.737"} +{"correlationId":"3d2aa4f7-58b7-4288-9110-70971491f398","level":"info","message":"Request completed","metadata":{"metadata":{"duration":"1ms","environment":"test","method":"POST","service":"web3-student-lab-backend","statusCode":201,"url":"/api/users"}},"timestamp":"2026-06-24 11:37:15.738"} +{"correlationId":"f0e6cf64-74c8-4fdc-825f-6d7182167c7e","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:37:15.741"} +{"correlationId":"f0e6cf64-74c8-4fdc-825f-6d7182167c7e","level":"warn","message":"Request completed","metadata":{"metadata":{"duration":"1ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":404,"url":"/api/test"}},"timestamp":"2026-06-24 11:37:15.742"} +{"correlationId":"614b98ac-52b5-4069-8ee6-08205e275603","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:37:15.747"} +{"correlationId":"614b98ac-52b5-4069-8ee6-08205e275603","level":"error","message":"Request completed","metadata":{"metadata":{"duration":"2ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":500,"url":"/api/test"}},"timestamp":"2026-06-24 11:37:15.748"} +{"level":"info","message":"Connecting to standalone Redis...","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:15.940"} +{"level":"error","message":"Redis ping failed: Stream isn't writeable and enableOfflineQueue options is false","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Stream isn't writeable and enableOfflineQueue options is false\n at EventEmitter.sendCommand (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Redis.js:376:32)\n at EventEmitter.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/utils/Commander.js:90:25)\n at RedisClient.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:94:40)\n at RedisClient.connect (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:83:18)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/cache.test.ts:7:23)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusHook (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:980:40)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:804:7)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:37:15.960"} +{"level":"warn","message":"Error during Redis disconnect: Stream isn't writeable and enableOfflineQueue options is false","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Stream isn't writeable and enableOfflineQueue options is false\n at EventEmitter.sendCommand (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Redis.js:376:32)\n at EventEmitter.quit (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/utils/Commander.js:90:25)\n at RedisClient.disconnect (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:123:27)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/cache.test.ts:11:23)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusHook (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:980:40)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:895:7)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:37:15.979"} +{"level":"info","message":"Pinned decentralized asset project/project-1/example -> bafyd37873b9cdea335789ab00f55e95233b9090e32bb1162154b65bc6c2","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:16.135"} +{"level":"info","message":"Unpinned stale decentralized asset bafy123","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:16.139"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:16.223"} +{"level":"info","message":"Smart contract compilation completed","metadata":{"metadata":{"compiled":true,"compilerVersion":"0.8.10","durationMs":0.188843,"environment":"test","errorCount":0,"optimization":false,"service":"web3-student-lab-backend","sourceHash":"1d7028b29df88b09f9297265b8f8c52870c5950670d50fc9c71b99fb63f8c9f3","target":"solidity","warningCount":0}},"timestamp":"2026-06-24 11:37:16.229"} +{"level":"info","message":"Smart contract compilation completed","metadata":{"metadata":{"compiled":false,"compilerVersion":"0.8.10","durationMs":0.14199,"environment":"test","errorCount":1,"optimization":false,"service":"web3-student-lab-backend","sourceHash":"a25af2a7b44af159360737771d82102721af99a7e77e37879498aeab7e5b4260","target":"solidity","warningCount":0}},"timestamp":"2026-06-24 11:37:16.235"} +{"level":"info","message":"Smart contract execution result","metadata":{"metadata":{"caller":"tester","contractAddress":"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef","durationMs":50.577121,"environment":"test","executionId":"4644f919-c505-4be5-8a0a-61d84d821926","functionName":"execute","gasUsed":141655,"logCount":3,"service":"web3-student-lab-backend","success":true}},"timestamp":"2026-06-24 11:37:16.290"} +{"level":"info","message":"Queued webhook delivery a11397bd-1283-4de1-b9b3-56b6c4f3e3bf for https://example.com/webhook","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:16.583"} +{"level":"warn","message":"Failed to load .env file, using environment variables from system.","metadata":{"metadata":{"environment":"development","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:16.974"} +{"level":"warn","message":"DB health alerts","metadata":{"metadata":{"alerts":["Warning: DB connection utilization is 90% of configured pool max (10)"],"environment":"test","latencyMs":0,"poolUsage":{"active":9,"idle":1,"total":10,"utilizationPct":90},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:17.064"} +{"level":"info","message":"✅ Environment variables validated successfully","metadata":{"metadata":{"environment":"development","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:16.975"} +{"level":"info","message":"🌍 Environment: development","metadata":{"metadata":{"environment":"development","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:16.976"} +{"level":"info","message":"🔌 Port: 8080","metadata":{"metadata":{"environment":"development","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:16.977"} +{"level":"info","message":"🌐 Stellar Network: testnet","metadata":{"metadata":{"environment":"development","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:16.978"} +{"level":"error","message":"DB health check failed","metadata":{"metadata":{"environment":"test","error":"database unavailable","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:17.068"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1000","meta":{"driverAdapterError":{"cause":{"kind":"AuthenticationFailed","originalCode":"28P01","originalMessage":"password authentication failed for user \"dummy\"","user":"dummy"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:40:56.002"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1000","meta":{"driverAdapterError":{"cause":{"kind":"AuthenticationFailed","originalCode":"28P01","originalMessage":"password authentication failed for user \"dummy\"","user":"dummy"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:40:56.112"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1000","meta":{"driverAdapterError":{"cause":{"kind":"AuthenticationFailed","originalCode":"28P01","originalMessage":"password authentication failed for user \"dummy\"","user":"dummy"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:40:56.162"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1000","meta":{"driverAdapterError":{"cause":{"kind":"AuthenticationFailed","originalCode":"28P01","originalMessage":"password authentication failed for user \"dummy\"","user":"dummy"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:40:56.218"} +{"level":"info","message":"RSA Key rotated. New Key ID: 6bfa88d4-f5d2-41ac-899e-b395cd7cbd62","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:00.825"} +{"level":"info","message":"RSA Key rotated. New Key ID: f51fa5e4-e72d-4955-aa1a-2aa8aa8566fa","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:00.340"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:02.010"} +{"level":"info","message":"RSA Key rotated. New Key ID: 17c48506-3c86-4dcf-8a05-ee51fba8a901","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:01.193"} +{"level":"info","message":"RSA Key rotated. New Key ID: 48dad144-d8ea-433a-a9c0-c4539e6ceb07","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:01.998"} +{"level":"info","message":"RSA Key rotated. New Key ID: 4ce6d86e-fbf7-49ef-9474-464d9a23e6f6","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:01.203"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:02.296"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:02.154"} +{"level":"info","message":"POST /api/v1/students","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:04.090"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:05.027"} +{"level":"info","message":"GET /api/v1/students","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:05.251"} +{"level":"info","message":"POST /api/v1/students","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:05.293"} +{"level":"info","message":"PUT /api/v1/students/undefined","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:05.368"} +{"level":"info","message":"Simulated mint for token 611769","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:05.687"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297665127 -> token 611769","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297665127","environment":"test","service":"web3-student-lab-backend","tokenId":"611769","txHash":"0x13cb3f18bb683ef39e53eb12c512bd81670581946e9e4bf1a656ab184f66858b"}},"timestamp":"2026-06-24 11:41:05.720"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297665127","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297665127","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:05.728"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:05.775"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:05.903"} +{"level":"info","message":"RSA Key rotated. New Key ID: 9510148d-08e5-4326-abf0-62b3753c4f03","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:02.273"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:05.934"} +{"level":"error","message":"Mint certificate error: Student with ID non-existent-student not found","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:05.951"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:05.964"} +{"level":"error","message":"Mint certificate error: Course with ID non-existent-course not found","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:05.980"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:06.006"} +{"level":"info","message":"POST /api/v1/students","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:06.014"} +{"level":"info","message":"DELETE /api/v1/students/undefined","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:06.034"} +{"level":"info","message":"GET /api/v1/students/undefined","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:06.079"} +{"level":"info","message":"Simulated mint for token 429552","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:06.208"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297666018 -> token 429552","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297666018","environment":"test","service":"web3-student-lab-backend","tokenId":"429552","txHash":"0xc3e9210d46668a0baebdb2825bacbadd664a4ccfe01b85948d46c54776af2fd6"}},"timestamp":"2026-06-24 11:41:06.215"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297666018","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297666018","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:06.217"} +{"level":"info","message":"GET /api/v1/certificates/verify/429552","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:06.241"} +{"level":"info","message":"GET /api/v1/certificates/verify/nonexistenttoken123","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:06.324"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:06.357"} +{"level":"info","message":"Simulated mint for token 799407","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:06.549"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297666365 -> token 799407","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297666365","environment":"test","service":"web3-student-lab-backend","tokenId":"799407","txHash":"0x25125d15f2328be5c4b2762a2d6115840a7fe38ac1006daf2c00d01fdcb54fdf"}},"timestamp":"2026-06-24 11:41:06.556"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297666365","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297666365","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:06.558"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:06.574"} +{"level":"info","message":"Simulated mint for token batch-token-2","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:06.752"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297666589 -> token batch-token-2","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297666589","environment":"test","service":"web3-student-lab-backend","tokenId":"batch-token-2","txHash":"0xbe70c79d8cb2d2b968a38e63b5d65fb8f0a0e7a854aa18775a42ebf5b6198c6b"}},"timestamp":"2026-06-24 11:41:06.762"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297666589","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297666589","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:06.763"} +{"level":"info","message":"POST /api/v1/certificates/verify/batch","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:06.778"} +{"level":"info","message":"Connecting to standalone Redis...","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:06.647"} +{"level":"error","message":"Redis ping failed: Stream isn't writeable and enableOfflineQueue options is false","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Stream isn't writeable and enableOfflineQueue options is false\n at EventEmitter.sendCommand (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Redis.js:376:32)\n at EventEmitter.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/utils/Commander.js:90:25)\n at RedisClient.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:94:40)\n at RedisClient.connect (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:83:18)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/cache-distributed.test.ts:11:23)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusHook (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:980:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:804:7)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 11:41:06.718"} +{"level":"info","message":"Invalidated all blockchain caches","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:06.763"} +{"level":"info","message":"BlockHeaderListener started","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:06.783"} +{"level":"info","message":"BlockHeaderListener stopped","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:06.788"} +{"level":"info","message":"Redis (standalone) connected successfully","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:06.810"} +{"level":"info","message":"Redis (standalone) ready","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:06.825"} +{"level":"info","message":"POST /api/v1/certificates/verify/batch","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:06.833"} +{"level":"info","message":"POST /api/v1/certificates/verify/batch","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:06.848"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:06.863"} +{"level":"info","message":"BlockHeaderListener stopped","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:06.894"} +{"level":"info","message":"Simulated mint for token 266720","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:07.041"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297666876 -> token 266720","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297666876","environment":"test","service":"web3-student-lab-backend","tokenId":"266720","txHash":"0xde2ad37cd116cf0a3cefa5ab7524eeaa8a86162a080da09d8727804fd190e725"}},"timestamp":"2026-06-24 11:41:07.055"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297666876","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297666876","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:07.057"} +{"level":"info","message":"GET /api/v1/certificates/266720/metadata","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:07.072"} +{"level":"info","message":"GET /api/v1/certificates/nonexistent/metadata","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:07.098"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:07.112"} +{"level":"info","message":"Simulated mint for token 463858","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:07.278"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297667122 -> token 463858","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297667122","environment":"test","service":"web3-student-lab-backend","tokenId":"463858","txHash":"0xe791b4defb99d1a38632053ceb5c5c24f96d017b197071910d40a21caebb8d40"}},"timestamp":"2026-06-24 11:41:07.284"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297667122","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297667122","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:07.286"} +{"level":"info","message":"GET /api/v1/certificates/463858/metadata","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:07.294"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:07.329"} +{"level":"info","message":"Simulated mint for token 220987","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:07.518"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297667340 -> token 220987","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297667340","environment":"test","service":"web3-student-lab-backend","tokenId":"220987","txHash":"0x53f1f48c8429b77a7e99c16d4807d442e4912219f34afc218f1dae8b7ea3696b"}},"timestamp":"2026-06-24 11:41:07.527"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297667340","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297667340","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:07.529"} +{"level":"info","message":"GET /api/v1/certificates/cert-api-stud-api-cour-1782297667340","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:07.538"} +{"level":"warn","message":"Redis (standalone) connection closed","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:07.553"} +{"level":"info","message":"GET /api/v1/certificates/nonexistent-id","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:07.570"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:02.506"} +{"level":"info","message":"RSA Key rotated. New Key ID: 7adb1fce-e815-4cd7-bf89-ab22e140c278","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:06.799"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:07.584"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:07.111"} +{"level":"info","message":"POST /api/v1/contracts/compile","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:07.625"} +{"level":"info","message":"Smart contract compilation completed","metadata":{"metadata":{"compiled":true,"compilerVersion":"0.8.10","durationMs":1.131599,"environment":"test","errorCount":0,"optimization":false,"service":"web3-student-lab-backend","sourceHash":"57d27b75f33e2f1ce11a20d6b9dad629e025993c91437eafce7ef6be749b90b2","target":"solidity","warningCount":0}},"timestamp":"2026-06-24 11:41:07.640"} +{"level":"info","message":"POST /api/v1/contracts/compile","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:07.680"} +{"level":"info","message":"Simulated mint for token 444219","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:07.747"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297667594 -> token 444219","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297667594","environment":"test","service":"web3-student-lab-backend","tokenId":"444219","txHash":"0xf317eb1b527c6a0edf8267dea82a42fa4a52264afe81c6c2f3fb504869025db6"}},"timestamp":"2026-06-24 11:41:07.754"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297667594","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297667594","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:07.757"} +{"level":"info","message":"GET /api/v1/certificates/student/api-student-123","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:07.765"} +{"level":"info","message":"POST /api/v1/contracts/execute","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:07.801"} +{"level":"info","message":"GET /api/v1/certificates/student/nonexistent-student","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:07.809"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:07.828"} +{"level":"info","message":"Smart contract execution result","metadata":{"metadata":{"caller":"test-suite","contractAddress":"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef","durationMs":51.136666,"environment":"test","executionId":"5135d9d8-41a1-4d3c-91db-aa586dea0343","functionName":"execute","gasUsed":33952,"logCount":3,"service":"web3-student-lab-backend","success":true}},"timestamp":"2026-06-24 11:41:07.857"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:02.886"} +{"level":"info","message":"RSA Key rotated. New Key ID: b7d71230-82e2-4724-a156-5830a8e8ee9b","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:07.173"} +{"level":"info","message":"Simulated mint for token 498029","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:07.979"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297667839 -> token 498029","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297667839","environment":"test","service":"web3-student-lab-backend","tokenId":"498029","txHash":"0x95f3c14d9d19587677d6f27aef82323eba3e1b11a13b1ac3d7230598fc272412"}},"timestamp":"2026-06-24 11:41:07.987"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297667839","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297667839","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:07.989"} +{"level":"info","message":"PUT /api/v1/certificates/cert-api-stud-api-cour-1782297667839/revoke","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.007"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:07.509"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.011"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.030"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.060"} +{"level":"info","message":"Simulated mint for token 120486","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.194"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297668049 -> token 120486","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297668049","environment":"test","service":"web3-student-lab-backend","tokenId":"120486","txHash":"0x84959e7591ef2eb642fb8f7282fea523137401b8fa66f82d0bca4e9e256d0884"}},"timestamp":"2026-06-24 11:41:08.203"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297668049","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297668049","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.210"} +{"level":"info","message":"PUT /api/v1/certificates/cert-api-stud-api-cour-1782297668049/revoke","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.221"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.247"} +{"correlationId":"6e22bae8-3a4a-42c5-b46e-bc5605111b53","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:41:08.069"} +{"correlationId":"test-correlation-id-123","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent","x-correlation-id":"test-correlation-id-123"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:41:08.076"} +{"correlationId":"test-request-id-123","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent","x-request-id":"test-request-id-123"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:41:08.086"} +{"correlationId":"0acd191f-2f2b-449d-9960-07cfff01f532","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:41:08.122"} +{"correlationId":"ca7574d0-b004-4e8d-9a3e-e5b05b321d04","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:41:08.127"} +{"correlationId":"bbc23788-cb27-4051-b0b4-9db1ddd5da72","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:41:08.138"} +{"correlationId":"efdffaa3-e50e-4994-a096-233cf1e05c3e","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:41:08.143"} +{"correlationId":"e933480b-775c-4a6c-8777-b2c36e9f1edc","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:41:08.161"} +{"correlationId":"813c3d49-2b84-4e4f-b478-9c70470a602c","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:41:08.166"} +{"correlationId":"813c3d49-2b84-4e4f-b478-9c70470a602c","level":"info","message":"Request completed","metadata":{"metadata":{"duration":"3ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":200,"url":"/api/test"}},"timestamp":"2026-06-24 11:41:08.170"} +{"correlationId":"c139438b-d724-49c1-9e0d-5492d51bce8c","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:41:08.186"} +{"correlationId":"c139438b-d724-49c1-9e0d-5492d51bce8c","level":"warn","message":"Request completed","metadata":{"metadata":{"duration":"3ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":404,"url":"/api/test"}},"timestamp":"2026-06-24 11:41:08.189"} +{"correlationId":"dc1f73e5-0d9d-4964-a76d-e92e808b1fd3","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:41:08.205"} +{"correlationId":"dc1f73e5-0d9d-4964-a76d-e92e808b1fd3","level":"error","message":"Request completed","metadata":{"metadata":{"duration":"2ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":500,"url":"/api/test"}},"timestamp":"2026-06-24 11:41:08.208"} +{"correlationId":"053b22a5-2a6e-4a8c-a71c-ff3d05a727a0","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:41:08.220"} +{"correlationId":"053b22a5-2a6e-4a8c-a71c-ff3d05a727a0","level":"info","message":"Request completed","metadata":{"metadata":{"duration":"3ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":200,"url":"/api/test"}},"timestamp":"2026-06-24 11:41:08.225"} +{"correlationId":"fb4ee001-f9ab-4202-b6c5-3c82a7294007","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"authorization":"[REDACTED]","content-type":"application/json","cookie":"[REDACTED]","user-agent":"test-agent","x-api-key":"[REDACTED]"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:41:08.231"} +{"correlationId":"6bd55aad-795f-44e7-8758-0b8da2ec39f4","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{"password":"[REDACTED]","token":"[REDACTED]","username":"testuser"},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:41:08.237"} +{"correlationId":"2ec4a9bd-e4cc-4e04-b425-cf4770ddd458","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:41:08.243"} +{"correlationId":"43156796-592b-4bc3-b5c8-19c8243fc945","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:41:08.250"} +{"correlationId":"43156796-592b-4bc3-b5c8-19c8243fc945","level":"info","message":"Request completed","metadata":{"metadata":{"duration":"12ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":200,"url":"/api/test"}},"timestamp":"2026-06-24 11:41:08.262"} +{"level":"info","message":"GET /api/test","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.271"} +{"correlationId":"test-correlation-id-123","level":"info","message":"GET /api/test","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.276"} +{"level":"info","message":"GET /api/test","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.282"} +{"level":"info","message":"GET /api/test","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.326"} +{"correlationId":"1792cf2e-43be-4be2-b222-db35e1bcd2f9","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{"email":"test@example.com","password":"[REDACTED]"},"environment":"test","headers":{"authorization":"[REDACTED]","content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"POST","query":{},"service":"web3-student-lab-backend","url":"/api/users","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:41:08.333"} +{"correlationId":"1792cf2e-43be-4be2-b222-db35e1bcd2f9","level":"info","message":"Request completed","metadata":{"metadata":{"duration":"12ms","environment":"test","method":"POST","service":"web3-student-lab-backend","statusCode":201,"url":"/api/users"}},"timestamp":"2026-06-24 11:41:08.344"} +{"correlationId":"baf4abdc-8485-4647-a641-5b5b08a87d99","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:41:08.370"} +{"correlationId":"baf4abdc-8485-4647-a641-5b5b08a87d99","level":"warn","message":"Request completed","metadata":{"metadata":{"duration":"24ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":404,"url":"/api/test"}},"timestamp":"2026-06-24 11:41:08.373"} +{"correlationId":"5be7a4fc-ce3c-4a27-89b6-f51f8ef0287e","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:41:08.377"} +{"correlationId":"5be7a4fc-ce3c-4a27-89b6-f51f8ef0287e","level":"error","message":"Request completed","metadata":{"metadata":{"duration":"3ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":500,"url":"/api/test"}},"timestamp":"2026-06-24 11:41:08.381"} +{"level":"info","message":"Simulated mint for token 710343","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.444"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297668257 -> token 710343","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297668257","environment":"test","service":"web3-student-lab-backend","tokenId":"710343","txHash":"0x99c513659d9c9e7ebd700042380938ef974a617797e2a3757cd38da67a35185f"}},"timestamp":"2026-06-24 11:41:08.450"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297668257","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297668257","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.452"} +{"level":"info","message":"PUT /api/v1/certificates/cert-api-stud-api-cour-1782297668257/revoke","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.460"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.480"} +{"level":"info","message":"Simulated mint for token 209434","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.635"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297668492 -> token 209434","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297668492","environment":"test","service":"web3-student-lab-backend","tokenId":"209434","txHash":"0xf623b92aa0463fc31f3a791c1bb6ebb08cd4262874bcdd3bd9acdf3b0ccb7ed0"}},"timestamp":"2026-06-24 11:41:08.641"} +{"level":"info","message":"RSA Key rotated. New Key ID: cf349b60-a875-4665-b98b-fb29da379b7c","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:07.666"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297668492","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297668492","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.643"} +{"level":"info","message":"POST /api/v1/certificates/cert-api-stud-api-cour-1782297668492/reissue","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.652"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.665"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.048"} +{"level":"info","message":"GET /health","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.662"} +{"correlationId":"test-correlation-id-123","level":"info","message":"Test info message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.487"} +{"correlationId":"test-correlation-id-123","level":"error","message":"Test error message Test error","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Test error\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/logger.test.ts:96:25)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 11:41:08.541"} +{"correlationId":"test-correlation-id-123","level":"warn","message":"Test warning message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.545"} +{"level":"info","message":"Test message","metadata":{"metadata":{"component":"TestComponent","environment":"test","service":"web3-student-lab-backend","userId":"user-123"}},"timestamp":"2026-06-24 11:41:08.565"} +{"correlationId":"test-correlation-id-123","level":"info","message":"Test message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.597"} +{"correlationId":"test-correlation-id-123","level":"info","message":"Test message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","userId":"user-123"}},"timestamp":"2026-06-24 11:41:08.603"} +{"correlationId":"test-correlation-id-123","level":"info","message":"Info message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.609"} +{"correlationId":"test-correlation-id-123","level":"warn","message":"Warn message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.611"} +{"correlationId":"test-correlation-id-123","level":"error","message":"Error message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.615"} +{"level":"info","message":"GET /health","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.718"} +{"level":"info","message":"Simulated mint for token 393128","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.817"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297668675 -> token 393128","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297668675","environment":"test","service":"web3-student-lab-backend","tokenId":"393128","txHash":"0xdc29247814adedabb05a4fccd2a90d00e59fcf4e3496925863ab3423ead38da6"}},"timestamp":"2026-06-24 11:41:08.837"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297668675","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297668675","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.839"} +{"level":"info","message":"GET /health","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.874"} +{"level":"info","message":"POST /api/v1/certificates/cert-api-stud-api-cour-1782297668675/reissue","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.877"} +{"level":"info","message":"GET /health","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.896"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.907"} +{"level":"info","message":"GET /non-existent-route","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.914"} +{"level":"info","message":"RSA Key rotated. New Key ID: 8ad60ef5-8bc7-4a77-8542-0631585a505c","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:01.907"} +{"level":"info","message":"RSA Key rotated. New Key ID: 09ccabe2-438b-4619-ac79-5b9f0b7f2b4b","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.184"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:03.198"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.529"} +{"level":"info","message":"Simulated mint for token 542489","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:09.116"} +{"level":"info","message":"✅ Environment variables validated successfully","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.875"} +{"level":"info","message":"🌍 Environment: development","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.879"} +{"level":"info","message":"🔌 Port: 8080","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.881"} +{"level":"info","message":"🌐 Stellar Network: testnet","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.884"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: DATABASE_URL\nDescription: PostgreSQL connection string for database connectivity\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.889"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.951"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"short\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.957"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"short\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.961"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"your-secret-key-change-in-production\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.967"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"your-secret-key-change-in-production\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.989"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: DATABASE_URL\nDescription: PostgreSQL connection string for database connectivity\nCurrent value: \"invalid-url-format\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:09.002"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: DATABASE_URL\nDescription: PostgreSQL connection string for database connectivity\nCurrent value: \"invalid-url-format\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:09.007"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: STELLAR_ISSUER_SECRET_KEY\nDescription: Stellar secret key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nMissing required environment variable: STELLAR_ISSUER_PUBLIC_KEY\nDescription: Stellar public key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:09.012"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: STELLAR_ISSUER_SECRET_KEY\nDescription: Stellar secret key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nMissing required environment variable: STELLAR_ISSUER_PUBLIC_KEY\nDescription: Stellar public key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:09.016"} +{"level":"info","message":"✅ Environment variables validated successfully","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:09.022"} +{"level":"info","message":"🌍 Environment: production","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:09.024"} +{"level":"info","message":"🔌 Port: 8080","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:09.027"} +{"level":"info","message":"🌐 Stellar Network: testnet","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:09.029"} +{"level":"info","message":"✅ Environment variables validated successfully","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:09.033"} +{"level":"info","message":"🌍 Environment: development","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:09.036"} +{"level":"info","message":"🔌 Port: 8080","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:09.038"} +{"level":"info","message":"🌐 Stellar Network: testnet","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:09.041"} +{"level":"info","message":"✅ Environment variables validated successfully","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:09.045"} +{"level":"info","message":"🌍 Environment: development","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:09.048"} +{"level":"info","message":"🔌 Port: 3000","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:09.050"} +{"level":"info","message":"🌐 Stellar Network: mainnet","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:09.053"} +{"level":"info","message":"POST /api/v1/contracts/compile","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:09.105"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297668928 -> token 542489","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297668928","environment":"test","service":"web3-student-lab-backend","tokenId":"542489","txHash":"0xb7bb35b12e448a1f1b5f55455e7f2f807bcec60f61bb549fac7c68c500428fdc"}},"timestamp":"2026-06-24 11:41:09.124"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297668928","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297668928","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:09.126"} +{"level":"info","message":"POST /api/v1/certificates/cert-api-stud-api-cour-1782297668928/reissue","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:09.135"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:09.148"} +{"level":"info","message":"Connecting to standalone Redis...","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.767"} +{"level":"error","message":"Redis ping failed: Stream isn't writeable and enableOfflineQueue options is false","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Stream isn't writeable and enableOfflineQueue options is false\n at EventEmitter.sendCommand (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Redis.js:376:32)\n at EventEmitter.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/utils/Commander.js:90:25)\n at RedisClient.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:94:40)\n at RedisClient.connect (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:83:18)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/cache.test.ts:7:23)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusHook (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:980:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:804:7)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 11:41:08.800"} +{"level":"warn","message":"Error during Redis disconnect: Stream isn't writeable and enableOfflineQueue options is false","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Stream isn't writeable and enableOfflineQueue options is false\n at EventEmitter.sendCommand (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Redis.js:376:32)\n at EventEmitter.quit (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/utils/Commander.js:90:25)\n at RedisClient.disconnect (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:123:27)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/cache.test.ts:11:23)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusHook (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:980:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:895:7)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 11:41:08.826"} +{"level":"info","message":"Pinned decentralized asset project/project-1/example -> bafyd37873b9cdea335789ab00f55e95233b9090e32bb1162154b65bc6c2","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:09.246"} +{"level":"info","message":"Unpinned stale decentralized asset bafy123","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:09.252"} +{"level":"info","message":"Simulated mint for token 369692","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:09.299"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297669161 -> token 369692","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297669161","environment":"test","service":"web3-student-lab-backend","tokenId":"369692","txHash":"0xfd853856cb9782e6ad8fa51a4e350dbf1b59fe7e9570a6ad1208630373416bb5"}},"timestamp":"2026-06-24 11:41:09.308"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297669161","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297669161","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:09.310"} +{"level":"info","message":"Queued webhook delivery e0053d2c-bb7b-431c-9e73-d3d8c822d4b2 for https://example.com/webhook","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:09.087"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:09.292"} +{"level":"info","message":"Smart contract compilation completed","metadata":{"metadata":{"compiled":true,"compilerVersion":"0.8.10","durationMs":0.287956,"environment":"test","errorCount":0,"optimization":false,"service":"web3-student-lab-backend","sourceHash":"1d7028b29df88b09f9297265b8f8c52870c5950670d50fc9c71b99fb63f8c9f3","target":"solidity","warningCount":0}},"timestamp":"2026-06-24 11:41:09.299"} +{"level":"info","message":"Smart contract compilation completed","metadata":{"metadata":{"compiled":false,"compilerVersion":"0.8.10","durationMs":0.063251,"environment":"test","errorCount":1,"optimization":false,"service":"web3-student-lab-backend","sourceHash":"a25af2a7b44af159360737771d82102721af99a7e77e37879498aeab7e5b4260","target":"solidity","warningCount":0}},"timestamp":"2026-06-24 11:41:09.305"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:09.322"} +{"level":"info","message":"Smart contract execution result","metadata":{"metadata":{"caller":"tester","contractAddress":"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef","durationMs":51.663946,"environment":"test","executionId":"9c2e8ef2-9eb3-4959-88af-e29034468832","functionName":"execute","gasUsed":228470,"logCount":3,"service":"web3-student-lab-backend","success":true}},"timestamp":"2026-06-24 11:41:09.363"} +{"level":"info","message":"Simulated mint for token 826999","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:09.479"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297669336 -> token 826999","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297669336","environment":"test","service":"web3-student-lab-backend","tokenId":"826999","txHash":"0x2ac33b1a7e47eb23fc01cc8f14bfcdcd65d792607738ba78d6d009077314a202"}},"timestamp":"2026-06-24 11:41:09.487"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297669336","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297669336","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:09.489"} +{"level":"info","message":"GET /api/v1/certificates/analytics","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:09.505"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:09.597"} +{"level":"info","message":"Delivered webhook delivery_1 to https://example.com/webhook with status 200","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:09.472"} +{"level":"warn","message":"Failed to load .env file, using environment variables from system.","metadata":{"metadata":{"environment":"development","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:09.666"} +{"level":"info","message":"✅ Environment variables validated successfully","metadata":{"metadata":{"environment":"development","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:09.669"} +{"level":"info","message":"🌍 Environment: development","metadata":{"metadata":{"environment":"development","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:09.671"} +{"level":"info","message":"🔌 Port: 8080","metadata":{"metadata":{"environment":"development","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:09.687"} +{"level":"info","message":"🌐 Stellar Network: testnet","metadata":{"metadata":{"environment":"development","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:09.689"} +{"level":"info","message":"Simulated mint for token 111114","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:09.810"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297669621 -> token 111114","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297669621","environment":"test","service":"web3-student-lab-backend","tokenId":"111114","txHash":"0xa709526a2a4d0d51a60719af14a8c0489430ff400d194344606c4c2593499641"}},"timestamp":"2026-06-24 11:41:09.820"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297669621","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297669621","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:09.821"} +{"level":"info","message":"GET /api/v1/certificates/cert-api-stud-api-cour-1782297669621/image","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:09.831"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:09.866"} +{"level":"warn","message":"DB health alerts","metadata":{"metadata":{"alerts":["Warning: DB connection utilization is 90% of configured pool max (10)"],"environment":"test","latencyMs":0,"poolUsage":{"active":9,"idle":1,"total":10,"utilizationPct":90},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:09.863"} +{"level":"error","message":"DB health check failed","metadata":{"metadata":{"environment":"test","error":"database unavailable","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:09.877"} +{"level":"info","message":"Simulated mint for token 972082","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:10.062"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297669895 -> token 972082","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297669895","environment":"test","service":"web3-student-lab-backend","tokenId":"972082","txHash":"0x0b982644ce48406be45c2ea0813978e256db9b607caf9362a07097f41a84c8c8"}},"timestamp":"2026-06-24 11:41:10.067"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297669895","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297669895","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:10.069"} +{"level":"info","message":"GET /api/v1/certificates/cert-api-stud-api-cour-1782297669895/qr","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:10.075"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:03.527"} +{"level":"info","message":"RSA Key rotated. New Key ID: e3a3852d-1ffc-4de6-bf7a-7b39a429ed7b","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:09.475"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:09.952"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:18:45)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 11:41:10.246"} +{"level":"info","message":"Notification created [course_created] Web3 101 — New Course","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:10.248"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:35:45)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 11:41:10.255"} +{"level":"info","message":"Notification created [learning_opportunity] — Recommended Course","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:10.257"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:47:45)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 11:41:10.262"} +{"level":"info","message":"Notification created [announcement] — Platform Update","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:10.263"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:60:31)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 11:41:10.269"} +{"level":"info","message":"Notification created [course_created] — Broadcast","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:10.272"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:66:31)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)"}},"timestamp":"2026-06-24 11:41:10.274"} +{"level":"info","message":"Notification created [course_updated] — User-specific","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:10.275"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:73:31)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)"}},"timestamp":"2026-06-24 11:41:10.277"} +{"level":"info","message":"Notification created [course_created] — Other user","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:10.278"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:88:31)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 11:41:10.284"} +{"level":"info","message":"Notification created [course_created] — A","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:10.286"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:89:31)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)"}},"timestamp":"2026-06-24 11:41:10.288"} +{"level":"info","message":"Notification created [course_created] — B","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:10.289"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:96:31)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 11:41:10.293"} +{"level":"info","message":"Notification created [course_created] — First","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:10.295"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:98:31)"}},"timestamp":"2026-06-24 11:41:10.310"} +{"level":"info","message":"Notification created [course_created] — Second","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:10.311"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:108:45)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 11:41:10.315"} +{"level":"info","message":"Notification created [course_created] — Test","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:10.317"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:129:31)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 11:41:10.329"} +{"level":"info","message":"Notification created [course_created] — A","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:10.331"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:130:31)"}},"timestamp":"2026-06-24 11:41:10.333"} +{"level":"info","message":"Notification created [course_created] — B","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:10.335"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:131:31)"}},"timestamp":"2026-06-24 11:41:10.336"} +{"level":"info","message":"Notification created [announcement] — C","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:10.338"} +{"level":"info","message":"GET /api/v1/notifications","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:10.375"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:151:31)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 11:41:10.395"} +{"level":"info","message":"Notification created [course_created] Web3 101 — New Course","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:10.397"} +{"level":"info","message":"GET /api/v1/notifications?userId=test-user","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:10.407"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:168:45)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 11:41:10.424"} +{"level":"info","message":"Notification created [course_created] — Read test","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:10.426"} +{"level":"info","message":"PUT /api/v1/notifications/notif-1782297670422-1/read","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:10.471"} +{"level":"info","message":"PUT /api/v1/notifications/bad-id/read","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:10.482"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:187:31)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 11:41:10.490"} +{"level":"info","message":"Notification created [course_created] — A","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:10.491"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:188:31)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)"}},"timestamp":"2026-06-24 11:41:10.493"} +{"level":"info","message":"Notification created [course_created] — B","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:10.494"} +{"level":"info","message":"PUT /api/v1/notifications/read-all","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:10.517"} +{"level":"info","message":"PUT /api/v1/notifications/read-all","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:10.527"} +{"level":"info","message":"GET /api/v1/certificates?limit=10&offset=0","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:10.970"} +{"level":"info","message":"GET /api/v1/certificates?limit=5","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:10.982"} +{"level":"info","message":"GET /api/v1/certificates?limit=200","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:10.996"} +{"level":"info","message":"GET /api/etc/passwd","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:11.002"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:11.008"} +{"level":"info","message":"Simulated mint for token 599603","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:11.205"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297671015 -> token 599603","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297671015","environment":"test","service":"web3-student-lab-backend","tokenId":"599603","txHash":"0xc55a4ec911ef22de76277e91ea6371f762ff00a10572c45b1ca7c263399d29f5"}},"timestamp":"2026-06-24 11:41:11.210"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297671015","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297671015","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:11.211"} +{"level":"info","message":"GET /api/v1/certificates/verify/599603","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:11.215"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1000","meta":{"driverAdapterError":{"cause":{"kind":"AuthenticationFailed","originalCode":"28P01","originalMessage":"password authentication failed for user \"dummy\"","user":"dummy"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:12.967"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1000","meta":{"driverAdapterError":{"cause":{"kind":"AuthenticationFailed","originalCode":"28P01","originalMessage":"password authentication failed for user \"dummy\"","user":"dummy"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:13.047"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1000","meta":{"driverAdapterError":{"cause":{"kind":"AuthenticationFailed","originalCode":"28P01","originalMessage":"password authentication failed for user \"dummy\"","user":"dummy"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:13.105"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1000","meta":{"driverAdapterError":{"cause":{"kind":"AuthenticationFailed","originalCode":"28P01","originalMessage":"password authentication failed for user \"dummy\"","user":"dummy"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:13.149"} +{"level":"info","message":"RSA Key rotated. New Key ID: 2e4fb637-0d11-4c8e-a949-77e2b6855ef0","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:15.800"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:16.877"} +{"level":"info","message":"POST /api/v1/students","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:18.130"} +{"level":"info","message":"RSA Key rotated. New Key ID: f605fb33-ffc2-4d86-907b-6238b9d5e3b5","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:15.861"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:16.900"} +{"level":"info","message":"GET /api/v1/students","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:18.925"} +{"level":"info","message":"POST /api/v1/students","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:18.948"} +{"level":"info","message":"PUT /api/v1/students/undefined","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:19.094"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:19.417"} +{"level":"info","message":"POST /api/v1/students","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:19.685"} +{"level":"info","message":"DELETE /api/v1/students/undefined","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:19.702"} +{"level":"info","message":"GET /api/v1/students/undefined","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:19.743"} +{"level":"info","message":"Simulated mint for token 573120","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:19.999"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297739535 -> token 573120","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297739535","environment":"test","service":"web3-student-lab-backend","tokenId":"573120","txHash":"0xd8a299bf25a33fc897faef2444afd584bebcc136cabdb2e2f43d5919b50fd5a8"}},"timestamp":"2026-06-24 11:42:20.071"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297739535","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297739535","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:20.079"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:20.237"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:20.420"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:20.436"} +{"level":"error","message":"Mint certificate error: Student with ID non-existent-student not found","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:20.444"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:20.460"} +{"level":"error","message":"Mint certificate error: Course with ID non-existent-course not found","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:20.487"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:20.595"} +{"level":"info","message":"RSA Key rotated. New Key ID: dc17446b-7a68-4a2b-b9be-aff43e5132d6","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:17.215"} +{"level":"info","message":"Simulated mint for token 556589","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:20.833"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297740637 -> token 556589","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297740637","environment":"test","service":"web3-student-lab-backend","tokenId":"556589","txHash":"0xbfce06278564081d7e65cd0ff9f34f9f3d9a2c086870b8251e1b55f4cfdf2ae7"}},"timestamp":"2026-06-24 11:42:20.840"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297740637","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297740637","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:20.842"} +{"level":"info","message":"GET /api/v1/certificates/verify/556589","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:20.861"} +{"level":"info","message":"GET /api/v1/certificates/verify/nonexistenttoken123","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:20.947"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:20.978"} +{"level":"info","message":"Simulated mint for token 195350","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:21.148"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297740989 -> token 195350","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297740989","environment":"test","service":"web3-student-lab-backend","tokenId":"195350","txHash":"0x211cc8f5cffcf0eb5eadf824bc4833f8b279f89dfa23eb5acc6a68753b689ae5"}},"timestamp":"2026-06-24 11:42:21.160"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297740989","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297740989","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:21.162"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:21.206"} +{"level":"info","message":"Simulated mint for token batch-token-2","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:21.409"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297741219 -> token batch-token-2","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297741219","environment":"test","service":"web3-student-lab-backend","tokenId":"batch-token-2","txHash":"0x872d3db049882775c4800053a79daa5311af65be86e84c23ab7ed2943bf2fb99"}},"timestamp":"2026-06-24 11:42:21.415"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297741219","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297741219","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:21.418"} +{"level":"info","message":"RSA Key rotated. New Key ID: f327bcc0-547d-4177-969f-bb91e535bbd1","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:18.401"} +{"level":"info","message":"POST /api/v1/certificates/verify/batch","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:21.447"} +{"level":"info","message":"POST /api/v1/certificates/verify/batch","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:21.534"} +{"level":"info","message":"POST /api/v1/certificates/verify/batch","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:21.555"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:21.575"} +{"level":"info","message":"Simulated mint for token 440406","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:21.765"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297741584 -> token 440406","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297741584","environment":"test","service":"web3-student-lab-backend","tokenId":"440406","txHash":"0xbc0a250d0f56a79dcf57ee69ca25ad84154b1fd46c60fd400e5fbf024fbb6a6e"}},"timestamp":"2026-06-24 11:42:21.771"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297741584","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297741584","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:21.778"} +{"level":"info","message":"GET /api/v1/certificates/440406/metadata","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:21.801"} +{"level":"info","message":"GET /api/v1/certificates/nonexistent/metadata","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:21.853"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:21.889"} +{"level":"info","message":"Simulated mint for token 485797","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:22.100"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297741905 -> token 485797","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297741905","environment":"test","service":"web3-student-lab-backend","tokenId":"485797","txHash":"0x3919258e1a313ca99c9058d60b488fcf1afeae06b31573260d72b9e92c8be282"}},"timestamp":"2026-06-24 11:42:22.107"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297741905","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297741905","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:22.109"} +{"level":"info","message":"GET /api/v1/certificates/485797/metadata","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:22.117"} +{"level":"info","message":"RSA Key rotated. New Key ID: a4d29c51-4d2d-4438-89b6-50e270c42eab","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:18.842"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:22.150"} +{"level":"info","message":"Simulated mint for token 557978","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:22.309"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297742160 -> token 557978","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297742160","environment":"test","service":"web3-student-lab-backend","tokenId":"557978","txHash":"0x8703455e8d1a98143b6280123d41f676d252678395810bc7128f61e9ece9dfff"}},"timestamp":"2026-06-24 11:42:22.327"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297742160","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297742160","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:22.329"} +{"level":"info","message":"GET /api/v1/certificates/cert-api-stud-api-cour-1782297742160","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:22.337"} +{"level":"info","message":"GET /api/v1/certificates/nonexistent-id","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:22.363"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:22.375"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:20.632"} +{"level":"info","message":"Connecting to standalone Redis...","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:22.382"} +{"level":"error","message":"Redis ping failed: Stream isn't writeable and enableOfflineQueue options is false","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Stream isn't writeable and enableOfflineQueue options is false\n at EventEmitter.sendCommand (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Redis.js:376:32)\n at EventEmitter.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/utils/Commander.js:90:25)\n at RedisClient.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:94:40)\n at RedisClient.connect (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:83:18)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/cache-distributed.test.ts:11:23)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusHook (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:980:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:804:7)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 11:42:22.418"} +{"level":"info","message":"Invalidated all blockchain caches","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:22.445"} +{"level":"info","message":"BlockHeaderListener started","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:22.468"} +{"level":"info","message":"BlockHeaderListener stopped","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:22.475"} +{"level":"info","message":"Redis (standalone) connected successfully","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:22.530"} +{"level":"info","message":"Simulated mint for token 700167","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:22.558"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297742384 -> token 700167","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297742384","environment":"test","service":"web3-student-lab-backend","tokenId":"700167","txHash":"0x7c4042cf7e1939e94cdf758196e6636e75068be011023ad1eab0a9fd712ef344"}},"timestamp":"2026-06-24 11:42:22.566"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297742384","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297742384","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:22.569"} +{"level":"info","message":"GET /api/v1/certificates/student/api-student-123","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:22.603"} +{"level":"info","message":"BlockHeaderListener stopped","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:22.608"} +{"level":"info","message":"Redis (standalone) ready","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:22.623"} +{"level":"info","message":"GET /api/v1/certificates/student/nonexistent-student","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:22.718"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:22.770"} +{"level":"info","message":"Simulated mint for token 439999","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:22.970"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297742790 -> token 439999","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297742790","environment":"test","service":"web3-student-lab-backend","tokenId":"439999","txHash":"0xfa2680519c13885ecad2aa41a9f4cc14fb0d910c06160ef1be091e9767513157"}},"timestamp":"2026-06-24 11:42:22.977"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297742790","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297742790","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:22.979"} +{"level":"info","message":"PUT /api/v1/certificates/cert-api-stud-api-cour-1782297742790/revoke","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:22.987"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:23.030"} +{"level":"info","message":"Simulated mint for token 541531","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:23.298"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297743094 -> token 541531","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297743094","environment":"test","service":"web3-student-lab-backend","tokenId":"541531","txHash":"0xa24adf601f697b340f7cb03585f5361f454b91e4aa3b1df1b69be9cf38fdc703"}},"timestamp":"2026-06-24 11:42:23.305"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297743094","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297743094","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:23.307"} +{"level":"info","message":"PUT /api/v1/certificates/cert-api-stud-api-cour-1782297743094/revoke","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:23.325"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:23.345"} +{"level":"warn","message":"Redis (standalone) connection closed","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:23.362"} +{"level":"info","message":"Simulated mint for token 36174","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:23.523"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297743357 -> token 36174","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297743357","environment":"test","service":"web3-student-lab-backend","tokenId":"36174","txHash":"0xf10e5aaac3bc51097adec54f1bfe36f2114621f66fe1bda3d94bbf121b88c438"}},"timestamp":"2026-06-24 11:42:23.529"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297743357","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297743357","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:23.530"} +{"level":"info","message":"PUT /api/v1/certificates/cert-api-stud-api-cour-1782297743357/revoke","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:23.538"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:23.549"} +{"level":"info","message":"Simulated mint for token 2698","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:23.691"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297743558 -> token 2698","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297743558","environment":"test","service":"web3-student-lab-backend","tokenId":"2698","txHash":"0xef04cd562a61b80111b8191d4d75a99afbf784c8d9d4b946bf4007e3febd6dfb"}},"timestamp":"2026-06-24 11:42:23.696"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297743558","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297743558","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:23.698"} +{"level":"info","message":"POST /api/v1/certificates/cert-api-stud-api-cour-1782297743558/reissue","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:23.710"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:23.721"} +{"level":"info","message":"RSA Key rotated. New Key ID: 2e5dee68-b804-4acc-957a-0a91e6649c52","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:22.364"} +{"level":"info","message":"RSA Key rotated. New Key ID: 246bfadf-ab61-4661-a80a-1ce7a662021d","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:16.065"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:22.873"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:18:45)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 11:42:23.565"} +{"level":"info","message":"Notification created [course_created] Web3 101 — New Course","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:23.572"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:35:45)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 11:42:23.584"} +{"level":"info","message":"Notification created [learning_opportunity] — Recommended Course","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:23.586"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:47:45)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 11:42:23.592"} +{"level":"info","message":"Notification created [announcement] — Platform Update","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:23.594"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:60:31)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 11:42:23.646"} +{"level":"info","message":"Notification created [course_created] — Broadcast","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:23.648"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:66:31)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)"}},"timestamp":"2026-06-24 11:42:23.651"} +{"level":"info","message":"Notification created [course_updated] — User-specific","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:23.653"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:73:31)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)"}},"timestamp":"2026-06-24 11:42:23.655"} +{"level":"info","message":"Notification created [course_created] — Other user","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:23.657"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:88:31)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 11:42:23.663"} +{"level":"info","message":"Notification created [course_created] — A","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:23.666"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:89:31)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)"}},"timestamp":"2026-06-24 11:42:23.669"} +{"level":"info","message":"Notification created [course_created] — B","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:23.670"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:96:31)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 11:42:23.675"} +{"level":"info","message":"Notification created [course_created] — First","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:23.677"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:98:31)"}},"timestamp":"2026-06-24 11:42:23.690"} +{"level":"info","message":"Notification created [course_created] — Second","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:23.693"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:108:45)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 11:42:23.705"} +{"level":"info","message":"Notification created [course_created] — Test","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:23.707"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:129:31)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 11:42:23.714"} +{"level":"info","message":"Notification created [course_created] — A","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:23.716"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:130:31)"}},"timestamp":"2026-06-24 11:42:23.719"} +{"level":"info","message":"Notification created [course_created] — B","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:23.720"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:131:31)"}},"timestamp":"2026-06-24 11:42:23.722"} +{"level":"info","message":"Notification created [announcement] — C","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:23.724"} +{"level":"info","message":"GET /api/v1/notifications","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:23.742"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:151:31)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 11:42:23.752"} +{"level":"info","message":"Notification created [course_created] Web3 101 — New Course","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:23.754"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:16.875"} +{"level":"info","message":"GET /api/v1/notifications?userId=test-user","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:23.778"} +{"level":"info","message":"RSA Key rotated. New Key ID: 828077d0-32d2-48dc-9006-ef51b638c23b","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:22.908"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:23.286"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:168:45)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 11:42:23.807"} +{"level":"info","message":"Notification created [course_created] — Read test","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:23.810"} +{"level":"info","message":"PUT /api/v1/notifications/notif-1782297743797-1/read","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:23.823"} +{"level":"info","message":"PUT /api/v1/notifications/bad-id/read","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:23.837"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:187:31)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 11:42:23.846"} +{"level":"info","message":"Notification created [course_created] — A","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:23.848"} +{"level":"warn","message":"Failed to publish course_notification to Redis: redis_js_1.pubClient.publish is not a function","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"TypeError: redis_js_1.pubClient.publish is not a function\n at createNotification (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/notifications/NotificationService.ts:73:21)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/notifications.test.ts:188:31)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)"}},"timestamp":"2026-06-24 11:42:23.851"} +{"level":"info","message":"Notification created [course_created] — B","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:23.852"} +{"level":"info","message":"GET /health","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:23.823"} +{"correlationId":"718da914-f44b-4222-8cb1-8bd6e9254420","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:42:23.593"} +{"level":"info","message":"PUT /api/v1/notifications/read-all","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:23.865"} +{"correlationId":"test-correlation-id-123","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent","x-correlation-id":"test-correlation-id-123"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:42:23.599"} +{"correlationId":"test-request-id-123","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent","x-request-id":"test-request-id-123"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:42:23.603"} +{"correlationId":"48f94deb-f476-4292-9af7-e3fbb6dcce9a","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:42:23.607"} +{"correlationId":"27014bf2-a6a2-49f6-9bcf-cd910fccb4b1","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:42:23.611"} +{"correlationId":"dbd715ea-1e77-421b-8649-07590f9d22b8","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:42:23.617"} +{"correlationId":"bc8516d2-9711-47f0-a8d5-707de804fcf1","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:42:23.621"} +{"correlationId":"5dcda878-0aa2-4c49-b164-6222d4c67cf5","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:42:23.625"} +{"correlationId":"56dfa3b6-2a2a-4522-9d00-2c1bb6dde3f9","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:42:23.629"} +{"correlationId":"56dfa3b6-2a2a-4522-9d00-2c1bb6dde3f9","level":"info","message":"Request completed","metadata":{"metadata":{"duration":"3ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":200,"url":"/api/test"}},"timestamp":"2026-06-24 11:42:23.632"} +{"correlationId":"7fd7f996-f851-41f3-9afb-b0e6fa919fa9","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:42:23.637"} +{"correlationId":"7fd7f996-f851-41f3-9afb-b0e6fa919fa9","level":"warn","message":"Request completed","metadata":{"metadata":{"duration":"2ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":404,"url":"/api/test"}},"timestamp":"2026-06-24 11:42:23.639"} +{"correlationId":"1e408580-1435-4ac8-834c-dacd0ba84642","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:42:23.670"} +{"correlationId":"1e408580-1435-4ac8-834c-dacd0ba84642","level":"error","message":"Request completed","metadata":{"metadata":{"duration":"29ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":500,"url":"/api/test"}},"timestamp":"2026-06-24 11:42:23.673"} +{"correlationId":"212ac1a2-40aa-4b92-ba1c-3f36a9154a7e","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:42:23.677"} +{"correlationId":"212ac1a2-40aa-4b92-ba1c-3f36a9154a7e","level":"info","message":"Request completed","metadata":{"metadata":{"duration":"2ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":200,"url":"/api/test"}},"timestamp":"2026-06-24 11:42:23.679"} +{"correlationId":"00782f7b-5aa3-4b08-92d9-d28e39e2ac3b","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"authorization":"[REDACTED]","content-type":"application/json","cookie":"[REDACTED]","user-agent":"test-agent","x-api-key":"[REDACTED]"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:42:23.684"} +{"correlationId":"0dea5da1-3a62-425f-bc54-9a829338a433","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{"password":"[REDACTED]","token":"[REDACTED]","username":"testuser"},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:42:23.703"} +{"correlationId":"9d0388ea-8231-4902-b134-86297f5b28ef","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:42:23.707"} +{"correlationId":"90c4074b-8524-4509-a9a1-afc5bbc76f79","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:42:23.712"} +{"correlationId":"90c4074b-8524-4509-a9a1-afc5bbc76f79","level":"info","message":"Request completed","metadata":{"metadata":{"duration":"11ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":200,"url":"/api/test"}},"timestamp":"2026-06-24 11:42:23.722"} +{"level":"info","message":"GET /api/test","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:23.727"} +{"correlationId":"test-correlation-id-123","level":"info","message":"GET /api/test","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:23.731"} +{"level":"info","message":"GET /api/test","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:23.736"} +{"level":"info","message":"GET /api/test","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:23.740"} +{"correlationId":"bbd88a45-0259-4903-9bfc-dfda653f39e6","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{"email":"test@example.com","password":"[REDACTED]"},"environment":"test","headers":{"authorization":"[REDACTED]","content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"POST","query":{},"service":"web3-student-lab-backend","url":"/api/users","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:42:23.745"} +{"correlationId":"bbd88a45-0259-4903-9bfc-dfda653f39e6","level":"info","message":"Request completed","metadata":{"metadata":{"duration":"3ms","environment":"test","method":"POST","service":"web3-student-lab-backend","statusCode":201,"url":"/api/users"}},"timestamp":"2026-06-24 11:42:23.748"} +{"correlationId":"1d460c78-890e-44e9-9a93-bcc0970543e8","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:42:23.753"} +{"correlationId":"1d460c78-890e-44e9-9a93-bcc0970543e8","level":"warn","message":"Request completed","metadata":{"metadata":{"duration":"4ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":404,"url":"/api/test"}},"timestamp":"2026-06-24 11:42:23.773"} +{"correlationId":"3c091ae1-54de-4f9c-bd87-1edc5403f9d0","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:42:23.780"} +{"correlationId":"3c091ae1-54de-4f9c-bd87-1edc5403f9d0","level":"error","message":"Request completed","metadata":{"metadata":{"duration":"5ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":500,"url":"/api/test"}},"timestamp":"2026-06-24 11:42:23.796"} +{"level":"info","message":"PUT /api/v1/notifications/read-all","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:23.876"} +{"level":"info","message":"Simulated mint for token 244073","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:23.892"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297743736 -> token 244073","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297743736","environment":"test","service":"web3-student-lab-backend","tokenId":"244073","txHash":"0x6a371e2a35e11acd88e2d61f61ab746513742b2a3d4f69780419e28930a77ac3"}},"timestamp":"2026-06-24 11:42:23.900"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297743736","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297743736","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:23.902"} +{"level":"info","message":"POST /api/v1/certificates/cert-api-stud-api-cour-1782297743736/reissue","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:23.912"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:23.927"} +{"level":"info","message":"GET /health","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:23.977"} +{"level":"info","message":"GET /health","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:24.105"} +{"level":"info","message":"Simulated mint for token 925812","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:24.111"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297743938 -> token 925812","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297743938","environment":"test","service":"web3-student-lab-backend","tokenId":"925812","txHash":"0x1bda4bd78dedfd3538fefba929297912cff4e457ed827ae72cee8271bbcaf374"}},"timestamp":"2026-06-24 11:42:24.118"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297743938","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297743938","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:24.120"} +{"level":"info","message":"GET /health","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:24.129"} +{"level":"info","message":"POST /api/v1/certificates/cert-api-stud-api-cour-1782297743938/reissue","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:24.129"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:24.141"} +{"level":"info","message":"GET /non-existent-route","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:24.192"} +{"level":"info","message":"Simulated mint for token 708314","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:24.313"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297744153 -> token 708314","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297744153","environment":"test","service":"web3-student-lab-backend","tokenId":"708314","txHash":"0xb1c23b8fb89871da1bdb4d28c3119c3aaffe51952e4b4677bdc9e9616228d10a"}},"timestamp":"2026-06-24 11:42:24.323"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297744153","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297744153","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:24.325"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:24.333"} +{"level":"info","message":"Simulated mint for token 392152","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:24.538"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297744350 -> token 392152","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297744350","environment":"test","service":"web3-student-lab-backend","tokenId":"392152","txHash":"0x6643d43c13bcdc9edc6afe7027599d2ab4100eb93592d7e94095ca6c60cebcac"}},"timestamp":"2026-06-24 11:42:24.548"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:18.192"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297744350","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297744350","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:24.554"} +{"level":"info","message":"GET /api/v1/certificates/analytics","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:24.563"} +{"level":"info","message":"RSA Key rotated. New Key ID: f7d968f3-49ec-4733-b428-f0697ac612db","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:23.627"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:24.033"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:24.677"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:24.733"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:24.791"} +{"correlationId":"test-correlation-id-123","level":"info","message":"Test info message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:24.775"} +{"correlationId":"test-correlation-id-123","level":"error","message":"Test error message Test error","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Test error\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/logger.test.ts:96:25)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 11:42:24.827"} +{"correlationId":"test-correlation-id-123","level":"warn","message":"Test warning message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:24.833"} +{"level":"info","message":"Test message","metadata":{"metadata":{"component":"TestComponent","environment":"test","service":"web3-student-lab-backend","userId":"user-123"}},"timestamp":"2026-06-24 11:42:24.844"} +{"correlationId":"test-correlation-id-123","level":"info","message":"Test message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:24.854"} +{"correlationId":"test-correlation-id-123","level":"info","message":"Test message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","userId":"user-123"}},"timestamp":"2026-06-24 11:42:24.861"} +{"correlationId":"test-correlation-id-123","level":"info","message":"Info message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:24.878"} +{"correlationId":"test-correlation-id-123","level":"warn","message":"Warn message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:24.881"} +{"correlationId":"test-correlation-id-123","level":"error","message":"Error message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:24.884"} +{"level":"info","message":"Simulated mint for token 149677","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:24.996"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297744776 -> token 149677","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297744776","environment":"test","service":"web3-student-lab-backend","tokenId":"149677","txHash":"0x77c452f1a4212e58281dd7b9da553b8792f1b0597e2517aff559e03626f1240a"}},"timestamp":"2026-06-24 11:42:25.021"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297744776","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297744776","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:25.024"} +{"level":"info","message":"GET /api/v1/certificates/cert-api-stud-api-cour-1782297744776/image","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:25.037"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:25.070"} +{"level":"info","message":"✅ Environment variables validated successfully","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:24.945"} +{"level":"info","message":"🌍 Environment: development","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:24.948"} +{"level":"info","message":"🔌 Port: 8080","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:24.952"} +{"level":"info","message":"🌐 Stellar Network: testnet","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:24.955"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: DATABASE_URL\nDescription: PostgreSQL connection string for database connectivity\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:24.960"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:25.067"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"short\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:25.073"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"short\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:25.079"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"your-secret-key-change-in-production\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:25.087"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"your-secret-key-change-in-production\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:25.095"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: DATABASE_URL\nDescription: PostgreSQL connection string for database connectivity\nCurrent value: \"invalid-url-format\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:25.107"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: DATABASE_URL\nDescription: PostgreSQL connection string for database connectivity\nCurrent value: \"invalid-url-format\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:25.121"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: STELLAR_ISSUER_SECRET_KEY\nDescription: Stellar secret key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nMissing required environment variable: STELLAR_ISSUER_PUBLIC_KEY\nDescription: Stellar public key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:25.130"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: STELLAR_ISSUER_SECRET_KEY\nDescription: Stellar secret key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nMissing required environment variable: STELLAR_ISSUER_PUBLIC_KEY\nDescription: Stellar public key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:25.134"} +{"level":"info","message":"✅ Environment variables validated successfully","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:25.142"} +{"level":"info","message":"🌍 Environment: production","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:25.144"} +{"level":"info","message":"🔌 Port: 8080","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:25.146"} +{"level":"info","message":"🌐 Stellar Network: testnet","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:25.148"} +{"level":"info","message":"✅ Environment variables validated successfully","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:25.152"} +{"level":"info","message":"🌍 Environment: development","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:25.154"} +{"level":"info","message":"🔌 Port: 8080","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:25.156"} +{"level":"info","message":"🌐 Stellar Network: testnet","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:25.158"} +{"level":"info","message":"✅ Environment variables validated successfully","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:25.162"} +{"level":"info","message":"🌍 Environment: development","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:25.164"} +{"level":"info","message":"🔌 Port: 3000","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:25.165"} +{"level":"info","message":"🌐 Stellar Network: mainnet","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:25.168"} +{"level":"info","message":"Simulated mint for token 525046","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:25.252"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297745080 -> token 525046","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297745080","environment":"test","service":"web3-student-lab-backend","tokenId":"525046","txHash":"0xfc6cd21309baf448bea724acfbfe91c3ae1309ca8dcebb294bb1a4885d06a54a"}},"timestamp":"2026-06-24 11:42:25.259"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297745080","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297745080","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:25.262"} +{"level":"info","message":"GET /api/v1/certificates/cert-api-stud-api-cour-1782297745080/qr","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:25.271"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:20.345"} +{"level":"info","message":"RSA Key rotated. New Key ID: 977602a0-c58a-4748-9773-c06e4b458fbe","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:24.301"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:24.697"} +{"level":"info","message":"POST /api/v1/contracts/compile","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:25.481"} +{"level":"info","message":"Delivered webhook delivery_1 to https://example.com/webhook with status 200","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:25.846"} +{"level":"warn","message":"DB health alerts","metadata":{"metadata":{"alerts":["Warning: DB connection utilization is 90% of configured pool max (10)"],"environment":"test","latencyMs":0,"poolUsage":{"active":9,"idle":1,"total":10,"utilizationPct":90},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:26.058"} +{"level":"error","message":"DB health check failed","metadata":{"metadata":{"environment":"test","error":"database unavailable","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:26.069"} +{"level":"info","message":"Connecting to standalone Redis...","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:25.854"} +{"level":"info","message":"Pinned decentralized asset project/project-1/example -> bafyd37873b9cdea335789ab00f55e95233b9090e32bb1162154b65bc6c2","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:26.314"} +{"level":"error","message":"Redis ping failed: Stream isn't writeable and enableOfflineQueue options is false","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Stream isn't writeable and enableOfflineQueue options is false\n at EventEmitter.sendCommand (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Redis.js:376:32)\n at EventEmitter.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/utils/Commander.js:90:25)\n at RedisClient.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:94:40)\n at RedisClient.connect (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:83:18)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/cache.test.ts:7:23)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusHook (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:980:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:804:7)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 11:42:25.945"} +{"level":"warn","message":"Error during Redis disconnect: Stream isn't writeable and enableOfflineQueue options is false","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Stream isn't writeable and enableOfflineQueue options is false\n at EventEmitter.sendCommand (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Redis.js:376:32)\n at EventEmitter.quit (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/utils/Commander.js:90:25)\n at RedisClient.disconnect (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:123:27)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/cache.test.ts:11:23)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusHook (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:980:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:895:7)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 11:42:25.993"} +{"level":"warn","message":"Failed to load .env file, using environment variables from system.","metadata":{"metadata":{"environment":"development","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:26.210"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:26.350"} +{"level":"info","message":"Smart contract compilation completed","metadata":{"metadata":{"compiled":true,"compilerVersion":"0.8.10","durationMs":0.308402,"environment":"test","errorCount":0,"optimization":false,"service":"web3-student-lab-backend","sourceHash":"1d7028b29df88b09f9297265b8f8c52870c5950670d50fc9c71b99fb63f8c9f3","target":"solidity","warningCount":0}},"timestamp":"2026-06-24 11:42:26.360"} +{"level":"info","message":"Smart contract compilation completed","metadata":{"metadata":{"compiled":false,"compilerVersion":"0.8.10","durationMs":0.065438,"environment":"test","errorCount":1,"optimization":false,"service":"web3-student-lab-backend","sourceHash":"a25af2a7b44af159360737771d82102721af99a7e77e37879498aeab7e5b4260","target":"solidity","warningCount":0}},"timestamp":"2026-06-24 11:42:26.371"} +{"level":"info","message":"Queued webhook delivery a435801b-3a7c-491e-bf4d-3601a686192c for https://example.com/webhook","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:26.067"} +{"level":"info","message":"Smart contract execution result","metadata":{"metadata":{"caller":"tester","contractAddress":"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef","durationMs":58.239606,"environment":"test","executionId":"1d189fb6-a83b-46f1-aecd-e73e866aded7","functionName":"execute","gasUsed":430941,"logCount":3,"service":"web3-student-lab-backend","success":true}},"timestamp":"2026-06-24 11:42:26.437"} +{"level":"info","message":"Unpinned stale decentralized asset bafy123","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:26.320"} +{"level":"info","message":"✅ Environment variables validated successfully","metadata":{"metadata":{"environment":"development","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:26.232"} +{"level":"info","message":"🌍 Environment: development","metadata":{"metadata":{"environment":"development","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:26.243"} +{"level":"info","message":"🔌 Port: 8080","metadata":{"metadata":{"environment":"development","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:26.246"} +{"level":"info","message":"🌐 Stellar Network: testnet","metadata":{"metadata":{"environment":"development","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:26.248"} +{"level":"info","message":"GET /api/v1/certificates?limit=10&offset=0","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:27.475"} +{"level":"info","message":"GET /api/v1/certificates?limit=5","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:27.508"} +{"level":"info","message":"GET /api/v1/certificates?limit=200","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:27.544"} +{"level":"info","message":"GET /api/etc/passwd","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:27.552"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:27.569"} +{"level":"info","message":"Simulated mint for token 818710","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:27.728"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297747587 -> token 818710","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297747587","environment":"test","service":"web3-student-lab-backend","tokenId":"818710","txHash":"0x82cca4e52c05d99df8d1248ce05cd0ea95b2c4e0629873fea1c522287473da3d"}},"timestamp":"2026-06-24 11:42:27.735"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297747587","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297747587","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:27.737"} +{"level":"info","message":"GET /api/v1/certificates/verify/818710","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:27.767"} +{"level":"info","message":"RSA Key rotated. New Key ID: 5b70d7d8-3881-4ca3-83ec-b37afd4d9bd2","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:18.508"} +{"level":"info","message":"RSA Key rotated. New Key ID: 7089826a-9a83-4b65-b5f2-6fa8470ef150","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:26.770"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:20.445"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:27.244"} +{"level":"info","message":"POST /api/v1/contracts/compile","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:28.159"} +{"level":"info","message":"Smart contract compilation completed","metadata":{"metadata":{"compiled":true,"compilerVersion":"0.8.10","durationMs":1.190853,"environment":"test","errorCount":0,"optimization":false,"service":"web3-student-lab-backend","sourceHash":"57d27b75f33e2f1ce11a20d6b9dad629e025993c91437eafce7ef6be749b90b2","target":"solidity","warningCount":0}},"timestamp":"2026-06-24 11:42:28.175"} +{"level":"info","message":"POST /api/v1/contracts/compile","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:28.223"} +{"level":"info","message":"POST /api/v1/contracts/execute","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:28.323"} +{"level":"info","message":"Smart contract execution result","metadata":{"metadata":{"caller":"test-suite","contractAddress":"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef","durationMs":51.244993,"environment":"test","executionId":"66f4e85c-3d24-4f31-966b-92bc1c4dd6f8","functionName":"execute","gasUsed":80392,"logCount":3,"service":"web3-student-lab-backend","success":true}},"timestamp":"2026-06-24 11:42:28.380"} +{"level":"info","message":"RSA Key rotated. New Key ID: ff44a636-f337-4cc0-90ef-a189088824a4","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:35.405"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:35.927"} +{"level":"info","message":"POST /api/v1/students","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:36.584"} +{"level":"info","message":"GET /api/v1/students","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:36.803"} +{"level":"info","message":"POST /api/v1/students","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:36.812"} +{"level":"info","message":"PUT /api/v1/students/undefined","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:36.824"} +{"level":"info","message":"POST /api/v1/students","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:37.105"} +{"level":"info","message":"DELETE /api/v1/students/undefined","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:37.114"} +{"level":"info","message":"GET /api/v1/students/undefined","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:37.129"} +{"level":"info","message":"RSA Key rotated. New Key ID: f3f82529-ab2f-4665-a763-5eb28c504de2","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:43:02.270"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:43:02.726"} +{"level":"info","message":"POST /api/v1/students","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:43:03.496"} +{"level":"info","message":"GET /api/v1/students","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:43:03.741"} +{"level":"info","message":"POST /api/v1/students","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:43:03.749"} +{"level":"info","message":"PUT /api/v1/students/undefined","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:43:03.761"} +{"level":"info","message":"POST /api/v1/students","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:43:03.956"} +{"level":"info","message":"DELETE /api/v1/students/undefined","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:43:04.025"} +{"level":"info","message":"GET /api/v1/students/undefined","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:43:04.041"} +{"level":"info","message":"RSA Key rotated. New Key ID: b9830be9-3432-4942-b139-7495dd26c0b6","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:43:52.894"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:43:54.022"} +{"level":"info","message":"POST /api/v1/students","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:43:55.000"} +{"level":"info","message":"Audit Log: CREATE_STUDENT by test-isolation-1782297834918@example.com","metadata":{"metadata":{"action":"CREATE_STUDENT","entity":"Student","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:43:55.305"} +{"level":"info","message":"GET /api/v1/students/cmqry43460000o9ec15atkcvi","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:43:55.309"} +{"level":"info","message":"GET /api/v1/students","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:43:55.398"} +{"level":"info","message":"POST /api/v1/students","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:43:55.410"} +{"level":"info","message":"Audit Log: CREATE_STUDENT by update-isolation-1782297835405@example.com","metadata":{"metadata":{"action":"CREATE_STUDENT","entity":"Student","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:43:55.434"} +{"level":"info","message":"PUT /api/v1/students/cmqry439x0002o9ec7t1w3vem","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:43:55.437"} +{"level":"info","message":"POST /api/v1/students","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:43:55.804"} +{"level":"info","message":"Audit Log: CREATE_STUDENT by delete-isolation-1782297835798@example.com","metadata":{"metadata":{"action":"CREATE_STUDENT","entity":"Student","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:43:55.881"} +{"level":"info","message":"DELETE /api/v1/students/cmqry43kv0004o9ecpyghc1ls","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:43:55.883"} +{"level":"info","message":"GET /api/v1/students/cmqry43kv0004o9ecpyghc1ls","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:43:55.911"} +{"level":"info","message":"RSA Key rotated. New Key ID: 07d0d211-f1de-41dc-bb0a-549d780d4868","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:05.715"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:06.419"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:07.740"} +{"level":"info","message":"Simulated mint for token 660559","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:08.026"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297847780 -> token 660559","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297847780","environment":"test","service":"web3-student-lab-backend","tokenId":"660559","txHash":"0x32cb968a82be3b9a2ad827b49f3d5c21c6581db58ee6b4ad6beecf3f41775150"}},"timestamp":"2026-06-24 11:44:08.047"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297847780","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297847780","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:08.050"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:08.095"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:08.164"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:08.177"} +{"level":"error","message":"Mint certificate error: Student with ID non-existent-student not found","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:08.182"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:08.193"} +{"level":"error","message":"Mint certificate error: Course with ID non-existent-course not found","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:08.201"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:08.211"} +{"level":"info","message":"Simulated mint for token 51555","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:08.361"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297848220 -> token 51555","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297848220","environment":"test","service":"web3-student-lab-backend","tokenId":"51555","txHash":"0x36529dd0da06d55082f3090baffbf933ac6075e250eabad4205d4db37571d8b1"}},"timestamp":"2026-06-24 11:44:08.372"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297848220","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297848220","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:08.373"} +{"level":"info","message":"GET /api/v1/certificates/verify/51555","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:08.380"} +{"level":"info","message":"GET /api/v1/certificates/verify/nonexistenttoken123","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:08.429"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:08.452"} +{"level":"info","message":"Simulated mint for token 991539","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:08.598"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297848463 -> token 991539","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297848463","environment":"test","service":"web3-student-lab-backend","tokenId":"991539","txHash":"0xb7d5983d2c81d439a3c2858c787369d66cb45104987ebd9f94a07290a012aef6"}},"timestamp":"2026-06-24 11:44:08.603"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297848463","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297848463","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:08.604"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:08.611"} +{"level":"info","message":"Simulated mint for token batch-token-2","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:08.748"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297848617 -> token batch-token-2","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297848617","environment":"test","service":"web3-student-lab-backend","tokenId":"batch-token-2","txHash":"0x15f85541a3e500b96fe4682f099327cb9aa24419726ee4fbdad8d8d9a801a328"}},"timestamp":"2026-06-24 11:44:08.752"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297848617","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297848617","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:08.753"} +{"level":"info","message":"POST /api/v1/certificates/verify/batch","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:08.761"} +{"level":"info","message":"POST /api/v1/certificates/verify/batch","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:08.790"} +{"level":"info","message":"POST /api/v1/certificates/verify/batch","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:08.807"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:08.816"} +{"level":"info","message":"Simulated mint for token 394960","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:08.962"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297848825 -> token 394960","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297848825","environment":"test","service":"web3-student-lab-backend","tokenId":"394960","txHash":"0xaeb898614a2000d031c58ea8337ab8759a30660f3337cc715967d0888f723bb4"}},"timestamp":"2026-06-24 11:44:08.974"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297848825","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297848825","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:08.975"} +{"level":"info","message":"GET /api/v1/certificates/394960/metadata","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:08.980"} +{"level":"info","message":"GET /api/v1/certificates/nonexistent/metadata","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:08.999"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:09.013"} +{"level":"info","message":"Simulated mint for token 476124","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:09.170"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297849024 -> token 476124","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297849024","environment":"test","service":"web3-student-lab-backend","tokenId":"476124","txHash":"0xdd544bce46094be4abb3b6af39746747bdd25ec81062d240e2c301fed9886dea"}},"timestamp":"2026-06-24 11:44:09.181"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297849024","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297849024","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:09.182"} +{"level":"info","message":"GET /api/v1/certificates/476124/metadata","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:09.185"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:09.199"} +{"level":"info","message":"Simulated mint for token 336727","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:09.338"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297849208 -> token 336727","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297849208","environment":"test","service":"web3-student-lab-backend","tokenId":"336727","txHash":"0x780bb1fad8ff8f2375ec793657b077637ce6d6a6bed8236d21e95fd8272d5237"}},"timestamp":"2026-06-24 11:44:09.343"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297849208","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297849208","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:09.344"} +{"level":"info","message":"GET /api/v1/certificates/cert-api-stud-api-cour-1782297849208","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:09.348"} +{"level":"info","message":"GET /api/v1/certificates/nonexistent-id","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:09.360"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:09.367"} +{"level":"info","message":"Simulated mint for token 106054","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:09.503"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297849375 -> token 106054","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297849375","environment":"test","service":"web3-student-lab-backend","tokenId":"106054","txHash":"0xfab5ce2ea37cc9fd7549189dea9df02ae1bce049405b0ee814ffc8ad899f2e70"}},"timestamp":"2026-06-24 11:44:09.514"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297849375","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297849375","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:09.515"} +{"level":"info","message":"GET /api/v1/certificates/student/api-student-123","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:09.519"} +{"level":"info","message":"GET /api/v1/certificates/student/nonexistent-student","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:09.546"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:09.563"} +{"level":"info","message":"Simulated mint for token 762841","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:09.705"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297849570 -> token 762841","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297849570","environment":"test","service":"web3-student-lab-backend","tokenId":"762841","txHash":"0xcf6845ba8db7037a7dbcedccebff1e03bec603d4956b44543e1bf080c6221617"}},"timestamp":"2026-06-24 11:44:09.716"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297849570","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297849570","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:09.716"} +{"level":"info","message":"PUT /api/v1/certificates/cert-api-stud-api-cour-1782297849570/revoke","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:09.721"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:09.731"} +{"level":"info","message":"Simulated mint for token 996938","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:09.864"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297849738 -> token 996938","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297849738","environment":"test","service":"web3-student-lab-backend","tokenId":"996938","txHash":"0xd2d133f77e7f9f04607e8e2a8f4fe617c70af633b3967e98becad0a9993f3e67"}},"timestamp":"2026-06-24 11:44:09.869"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297849738","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297849738","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:09.869"} +{"level":"info","message":"PUT /api/v1/certificates/cert-api-stud-api-cour-1782297849738/revoke","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:09.874"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:09.881"} +{"level":"info","message":"Simulated mint for token 137265","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:10.011"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297849888 -> token 137265","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297849888","environment":"test","service":"web3-student-lab-backend","tokenId":"137265","txHash":"0xeb92e6baa3e6e9e0cc74ae8c4d3ea4c1d38b26600e6f74276fdf8566c48f7da2"}},"timestamp":"2026-06-24 11:44:10.022"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297849888","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297849888","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:10.023"} +{"level":"info","message":"PUT /api/v1/certificates/cert-api-stud-api-cour-1782297849888/revoke","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:10.028"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:10.034"} +{"level":"info","message":"Simulated mint for token 795705","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:10.226"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297850041 -> token 795705","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297850041","environment":"test","service":"web3-student-lab-backend","tokenId":"795705","txHash":"0xbfb9eafe2e923a226a47805e314871ef060576f4f92c5aaf36ead382ddf0f993"}},"timestamp":"2026-06-24 11:44:10.236"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297850041","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297850041","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:10.237"} +{"level":"info","message":"POST /api/v1/certificates/cert-api-stud-api-cour-1782297850041/reissue","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:10.243"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:10.251"} +{"level":"info","message":"Simulated mint for token 873064","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:10.402"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297850259 -> token 873064","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297850259","environment":"test","service":"web3-student-lab-backend","tokenId":"873064","txHash":"0x46afef0193202b9b49d95c96f9fbfe55437a1b91656abe4813a688b59dc55f7a"}},"timestamp":"2026-06-24 11:44:10.460"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297850259","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297850259","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:10.461"} +{"level":"info","message":"POST /api/v1/certificates/cert-api-stud-api-cour-1782297850259/reissue","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:10.466"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:10.474"} +{"level":"info","message":"Simulated mint for token 59772","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:10.608"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297850481 -> token 59772","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297850481","environment":"test","service":"web3-student-lab-backend","tokenId":"59772","txHash":"0xda7cb21f61bef55e2b78eee5786d6f53ca50cf1aa9cf751eddec82e819fde6f7"}},"timestamp":"2026-06-24 11:44:10.620"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297850481","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297850481","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:10.621"} +{"level":"info","message":"POST /api/v1/certificates/cert-api-stud-api-cour-1782297850481/reissue","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:10.626"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:10.634"} +{"level":"info","message":"Simulated mint for token 289524","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:10.768"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297850641 -> token 289524","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297850641","environment":"test","service":"web3-student-lab-backend","tokenId":"289524","txHash":"0x91626b029d0e3cae7eb2f9e38d4198d72e5c6b133f158d299a04f00f87573862"}},"timestamp":"2026-06-24 11:44:10.772"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297850641","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297850641","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:10.773"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:10.778"} +{"level":"info","message":"Simulated mint for token 706617","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:10.910"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297850784 -> token 706617","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297850784","environment":"test","service":"web3-student-lab-backend","tokenId":"706617","txHash":"0xf6ad86499949dadad7291216806e3a035ebc5ac554c8674c2ef13b3ee773c6ca"}},"timestamp":"2026-06-24 11:44:10.923"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297850784","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297850784","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:10.923"} +{"level":"info","message":"GET /api/v1/certificates/analytics","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:10.928"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:10.970"} +{"level":"info","message":"Simulated mint for token 493318","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:11.103"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297850979 -> token 493318","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297850979","environment":"test","service":"web3-student-lab-backend","tokenId":"493318","txHash":"0x80744a50538705eee80ec5db3009782482155b2e228f7f3624b260c69bda4a43"}},"timestamp":"2026-06-24 11:44:11.117"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297850979","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297850979","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:11.117"} +{"level":"info","message":"GET /api/v1/certificates/cert-api-stud-api-cour-1782297850979/image","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:11.123"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:11.138"} +{"level":"info","message":"Simulated mint for token 454804","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:11.324"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297851151 -> token 454804","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297851151","environment":"test","service":"web3-student-lab-backend","tokenId":"454804","txHash":"0xe283518828bef8cdca1f6cd8801f4e8c6dc43450e9b2762783f502cb96c49b8d"}},"timestamp":"2026-06-24 11:44:11.331"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297851151","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297851151","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:11.331"} +{"level":"info","message":"GET /api/v1/certificates/cert-api-stud-api-cour-1782297851151/qr","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:11.336"} +{"level":"info","message":"GET /api/v1/certificates?limit=10&offset=0","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:12.152"} +{"level":"info","message":"GET /api/v1/certificates?limit=5","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:12.167"} +{"level":"info","message":"GET /api/v1/certificates?limit=200","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:12.183"} +{"level":"info","message":"GET /api/etc/passwd","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:12.189"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:12.197"} +{"level":"info","message":"Simulated mint for token 624033","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:12.332"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297852203 -> token 624033","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297852203","environment":"test","service":"web3-student-lab-backend","tokenId":"624033","txHash":"0xbc3432a0469b4e724af2011076208fe4556e2f2cd3d1cb664855837ac9c1c83a"}},"timestamp":"2026-06-24 11:44:12.343"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297852203","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297852203","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:12.344"} +{"level":"info","message":"GET /api/v1/certificates/verify/624033","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:12.348"} +{"level":"info","message":"RSA Key rotated. New Key ID: 624dc591-27d9-4d3a-bc42-6dd9f2a6a013","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:26.962"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:27.410"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:28.387"} +{"level":"info","message":"Simulated mint for token 766376","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:28.636"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297928435 -> token 766376","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297928435","environment":"test","service":"web3-student-lab-backend","tokenId":"766376","txHash":"0xf8b84d315a27c4f503b29fe273527f0004df3b3f095ef766e1cc92620d8a7dca"}},"timestamp":"2026-06-24 11:45:28.649"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297928435","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297928435","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:28.650"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:28.679"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:28.691"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:28.702"} +{"level":"error","message":"Mint certificate error: Student with ID non-existent-student not found","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:28.707"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:28.718"} +{"level":"error","message":"Mint certificate error: Course with ID non-existent-course not found","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:28.726"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:28.735"} +{"level":"info","message":"Simulated mint for token 499107","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:28.904"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297928749 -> token 499107","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297928749","environment":"test","service":"web3-student-lab-backend","tokenId":"499107","txHash":"0x782cae378464da79715b926e724b5d4f10ff669642e649d2dcf328cc6562eb07"}},"timestamp":"2026-06-24 11:45:28.916"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297928749","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297928749","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:28.917"} +{"level":"info","message":"GET /api/v1/certificates/verify/499107","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:28.920"} +{"level":"info","message":"GET /api/v1/certificates/verify/nonexistenttoken123","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:28.952"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:28.967"} +{"level":"info","message":"Simulated mint for token 564749","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:29.099"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297928974 -> token 564749","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297928974","environment":"test","service":"web3-student-lab-backend","tokenId":"564749","txHash":"0x9b8665f26cb0709a7ef44f5e2ea0a746009f3f234cd51f88dc28d6e31650ee9e"}},"timestamp":"2026-06-24 11:45:29.118"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297928974","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297928974","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:29.119"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:29.134"} +{"level":"info","message":"Simulated mint for token batch-token-2","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:29.306"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297929149 -> token batch-token-2","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297929149","environment":"test","service":"web3-student-lab-backend","tokenId":"batch-token-2","txHash":"0xa0a731205f7c5bc616126f726b9d5c3ffc1fa30c030790b24653d054a49b2fa5"}},"timestamp":"2026-06-24 11:45:29.431"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297929149","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297929149","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:29.433"} +{"level":"info","message":"POST /api/v1/certificates/verify/batch","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:29.447"} +{"level":"info","message":"POST /api/v1/certificates/verify/batch","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:29.471"} +{"level":"info","message":"POST /api/v1/certificates/verify/batch","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:29.505"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:29.511"} +{"level":"info","message":"Simulated mint for token 659332","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:29.642"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297929517 -> token 659332","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297929517","environment":"test","service":"web3-student-lab-backend","tokenId":"659332","txHash":"0x2c9960591c327c6bf96ed3abad0856d690fdaf35a7ae8cf5943533080c047dc4"}},"timestamp":"2026-06-24 11:45:29.655"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297929517","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297929517","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:29.657"} +{"level":"info","message":"GET /api/v1/certificates/659332/metadata","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:29.669"} +{"level":"info","message":"GET /api/v1/certificates/nonexistent/metadata","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:29.691"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:29.701"} +{"level":"info","message":"Simulated mint for token 757531","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:29.827"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297929706 -> token 757531","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297929706","environment":"test","service":"web3-student-lab-backend","tokenId":"757531","txHash":"0x5d1f6d1c9c562ca615ab71040ba869d19c4c97731633a776b650d4de8dea91af"}},"timestamp":"2026-06-24 11:45:29.841"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297929706","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297929706","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:29.842"} +{"level":"info","message":"GET /api/v1/certificates/757531/metadata","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:29.850"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:29.867"} +{"level":"info","message":"Simulated mint for token 763761","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:29.996"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297929873 -> token 763761","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297929873","environment":"test","service":"web3-student-lab-backend","tokenId":"763761","txHash":"0xa38eddd4ee34792fab02f12a57dde4689554223fd0659f5c3cd252aceb1496b3"}},"timestamp":"2026-06-24 11:45:30.011"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297929873","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297929873","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:30.012"} +{"level":"info","message":"GET /api/v1/certificates/cert-api-stud-api-cour-1782297929873","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:30.018"} +{"level":"info","message":"GET /api/v1/certificates/nonexistent-id","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:30.036"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:30.050"} +{"level":"info","message":"Simulated mint for token 292047","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:30.184"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297930062 -> token 292047","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297930062","environment":"test","service":"web3-student-lab-backend","tokenId":"292047","txHash":"0xc7f806754068897444b5b9d0f383ae01018f98cb8b4d6b312f6bc110f78dac9d"}},"timestamp":"2026-06-24 11:45:30.197"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297930062","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297930062","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:30.199"} +{"level":"info","message":"GET /api/v1/certificates/student/api-student-123","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:30.206"} +{"level":"info","message":"GET /api/v1/certificates/student/nonexistent-student","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:30.230"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:30.240"} +{"level":"info","message":"Simulated mint for token 628869","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:30.369"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297930246 -> token 628869","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297930246","environment":"test","service":"web3-student-lab-backend","tokenId":"628869","txHash":"0x7d7461d7835673131f35dcf453d8c9ef938b452c4da125dd088aca62d9a23d73"}},"timestamp":"2026-06-24 11:45:30.380"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297930246","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297930246","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:30.382"} +{"level":"info","message":"PUT /api/v1/certificates/cert-api-stud-api-cour-1782297930246/revoke","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:30.393"} +{"level":"info","message":"Certificate revoked successfully","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297930246","environment":"test","reason":"Test revocation for API","revokedBy":"did:stellar:admin123","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:30.418"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:30.423"} +{"level":"info","message":"Simulated mint for token 890410","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:30.551"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297930430 -> token 890410","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297930430","environment":"test","service":"web3-student-lab-backend","tokenId":"890410","txHash":"0xeb11ff68acde284662570da649cd09b3ae9d5238d7ff6cae6cf0dbbe51fc3c1a"}},"timestamp":"2026-06-24 11:45:30.563"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297930430","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297930430","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:30.564"} +{"level":"info","message":"PUT /api/v1/certificates/cert-api-stud-api-cour-1782297930430/revoke","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:30.569"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:30.576"} +{"level":"info","message":"Simulated mint for token 254248","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:30.708"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297930583 -> token 254248","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297930583","environment":"test","service":"web3-student-lab-backend","tokenId":"254248","txHash":"0x66d8d7eda314dc480a1b674ceeafbe81945bc7ceb7242705e530a4b5f488df41"}},"timestamp":"2026-06-24 11:45:30.713"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297930583","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297930583","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:30.713"} +{"level":"info","message":"PUT /api/v1/certificates/cert-api-stud-api-cour-1782297930583/revoke","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:30.717"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:30.723"} +{"level":"info","message":"Simulated mint for token 664837","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:31.083"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297930730 -> token 664837","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297930730","environment":"test","service":"web3-student-lab-backend","tokenId":"664837","txHash":"0x90a222679aebdb86bf1a1cc1465257001dbece0ea35cfbcbad05fd2a3eeca74a"}},"timestamp":"2026-06-24 11:45:31.086"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297930730","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297930730","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:31.086"} +{"level":"info","message":"POST /api/v1/certificates/cert-api-stud-api-cour-1782297930730/reissue","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:31.090"} +{"level":"info","message":"Simulated mint for token 834192","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:31.228"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297931104 -> token 834192","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297931104","environment":"test","service":"web3-student-lab-backend","tokenId":"834192","txHash":"0x0e4a24a7562141dc17f40a41ceee53d936d8206def173ec073c1822cf34e95ed"}},"timestamp":"2026-06-24 11:45:31.232"} +{"level":"info","message":"Certificate reissued: cert-api-stud-api-cour-1782297930730 -> cert-api-stud-api-cour-1782297931104","metadata":{"metadata":{"environment":"test","issuedBy":"did:stellar:instructor","newId":"cert-api-stud-api-cour-1782297931104","originalId":"cert-api-stud-api-cour-1782297930730","reason":"Grade correction","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:31.236"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:31.242"} +{"level":"info","message":"Simulated mint for token 783051","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:31.366"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297931248 -> token 783051","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297931248","environment":"test","service":"web3-student-lab-backend","tokenId":"783051","txHash":"0x8e8cfdbff3c6320f3a23179bff885b1720ed631e0b9e524beefd8adeaca952a6"}},"timestamp":"2026-06-24 11:45:31.381"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297931248","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297931248","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:31.383"} +{"level":"info","message":"POST /api/v1/certificates/cert-api-stud-api-cour-1782297931248/reissue","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:31.395"} +{"level":"info","message":"Simulated mint for token 747857","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:31.584"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297931431 -> token 747857","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297931431","environment":"test","service":"web3-student-lab-backend","tokenId":"747857","txHash":"0x27e6d1bc14a05c57b07948e75af8d565f04a5f73cdd09d194e71717932bb88eb"}},"timestamp":"2026-06-24 11:45:31.588"} +{"level":"info","message":"Certificate reissued: cert-api-stud-api-cour-1782297931248 -> cert-api-stud-api-cour-1782297931431","metadata":{"metadata":{"environment":"test","issuedBy":"did:stellar:instructor","newId":"cert-api-stud-api-cour-1782297931431","originalId":"cert-api-stud-api-cour-1782297931248","reason":"Regeneration","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:31.593"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:31.599"} +{"level":"info","message":"Simulated mint for token 387431","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:31.735"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297931605 -> token 387431","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297931605","environment":"test","service":"web3-student-lab-backend","tokenId":"387431","txHash":"0x5cbc8f8d8ba99a07a28ee0ed55bf6329485883c62bfe92b33eb9f2dab7e6e02d"}},"timestamp":"2026-06-24 11:45:31.745"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297931605","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297931605","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:31.746"} +{"level":"info","message":"POST /api/v1/certificates/cert-api-stud-api-cour-1782297931605/reissue","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:31.755"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:31.770"} +{"level":"info","message":"Simulated mint for token 462530","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:31.951"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297931786 -> token 462530","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297931786","environment":"test","service":"web3-student-lab-backend","tokenId":"462530","txHash":"0x34d4b590ef90a06cc6cab7c02cd558462673d8d87976062b572d5d76653b6f06"}},"timestamp":"2026-06-24 11:45:31.959"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297931786","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297931786","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:31.961"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:31.971"} +{"level":"info","message":"Simulated mint for token 521127","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:32.143"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297931986 -> token 521127","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297931986","environment":"test","service":"web3-student-lab-backend","tokenId":"521127","txHash":"0xa6a6b165df4e5245574a1d966307af453058ed6ecc86b51991c30f34cd3fe764"}},"timestamp":"2026-06-24 11:45:32.155"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297931986","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297931986","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:32.156"} +{"level":"info","message":"GET /api/v1/certificates/analytics","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:32.160"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:32.204"} +{"level":"info","message":"Simulated mint for token 211864","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:32.340"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297932212 -> token 211864","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297932212","environment":"test","service":"web3-student-lab-backend","tokenId":"211864","txHash":"0x795be02a37d231af28b47d4449c20be29f005937ff880cde60d513e3d2e055eb"}},"timestamp":"2026-06-24 11:45:32.345"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297932212","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297932212","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:32.346"} +{"level":"info","message":"GET /api/v1/certificates/cert-api-stud-api-cour-1782297932212/image","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:32.350"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:32.360"} +{"level":"info","message":"Simulated mint for token 307196","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:32.492"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297932368 -> token 307196","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297932368","environment":"test","service":"web3-student-lab-backend","tokenId":"307196","txHash":"0xc82d2117f0a4b3bbaa4220f35588ca876ad6b1e71ac44d85a75313bbb43c562f"}},"timestamp":"2026-06-24 11:45:32.496"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297932368","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297932368","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:32.496"} +{"level":"info","message":"GET /api/v1/certificates/cert-api-stud-api-cour-1782297932368/qr","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:32.499"} +{"level":"info","message":"GET /api/v1/certificates?limit=10&offset=0","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:33.158"} +{"level":"info","message":"GET /api/v1/certificates?limit=5","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:33.171"} +{"level":"info","message":"GET /api/v1/certificates?limit=200","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:33.183"} +{"level":"info","message":"GET /api/etc/passwd","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:33.187"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:33.194"} +{"level":"info","message":"Simulated mint for token 654473","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:33.321"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782297933200 -> token 654473","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297933200","environment":"test","service":"web3-student-lab-backend","tokenId":"654473","txHash":"0x45674dd99b4e3a626edefc0932b96ce8ba21ec94c45a4642253505fa9c1e8640"}},"timestamp":"2026-06-24 11:45:33.333"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782297933200","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782297933200","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:33.334"} +{"level":"info","message":"GET /api/v1/certificates/verify/654473","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:33.342"} +{"correlationId":"4bed5aaf-a3bf-472a-9b69-6f23d815202a","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:48:40.611"} +{"correlationId":"test-correlation-id-123","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent","x-correlation-id":"test-correlation-id-123"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:48:40.620"} +{"correlationId":"test-request-id-123","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent","x-request-id":"test-request-id-123"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:48:40.643"} +{"correlationId":"33815492-4ef2-415f-96b4-6e7c3b4fefd8","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:48:40.657"} +{"correlationId":"ba457d0f-bab0-4b05-88e6-627b897c03ca","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:48:40.671"} +{"correlationId":"33cb0a6d-f547-46ba-b40c-4e8435561b49","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:48:40.690"} +{"correlationId":"e861b3db-4d5f-4abd-ab2a-59dd27f02bfb","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:48:40.695"} +{"correlationId":"734a6cff-a922-49f3-a3e8-2720092e29d3","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:48:40.704"} +{"correlationId":"c892f68d-357d-49d1-8731-8cc99f0df0cd","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:48:40.731"} +{"correlationId":"c892f68d-357d-49d1-8731-8cc99f0df0cd","level":"info","message":"Request completed","metadata":{"metadata":{"duration":"39ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":200,"url":"/api/test"}},"timestamp":"2026-06-24 11:48:40.750"} +{"correlationId":"207ed295-26a2-4c22-9783-d8f1186b8031","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:48:40.772"} +{"correlationId":"207ed295-26a2-4c22-9783-d8f1186b8031","level":"warn","message":"Request completed","metadata":{"metadata":{"duration":"20ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":404,"url":"/api/test"}},"timestamp":"2026-06-24 11:48:40.774"} +{"correlationId":"6c4c6300-3d36-406c-8044-c019063d08fc","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:48:40.779"} +{"correlationId":"6c4c6300-3d36-406c-8044-c019063d08fc","level":"error","message":"Request completed","metadata":{"metadata":{"duration":"2ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":500,"url":"/api/test"}},"timestamp":"2026-06-24 11:48:40.782"} +{"correlationId":"8604700c-aeda-4ff3-8f09-a584bb7cdd1e","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:48:40.787"} +{"correlationId":"8604700c-aeda-4ff3-8f09-a584bb7cdd1e","level":"info","message":"Request completed","metadata":{"metadata":{"duration":"4ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":200,"url":"/api/test"}},"timestamp":"2026-06-24 11:48:40.790"} +{"correlationId":"380e2c48-7a4f-4c06-9894-01d61cd079f4","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"authorization":"[REDACTED]","content-type":"application/json","cookie":"[REDACTED]","user-agent":"test-agent","x-api-key":"[REDACTED]"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:48:40.794"} +{"correlationId":"4525e5b5-d513-49c3-808c-f9628a85f416","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{"password":"[REDACTED]","token":"[REDACTED]","username":"testuser"},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:48:40.799"} +{"correlationId":"bf63ebc6-e908-419f-8205-6c47df0e1e06","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:48:40.804"} +{"correlationId":"f042d380-ffc9-44bc-a526-857b068bf847","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:48:40.814"} +{"correlationId":"f042d380-ffc9-44bc-a526-857b068bf847","level":"info","message":"Request completed","metadata":{"metadata":{"duration":"68ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":200,"url":"/api/test"}},"timestamp":"2026-06-24 11:48:40.882"} +{"level":"info","message":"GET /api/test","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:40.888"} +{"correlationId":"test-correlation-id-123","level":"info","message":"GET /api/test","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:40.892"} +{"level":"info","message":"GET /api/test","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:40.899"} +{"level":"info","message":"GET /api/test","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:40.903"} +{"correlationId":"17b681c3-3118-4373-8ecf-90c72510cfdf","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{"email":"test@example.com","password":"[REDACTED]"},"environment":"test","headers":{"authorization":"[REDACTED]","content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"POST","query":{},"service":"web3-student-lab-backend","url":"/api/users","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:48:40.907"} +{"correlationId":"17b681c3-3118-4373-8ecf-90c72510cfdf","level":"info","message":"Request completed","metadata":{"metadata":{"duration":"3ms","environment":"test","method":"POST","service":"web3-student-lab-backend","statusCode":201,"url":"/api/users"}},"timestamp":"2026-06-24 11:48:40.910"} +{"correlationId":"ab0c01be-9a50-4496-81d4-f2caca43fecd","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:48:40.914"} +{"correlationId":"ab0c01be-9a50-4496-81d4-f2caca43fecd","level":"warn","message":"Request completed","metadata":{"metadata":{"duration":"2ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":404,"url":"/api/test"}},"timestamp":"2026-06-24 11:48:40.917"} +{"correlationId":"635c23e0-dbed-488b-a5af-3657671476ad","level":"info","message":"Incoming request","metadata":{"metadata":{"body":{},"environment":"test","headers":{"content-type":"application/json","user-agent":"test-agent"},"ip":"127.0.0.1","method":"GET","query":{},"service":"web3-student-lab-backend","url":"/api/test","userAgent":"test-agent"}},"timestamp":"2026-06-24 11:48:40.921"} +{"correlationId":"635c23e0-dbed-488b-a5af-3657671476ad","level":"error","message":"Request completed","metadata":{"metadata":{"duration":"2ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":500,"url":"/api/test"}},"timestamp":"2026-06-24 11:48:40.945"} +{"correlationId":"test-correlation-id-123","level":"info","message":"Test info message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:43.088"} +{"correlationId":"test-correlation-id-123","level":"error","message":"Test error message Test error","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Test error\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/logger.test.ts:96:25)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 11:48:43.122"} +{"correlationId":"test-correlation-id-123","level":"warn","message":"Test warning message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:43.127"} +{"level":"info","message":"Test message","metadata":{"metadata":{"component":"TestComponent","environment":"test","service":"web3-student-lab-backend","userId":"user-123"}},"timestamp":"2026-06-24 11:48:43.136"} +{"correlationId":"test-correlation-id-123","level":"info","message":"Test message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:43.168"} +{"correlationId":"test-correlation-id-123","level":"info","message":"Test message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","userId":"user-123"}},"timestamp":"2026-06-24 11:48:43.176"} +{"correlationId":"test-correlation-id-123","level":"info","message":"Info message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:43.203"} +{"correlationId":"test-correlation-id-123","level":"warn","message":"Warn message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:43.206"} +{"correlationId":"test-correlation-id-123","level":"error","message":"Error message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:43.208"} +{"level":"info","message":"Connecting to standalone Redis...","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:43.345"} +{"level":"error","message":"Redis ping failed: Stream isn't writeable and enableOfflineQueue options is false","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Stream isn't writeable and enableOfflineQueue options is false\n at EventEmitter.sendCommand (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Redis.js:376:32)\n at EventEmitter.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/utils/Commander.js:90:25)\n at RedisClient.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:94:40)\n at RedisClient.connect (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:83:18)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/cache-distributed.test.ts:11:23)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusHook (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:980:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:804:7)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 11:48:43.410"} +{"level":"info","message":"Invalidated all blockchain caches","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:43.474"} +{"level":"info","message":"BlockHeaderListener started","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:43.489"} +{"level":"info","message":"BlockHeaderListener stopped","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:43.492"} +{"level":"info","message":"Redis (standalone) connected successfully","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:43.507"} +{"level":"info","message":"Redis (standalone) ready","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:43.519"} +{"level":"info","message":"BlockHeaderListener stopped","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:43.595"} +{"level":"info","message":"✅ Environment variables validated successfully","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:43.594"} +{"level":"info","message":"🌍 Environment: development","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:43.598"} +{"level":"info","message":"🔌 Port: 8080","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:43.600"} +{"level":"info","message":"🌐 Stellar Network: testnet","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:43.604"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: DATABASE_URL\nDescription: PostgreSQL connection string for database connectivity\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:43.609"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:43.657"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"short\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:43.663"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"short\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:43.672"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"your-secret-key-change-in-production\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:43.677"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"your-secret-key-change-in-production\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:43.686"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: DATABASE_URL\nDescription: PostgreSQL connection string for database connectivity\nCurrent value: \"invalid-url-format\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:43.691"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: DATABASE_URL\nDescription: PostgreSQL connection string for database connectivity\nCurrent value: \"invalid-url-format\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:43.696"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: STELLAR_ISSUER_SECRET_KEY\nDescription: Stellar secret key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nMissing required environment variable: STELLAR_ISSUER_PUBLIC_KEY\nDescription: Stellar public key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:43.701"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: STELLAR_ISSUER_SECRET_KEY\nDescription: Stellar secret key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nMissing required environment variable: STELLAR_ISSUER_PUBLIC_KEY\nDescription: Stellar public key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:43.720"} +{"level":"info","message":"✅ Environment variables validated successfully","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:43.725"} +{"level":"info","message":"🌍 Environment: production","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:43.727"} +{"level":"info","message":"🔌 Port: 8080","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:43.729"} +{"level":"info","message":"🌐 Stellar Network: testnet","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:43.732"} +{"level":"info","message":"✅ Environment variables validated successfully","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:43.736"} +{"level":"info","message":"🌍 Environment: development","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:43.737"} +{"level":"info","message":"🔌 Port: 8080","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:43.739"} +{"level":"info","message":"🌐 Stellar Network: testnet","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:43.742"} +{"level":"info","message":"✅ Environment variables validated successfully","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:43.746"} +{"level":"info","message":"🌍 Environment: development","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:43.748"} +{"level":"info","message":"🔌 Port: 3000","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:43.750"} +{"level":"info","message":"🌐 Stellar Network: mainnet","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:43.752"} +{"level":"warn","message":"Redis (standalone) connection closed","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:44.183"} +{"level":"info","message":"RSA Key rotated. New Key ID: be01bc4d-e3d1-446f-a8b8-ec217a2ad26a","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:47.147"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:48.189"} +{"level":"info","message":"POST /api/v1/students","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:51.137"} +{"level":"info","message":"RSA Key rotated. New Key ID: 46b87498-66f2-4cd6-ba54-0db1beea7f81","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:45.879"} +{"level":"info","message":"RSA Key rotated. New Key ID: 0f9deaff-8c4a-41b2-a6cb-4eab5b297d69","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:45.141"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:48.154"} +{"level":"info","message":"Audit Log: CREATE_STUDENT by test-isolation-1782298130853@example.com","metadata":{"metadata":{"action":"CREATE_STUDENT","entity":"Student","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:51.693"} +{"level":"info","message":"GET /api/v1/students/cmqryafl60000pueccz9t0ciu","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:51.699"} +{"level":"info","message":"RSA Key rotated. New Key ID: cd6ea94a-bf56-4ea0-af12-14319515def0","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:48.764"} +{"level":"info","message":"GET /api/v1/students","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:51.821"} +{"level":"info","message":"POST /api/v1/students","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:51.836"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:51.839"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:49.841"} +{"level":"info","message":"Notification created [course_created] Web3 101 — New Course","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:51.517"} +{"level":"info","message":"Notification created [learning_opportunity] — Recommended Course","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:51.556"} +{"level":"info","message":"Notification created [announcement] — Platform Update","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:51.560"} +{"level":"info","message":"Notification created [course_created] — Broadcast","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:51.630"} +{"level":"info","message":"Notification created [course_updated] — User-specific","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:51.642"} +{"level":"info","message":"Notification created [course_created] — Other user","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:51.644"} +{"level":"info","message":"Notification created [course_created] — A","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:51.658"} +{"level":"info","message":"Notification created [course_created] — B","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:51.679"} +{"level":"info","message":"Notification created [course_created] — First","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:51.709"} +{"level":"info","message":"Notification created [course_created] — Second","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:51.776"} +{"level":"info","message":"Notification created [course_created] — Test","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:51.782"} +{"level":"info","message":"Notification created [course_created] — A","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:51.795"} +{"level":"info","message":"Notification created [course_created] — B","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:51.797"} +{"level":"info","message":"Notification created [announcement] — C","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:51.800"} +{"level":"info","message":"GET /api/v1/notifications","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:51.842"} +{"level":"info","message":"Notification created [course_created] Web3 101 — New Course","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:51.869"} +{"level":"info","message":"Audit Log: CREATE_STUDENT by update-isolation-1782298131827@example.com","metadata":{"metadata":{"action":"CREATE_STUDENT","entity":"Student","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:51.872"} +{"level":"info","message":"GET /api/v1/notifications?userId=test-user","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:51.877"} +{"level":"info","message":"PUT /api/v1/students/cmqryafzy0002puecajmr5yyp","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:51.884"} +{"level":"info","message":"Notification created [course_created] — Read test","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:51.888"} +{"level":"info","message":"PUT /api/v1/notifications/notif-1782298131887-1/read","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:51.910"} +{"level":"info","message":"PUT /api/v1/notifications/bad-id/read","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:51.928"} +{"level":"info","message":"Notification created [course_created] — A","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:51.939"} +{"level":"info","message":"Notification created [course_created] — B","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:51.941"} +{"level":"info","message":"PUT /api/v1/notifications/read-all","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:51.968"} +{"level":"info","message":"PUT /api/v1/notifications/read-all","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:52.014"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:48.104"} +{"level":"info","message":"RSA Key rotated. New Key ID: a2a59ce6-d0c1-43da-a5dc-912d7d1924d7","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:45.704"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:48.135"} +{"level":"info","message":"RSA Key rotated. New Key ID: 59fa4a93-ce2b-4751-99f1-0cfb8fc3fbe9","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:49.070"} +{"level":"info","message":"Simulated mint for token 577996","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:52.572"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782298131925 -> token 577996","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782298131925","environment":"test","service":"web3-student-lab-backend","tokenId":"577996","txHash":"0x557318f8775930df793267ce7f0b99fd159955647cb9499267fa39c9555219dd"}},"timestamp":"2026-06-24 11:48:52.602"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782298131925","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782298131925","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:52.605"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:52.681"} +{"level":"info","message":"POST /api/v1/students","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:52.725"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:52.749"} +{"level":"info","message":"Audit Log: CREATE_STUDENT by delete-isolation-1782298132711@example.com","metadata":{"metadata":{"action":"CREATE_STUDENT","entity":"Student","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:52.750"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:52.771"} +{"level":"info","message":"DELETE /api/v1/students/cmqryagon0004puec8txyhvbc","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:52.775"} +{"level":"error","message":"Mint certificate error: Student with ID non-existent-student not found","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:52.801"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:52.821"} +{"level":"info","message":"Delivered webhook delivery_1 to https://example.com/webhook with status 200","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:51.971"} +{"level":"info","message":"GET /api/v1/students/cmqryagon0004puec8txyhvbc","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:52.833"} +{"level":"error","message":"Mint certificate error: Course with ID non-existent-course not found","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:52.868"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:52.881"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1000","meta":{"driverAdapterError":{"cause":{"kind":"AuthenticationFailed","originalCode":"28P01","originalMessage":"password authentication failed for user \"dummy\"","user":"dummy"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:53.007"} +{"level":"info","message":"Pinned decentralized asset project/project-1/example -> bafyd37873b9cdea335789ab00f55e95233b9090e32bb1162154b65bc6c2","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:52.785"} +{"level":"info","message":"Simulated mint for token 565752","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:53.078"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1000","meta":{"driverAdapterError":{"cause":{"kind":"AuthenticationFailed","originalCode":"28P01","originalMessage":"password authentication failed for user \"dummy\"","user":"dummy"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:53.089"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782298132893 -> token 565752","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782298132893","environment":"test","service":"web3-student-lab-backend","tokenId":"565752","txHash":"0x9097e41307702b04ac46ddc836fc473fc7d60da8981c06f993500cef3a029a7f"}},"timestamp":"2026-06-24 11:48:53.090"} +{"level":"info","message":"Unpinned stale decentralized asset bafy123","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:52.815"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:53.076"} +{"level":"info","message":"Smart contract compilation completed","metadata":{"metadata":{"compiled":true,"compilerVersion":"0.8.10","durationMs":0.29681,"environment":"test","errorCount":0,"optimization":false,"service":"web3-student-lab-backend","sourceHash":"1d7028b29df88b09f9297265b8f8c52870c5950670d50fc9c71b99fb63f8c9f3","target":"solidity","warningCount":0}},"timestamp":"2026-06-24 11:48:53.087"} +{"level":"info","message":"Smart contract compilation completed","metadata":{"metadata":{"compiled":false,"compilerVersion":"0.8.10","durationMs":0.05948,"environment":"test","errorCount":1,"optimization":false,"service":"web3-student-lab-backend","sourceHash":"a25af2a7b44af159360737771d82102721af99a7e77e37879498aeab7e5b4260","target":"solidity","warningCount":0}},"timestamp":"2026-06-24 11:48:53.094"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782298132893","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782298132893","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:53.092"} +{"level":"info","message":"GET /api/v1/certificates/verify/565752","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:53.102"} +{"level":"info","message":"Smart contract execution result","metadata":{"metadata":{"caller":"tester","contractAddress":"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef","durationMs":53.966026,"environment":"test","executionId":"6fafc305-eae0-415e-a39b-51458186039f","functionName":"execute","gasUsed":91938,"logCount":3,"service":"web3-student-lab-backend","success":true}},"timestamp":"2026-06-24 11:48:53.156"} +{"level":"info","message":"GET /api/v1/certificates/verify/nonexistenttoken123","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:53.202"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1000","meta":{"driverAdapterError":{"cause":{"kind":"AuthenticationFailed","originalCode":"28P01","originalMessage":"password authentication failed for user \"dummy\"","user":"dummy"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:53.277"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:53.288"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1000","meta":{"driverAdapterError":{"cause":{"kind":"AuthenticationFailed","originalCode":"28P01","originalMessage":"password authentication failed for user \"dummy\"","user":"dummy"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:53.334"} +{"level":"info","message":"RSA Key rotated. New Key ID: 6fe35e82-1723-419e-ab0b-0e9e6b69b743","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:49.913"} +{"level":"warn","message":"DB health alerts","metadata":{"metadata":{"alerts":["Warning: DB connection utilization is 90% of configured pool max (10)"],"environment":"test","latencyMs":0,"poolUsage":{"active":9,"idle":1,"total":10,"utilizationPct":90},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:53.366"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:51.171"} +{"level":"error","message":"DB health check failed","metadata":{"metadata":{"environment":"test","error":"database unavailable","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:53.385"} +{"level":"info","message":"Simulated mint for token 468120","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:53.486"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782298133316 -> token 468120","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782298133316","environment":"test","service":"web3-student-lab-backend","tokenId":"468120","txHash":"0xf76ed460e8297683d711dde65027e30c7338d8b2efabfd7450bf746f5457d141"}},"timestamp":"2026-06-24 11:48:53.492"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782298133316","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782298133316","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:53.494"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:53.506"} +{"level":"info","message":"Simulated mint for token batch-token-2","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:53.700"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782298133523 -> token batch-token-2","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782298133523","environment":"test","service":"web3-student-lab-backend","tokenId":"batch-token-2","txHash":"0x525f6abe42fcc9ce26103b46b3509dd4ab191c955e98a87ad7bea34937f8f2fd"}},"timestamp":"2026-06-24 11:48:53.706"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782298133523","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782298133523","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:53.708"} +{"level":"info","message":"POST /api/v1/certificates/verify/batch","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:53.718"} +{"level":"info","message":"POST /api/v1/certificates/verify/batch","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:53.789"} +{"level":"info","message":"POST /api/v1/certificates/verify/batch","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:53.846"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:53.859"} +{"level":"info","message":"Simulated mint for token 666559","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:54.015"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782298133875 -> token 666559","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782298133875","environment":"test","service":"web3-student-lab-backend","tokenId":"666559","txHash":"0x6bfc5c220d8b1972e76122193d04372c5d640a446a475ce49a154b5326f86197"}},"timestamp":"2026-06-24 11:48:54.022"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782298133875","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782298133875","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:54.023"} +{"level":"info","message":"GET /api/v1/certificates/666559/metadata","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:54.038"} +{"level":"info","message":"GET /api/v1/certificates/nonexistent/metadata","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:54.094"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:54.115"} +{"level":"info","message":"Queued webhook delivery 16b4882b-f3ca-4490-9ded-38cdfbfd89da for https://example.com/webhook","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:53.805"} +{"level":"warn","message":"Failed to load .env file, using environment variables from system.","metadata":{"metadata":{"environment":"development","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:54.071"} +{"level":"info","message":"✅ Environment variables validated successfully","metadata":{"metadata":{"environment":"development","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:54.082"} +{"level":"info","message":"🌍 Environment: development","metadata":{"metadata":{"environment":"development","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:54.084"} +{"level":"info","message":"🔌 Port: 8080","metadata":{"metadata":{"environment":"development","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:54.086"} +{"level":"info","message":"🌐 Stellar Network: testnet","metadata":{"metadata":{"environment":"development","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:54.090"} +{"level":"info","message":"Simulated mint for token 687436","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:54.271"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782298134125 -> token 687436","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782298134125","environment":"test","service":"web3-student-lab-backend","tokenId":"687436","txHash":"0x8508fcfbd18f137179c2d1e983bfa2cf80ab22887c8fc60923de4c8ebbb89682"}},"timestamp":"2026-06-24 11:48:54.277"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782298134125","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782298134125","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:54.279"} +{"level":"info","message":"GET /api/v1/certificates/687436/metadata","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:54.294"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:54.339"} +{"level":"info","message":"Simulated mint for token 547245","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:54.487"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782298134349 -> token 547245","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782298134349","environment":"test","service":"web3-student-lab-backend","tokenId":"547245","txHash":"0xd6fb9dc9cdba8a39d14cb4671973d515f508135ae8111c9f122b1f3d3c48a4bf"}},"timestamp":"2026-06-24 11:48:54.508"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782298134349","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782298134349","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:54.510"} +{"level":"info","message":"GET /api/v1/certificates/cert-api-stud-api-cour-1782298134349","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:54.519"} +{"level":"info","message":"GET /api/v1/certificates/nonexistent-id","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:54.568"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:54.581"} +{"level":"info","message":"Simulated mint for token 366396","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:54.719"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782298134589 -> token 366396","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782298134589","environment":"test","service":"web3-student-lab-backend","tokenId":"366396","txHash":"0x47a63b6180ef9f35701c11efb60d046343183bcf527c2c25cd255a363451ec6e"}},"timestamp":"2026-06-24 11:48:54.724"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782298134589","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782298134589","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:54.725"} +{"level":"info","message":"GET /api/v1/certificates/student/api-student-123","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:54.733"} +{"level":"info","message":"GET /api/v1/certificates/student/nonexistent-student","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:54.776"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:54.792"} +{"level":"info","message":"Simulated mint for token 815674","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:54.969"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782298134824 -> token 815674","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782298134824","environment":"test","service":"web3-student-lab-backend","tokenId":"815674","txHash":"0xc52f6a415a595a784facba095b1d844a48516a9b1dda22981a593cc968de39a2"}},"timestamp":"2026-06-24 11:48:54.975"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782298134824","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782298134824","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:54.976"} +{"level":"info","message":"PUT /api/v1/certificates/cert-api-stud-api-cour-1782298134824/revoke","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:54.983"} +{"level":"info","message":"Certificate revoked successfully","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782298134824","environment":"test","reason":"Test revocation for API","revokedBy":"did:stellar:admin123","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:55.087"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:55.103"} +{"level":"info","message":"Simulated mint for token 234138","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:55.249"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782298135117 -> token 234138","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782298135117","environment":"test","service":"web3-student-lab-backend","tokenId":"234138","txHash":"0x2ee5ed4115105e871a718ee2b02f27a392297458acd1325c6beba74cb110db5e"}},"timestamp":"2026-06-24 11:48:55.258"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782298135117","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782298135117","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:55.260"} +{"level":"info","message":"PUT /api/v1/certificates/cert-api-stud-api-cour-1782298135117/revoke","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:55.269"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:55.277"} +{"level":"info","message":"Simulated mint for token 228021","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:55.408"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782298135285 -> token 228021","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782298135285","environment":"test","service":"web3-student-lab-backend","tokenId":"228021","txHash":"0x7596f90fca7450d7ae70ff47270c64ecd5a57adde69fc9271bde78e8c8ebb496"}},"timestamp":"2026-06-24 11:48:55.419"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782298135285","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782298135285","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:55.420"} +{"level":"info","message":"PUT /api/v1/certificates/cert-api-stud-api-cour-1782298135285/revoke","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:55.427"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:55.457"} +{"level":"info","message":"Simulated mint for token 121098","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:55.622"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782298135475 -> token 121098","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782298135475","environment":"test","service":"web3-student-lab-backend","tokenId":"121098","txHash":"0xc927da181da92477000179db0c69e0d5c3fa0a3383994c265fb86f251bec96a3"}},"timestamp":"2026-06-24 11:48:55.627"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782298135475","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782298135475","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:55.629"} +{"level":"info","message":"POST /api/v1/certificates/cert-api-stud-api-cour-1782298135475/reissue","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:55.637"} +{"level":"info","message":"Simulated mint for token 129975","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:55.804"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782298135674 -> token 129975","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782298135674","environment":"test","service":"web3-student-lab-backend","tokenId":"129975","txHash":"0xe5c82dd4131bd5cdf2ade38eb183c1b04458dd12478e56865830a87b24279297"}},"timestamp":"2026-06-24 11:48:55.810"} +{"level":"info","message":"Certificate reissued: cert-api-stud-api-cour-1782298135475 -> cert-api-stud-api-cour-1782298135674","metadata":{"metadata":{"environment":"test","issuedBy":"did:stellar:instructor","newId":"cert-api-stud-api-cour-1782298135674","originalId":"cert-api-stud-api-cour-1782298135475","reason":"Grade correction","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:55.819"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:55.836"} +{"level":"info","message":"Simulated mint for token 345421","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:55.990"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782298135843 -> token 345421","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782298135843","environment":"test","service":"web3-student-lab-backend","tokenId":"345421","txHash":"0xb2ee8f112538b956f341e5dfbcf0749fa02b38bd72a2d8fefc315a5e0b3965ea"}},"timestamp":"2026-06-24 11:48:55.996"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782298135843","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782298135843","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:55.998"} +{"level":"info","message":"POST /api/v1/certificates/cert-api-stud-api-cour-1782298135843/reissue","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:56.025"} +{"level":"info","message":"Simulated mint for token 723148","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:56.268"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782298136086 -> token 723148","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782298136086","environment":"test","service":"web3-student-lab-backend","tokenId":"723148","txHash":"0x0701da366a196452ff8b1bd53c1dd1d9a8a0d42297f91fd804248aa3ecb5bf7f"}},"timestamp":"2026-06-24 11:48:56.273"} +{"level":"info","message":"Certificate reissued: cert-api-stud-api-cour-1782298135843 -> cert-api-stud-api-cour-1782298136086","metadata":{"metadata":{"environment":"test","issuedBy":"did:stellar:instructor","newId":"cert-api-stud-api-cour-1782298136086","originalId":"cert-api-stud-api-cour-1782298135843","reason":"Regeneration","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:56.278"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:50.164"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:56.300"} +{"level":"info","message":"RSA Key rotated. New Key ID: ded0afbb-e1bf-4a5c-9ef5-5bbbde39dc9a","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:55.325"} +{"level":"info","message":"RSA Key rotated. New Key ID: 76faf0ad-b996-44b4-a7e6-a3d01fedadfc","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:55.453"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:55.758"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:55.732"} +{"level":"info","message":"POST /api/v1/contracts/compile","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:56.316"} +{"level":"info","message":"Smart contract compilation completed","metadata":{"metadata":{"compiled":true,"compilerVersion":"0.8.10","durationMs":0.482098,"environment":"test","errorCount":0,"optimization":false,"service":"web3-student-lab-backend","sourceHash":"57d27b75f33e2f1ce11a20d6b9dad629e025993c91437eafce7ef6be749b90b2","target":"solidity","warningCount":0}},"timestamp":"2026-06-24 11:48:56.329"} +{"level":"info","message":"POST /api/v1/contracts/compile","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:56.347"} +{"level":"info","message":"POST /api/v1/contracts/execute","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:56.389"} +{"level":"info","message":"Smart contract execution result","metadata":{"metadata":{"caller":"test-suite","contractAddress":"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef","durationMs":51.845476,"environment":"test","executionId":"d396f26e-ace1-4dbe-b49b-e2a3d19a448b","functionName":"execute","gasUsed":84590,"logCount":3,"service":"web3-student-lab-backend","success":true}},"timestamp":"2026-06-24 11:48:56.445"} +{"level":"info","message":"Simulated mint for token 356000","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:56.457"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782298136319 -> token 356000","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782298136319","environment":"test","service":"web3-student-lab-backend","tokenId":"356000","txHash":"0x265f598758638f67e95b671a216aabd416c5b100fb80a2222d474eab886e1dab"}},"timestamp":"2026-06-24 11:48:56.470"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782298136319","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782298136319","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:56.476"} +{"level":"info","message":"POST /api/v1/certificates/cert-api-stud-api-cour-1782298136319/reissue","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:56.490"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:56.507"} +{"level":"info","message":"RSA Key rotated. New Key ID: 51ba3907-b0d6-4725-bbf2-d8ee4e75c355","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:55.671"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:55.994"} +{"level":"info","message":"POST /api/v1/contracts/compile","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:56.598"} +{"level":"info","message":"Simulated mint for token 381133","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:56.644"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782298136516 -> token 381133","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782298136516","environment":"test","service":"web3-student-lab-backend","tokenId":"381133","txHash":"0x82469e5c0d1ca88fccfbddc813391fcf6cc8652d1dffa47aa2a10ffa45293618"}},"timestamp":"2026-06-24 11:48:56.649"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782298136516","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782298136516","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:56.650"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:56.654"} +{"level":"info","message":"Connecting to standalone Redis...","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:53.922"} +{"level":"info","message":"RSA Key rotated. New Key ID: 913c1ef9-16a0-4166-be3d-22a9ca21a3f4","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:56.165"} +{"level":"error","message":"Redis ping failed: Stream isn't writeable and enableOfflineQueue options is false","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Stream isn't writeable and enableOfflineQueue options is false\n at EventEmitter.sendCommand (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Redis.js:376:32)\n at EventEmitter.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/utils/Commander.js:90:25)\n at RedisClient.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:94:40)\n at RedisClient.connect (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:83:18)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/cache.test.ts:7:23)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusHook (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:980:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:804:7)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 11:48:53.948"} +{"level":"warn","message":"Error during Redis disconnect: Stream isn't writeable and enableOfflineQueue options is false","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Stream isn't writeable and enableOfflineQueue options is false\n at EventEmitter.sendCommand (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Redis.js:376:32)\n at EventEmitter.quit (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/utils/Commander.js:90:25)\n at RedisClient.disconnect (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:123:27)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/cache.test.ts:11:23)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusHook (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:980:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:895:7)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 11:48:54.011"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:56.512"} +{"level":"info","message":"Simulated mint for token 806861","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:56.782"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782298136659 -> token 806861","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782298136659","environment":"test","service":"web3-student-lab-backend","tokenId":"806861","txHash":"0x841a97b3a0f3508d2f0cc2edffc165021c20c24deffd76ba01c28793574370ab"}},"timestamp":"2026-06-24 11:48:56.786"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782298136659","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782298136659","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:56.787"} +{"level":"info","message":"GET /api/v1/certificates/analytics","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:56.790"} +{"level":"info","message":"GET /health","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:56.790"} +{"level":"info","message":"GET /health","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:56.809"} +{"level":"info","message":"GET /health","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:56.832"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:56.837"} +{"level":"info","message":"GET /health","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:56.841"} +{"level":"info","message":"GET /non-existent-route","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:56.851"} +{"level":"info","message":"Simulated mint for token 407877","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:56.975"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782298136846 -> token 407877","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782298136846","environment":"test","service":"web3-student-lab-backend","tokenId":"407877","txHash":"0x783380517ca59f73c1c320c7bb114d6c8eb2a8e80db76a6d6d94bfe5d94087da"}},"timestamp":"2026-06-24 11:48:56.978"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782298136846","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782298136846","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:56.979"} +{"level":"info","message":"GET /api/v1/certificates/cert-api-stud-api-cour-1782298136846/image","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:56.985"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:56.994"} +{"level":"info","message":"Simulated mint for token 807893","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:57.123"} +{"level":"info","message":"RSA Key rotated. New Key ID: 3da8ab15-4b6d-49d7-b655-01252adae4c6","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:56.768"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782298137001 -> token 807893","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782298137001","environment":"test","service":"web3-student-lab-backend","tokenId":"807893","txHash":"0x6676526473229353e5b415cd7875fe0e26d9b7059fa5ae9e01a7487bbe653e0b"}},"timestamp":"2026-06-24 11:48:57.130"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782298137001","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782298137001","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:57.132"} +{"level":"info","message":"GET /api/v1/certificates/cert-api-stud-api-cour-1782298137001/qr","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:57.135"} +{"level":"info","message":"Blockchain service initialized in simulation mode","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:56.931"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:57.136"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:57.150"} +{"level":"info","message":"GET /api/v1/certificates?limit=10&offset=0","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:57.789"} +{"level":"info","message":"GET /api/v1/certificates?limit=5","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:57.803"} +{"level":"info","message":"GET /api/v1/certificates?limit=200","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:57.818"} +{"level":"info","message":"GET /api/etc/passwd","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:57.822"} +{"level":"info","message":"POST /api/v1/certificates","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:57.829"} +{"level":"info","message":"Simulated mint for token 801420","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:57.954"} +{"level":"info","message":"Certificate minted on-chain: cert-api-stud-api-cour-1782298137835 -> token 801420","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782298137835","environment":"test","service":"web3-student-lab-backend","tokenId":"801420","txHash":"0xf1d67742451a686e55591b75381d493cd92dd651265fb494b74472c2746e400c"}},"timestamp":"2026-06-24 11:48:57.965"} +{"level":"info","message":"Certificate minted: cert-api-stud-api-cour-1782298137835","metadata":{"metadata":{"certificateId":"cert-api-stud-api-cour-1782298137835","environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:57.967"} +{"level":"info","message":"GET /api/v1/certificates/verify/801420","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:57.973"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1000","meta":{"driverAdapterError":{"cause":{"kind":"AuthenticationFailed","originalCode":"28P01","originalMessage":"password authentication failed for user \"dummy\"","user":"dummy"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:49:12.187"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1000","meta":{"driverAdapterError":{"cause":{"kind":"AuthenticationFailed","originalCode":"28P01","originalMessage":"password authentication failed for user \"dummy\"","user":"dummy"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:49:12.224"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1000","meta":{"driverAdapterError":{"cause":{"kind":"AuthenticationFailed","originalCode":"28P01","originalMessage":"password authentication failed for user \"dummy\"","user":"dummy"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:49:12.268"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1000","meta":{"driverAdapterError":{"cause":{"kind":"AuthenticationFailed","originalCode":"28P01","originalMessage":"password authentication failed for user \"dummy\"","user":"dummy"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:49:12.322"} +{"level":"error","message":"[Metrics] Error recorded: ValidationError — Invalid email","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:50:19.717"} +{"level":"error","message":"[Metrics] Error recorded: UnhandledRejection — Promise rejected","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:50:19.772"} +{"level":"error","message":"[Metrics] Error recorded: TypeError — Cannot read property","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:50:19.805"} +{"level":"error","message":"[Metrics] Error recorded: DBError — Connection refused","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:50:19.856"} +{"level":"error","message":"[Metrics] Error recorded: ValidationError — bad input","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:50:20.050"} +{"level":"error","message":"[Metrics] Error recorded: ValidationError — bad input 2","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:50:20.111"} +{"level":"error","message":"[Metrics] Error recorded: DBError — timeout","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:50:20.133"} +{"level":"error","message":"[Metrics] Error recorded: Error — oops","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:50:20.216"} +{"level":"error","message":"[Metrics] Error recorded: Error — msg-0","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:50:20.240"} +{"level":"error","message":"[Metrics] Error recorded: Error — msg-1","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:50:20.246"} +{"level":"error","message":"[Metrics] Error recorded: Error — msg-2","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:50:20.254"} +{"level":"error","message":"[Metrics] Error recorded: Error — msg-3","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:50:20.259"} +{"level":"error","message":"[Metrics] Error recorded: Error — msg-4","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:50:20.322"} +{"level":"error","message":"[Metrics] Error recorded: Error — msg-5","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:50:20.334"} +{"level":"error","message":"[Metrics] Error recorded: ValidationError — bad input","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:50:20.879"} +{"level":"error","message":"[Metrics] Error recorded: Error — oops","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:50:21.135"} +{"level":"error","message":"Redis ping failed: Stream isn't writeable and enableOfflineQueue options is false","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Stream isn't writeable and enableOfflineQueue options is false\n at EventEmitter.sendCommand (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Redis.js:376:32)\n at EventEmitter.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/utils/Commander.js:90:25)\n at RedisClient.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:94:40)\n at RedisClient.connect (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:83:18)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/cache-distributed.test.ts:11:23)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusHook (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:980:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:804:7)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 12:50:29.707"} +{"level":"error","message":"Cache get error for key courses:list: Stream isn't writeable and enableOfflineQueue options is false","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Stream isn't writeable and enableOfflineQueue options is false\n at EventEmitter.sendCommand (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Redis.js:376:32)\n at execPipeline (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Pipeline.js:348:25)\n at Pipeline.exec (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Pipeline.js:291:5)\n at Immediate.executeAutoPipeline (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/autoPipelining.js:53:14)\n at processImmediate (node:internal/timers:487:21)\n at process.callbackTrampoline (node:internal/async_hooks:130:17)"}},"timestamp":"2026-06-24 12:50:30.050"} +{"level":"error","message":"Cache get error for key leaderboard:global: Stream isn't writeable and enableOfflineQueue options is false","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Stream isn't writeable and enableOfflineQueue options is false\n at EventEmitter.sendCommand (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Redis.js:376:32)\n at execPipeline (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Pipeline.js:348:25)\n at Pipeline.exec (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Pipeline.js:291:5)\n at Immediate.executeAutoPipeline (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/autoPipelining.js:53:14)\n at processImmediate (node:internal/timers:487:21)\n at process.callbackTrampoline (node:internal/async_hooks:130:17)"}},"timestamp":"2026-06-24 12:50:30.056"} +{"level":"error","message":"Cache get error for key leaderboard:weekly: Stream isn't writeable and enableOfflineQueue options is false","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Stream isn't writeable and enableOfflineQueue options is false\n at EventEmitter.sendCommand (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Redis.js:376:32)\n at execPipeline (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Pipeline.js:348:25)\n at Pipeline.exec (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Pipeline.js:291:5)\n at Immediate.executeAutoPipeline (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/autoPipelining.js:53:14)\n at processImmediate (node:internal/timers:487:21)\n at process.callbackTrampoline (node:internal/async_hooks:130:17)"}},"timestamp":"2026-06-24 12:50:30.144"} +{"correlationId":"6ac1c9c1-b881-487d-995c-80f35e20a0e0","level":"error","message":"Request completed","metadata":{"metadata":{"duration":"1ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":500,"url":"/api/test"}},"timestamp":"2026-06-24 12:50:32.692"} +{"correlationId":"test-correlation-id-123","level":"error","message":"Test error message Test error","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Test error\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/logger.test.ts:96:25)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 12:50:36.172"} +{"correlationId":"759465f9-ea33-491d-9078-18151d9b551a","level":"error","message":"Request completed","metadata":{"metadata":{"duration":"1ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":500,"url":"/api/test"}},"timestamp":"2026-06-24 12:50:33.123"} +{"correlationId":"test-correlation-id-123","level":"error","message":"Error message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:50:36.344"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: DATABASE_URL\nDescription: PostgreSQL connection string for database connectivity\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:50:38.245"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:50:38.416"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"short\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:50:38.427"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"short\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:50:38.437"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"your-secret-key-change-in-production\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:50:38.470"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"your-secret-key-change-in-production\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:50:38.507"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: DATABASE_URL\nDescription: PostgreSQL connection string for database connectivity\nCurrent value: \"invalid-url-format\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:50:38.523"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: DATABASE_URL\nDescription: PostgreSQL connection string for database connectivity\nCurrent value: \"invalid-url-format\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:50:38.540"} +{"level":"error","message":"Redis ping failed: Stream isn't writeable and enableOfflineQueue options is false","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Stream isn't writeable and enableOfflineQueue options is false\n at EventEmitter.sendCommand (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Redis.js:376:32)\n at EventEmitter.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/utils/Commander.js:90:25)\n at RedisClient.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:94:40)\n at RedisClient.connect (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:83:18)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/cache.test.ts:7:23)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusHook (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:980:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:804:7)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 12:50:41.912"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: DATABASE_URL\nDescription: PostgreSQL connection string for database connectivity\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:27.417"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:27.503"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"short\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:27.510"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"short\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:27.517"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"your-secret-key-change-in-production\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:27.525"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"your-secret-key-change-in-production\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:27.529"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: DATABASE_URL\nDescription: PostgreSQL connection string for database connectivity\nCurrent value: \"invalid-url-format\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:27.536"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: DATABASE_URL\nDescription: PostgreSQL connection string for database connectivity\nCurrent value: \"invalid-url-format\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:27.547"} +{"level":"error","message":"[Metrics] Error recorded: ValidationError — Invalid email","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:27.954"} +{"level":"error","message":"[Metrics] Error recorded: UnhandledRejection — Promise rejected","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:27.961"} +{"level":"error","message":"[Metrics] Error recorded: TypeError — Cannot read property","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:27.971"} +{"level":"error","message":"[Metrics] Error recorded: DBError — Connection refused","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:27.980"} +{"level":"error","message":"[Metrics] Error recorded: ValidationError — bad input","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:28.014"} +{"level":"error","message":"[Metrics] Error recorded: ValidationError — bad input 2","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:28.017"} +{"level":"error","message":"[Metrics] Error recorded: DBError — timeout","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:28.020"} +{"level":"error","message":"[Metrics] Error recorded: Error — oops","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:28.081"} +{"level":"error","message":"[Metrics] Error recorded: Error — msg-0","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:28.091"} +{"level":"error","message":"[Metrics] Error recorded: Error — msg-1","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:28.104"} +{"level":"error","message":"[Metrics] Error recorded: Error — msg-2","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:28.106"} +{"level":"error","message":"[Metrics] Error recorded: Error — msg-3","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:28.108"} +{"level":"error","message":"[Metrics] Error recorded: Error — msg-4","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:28.110"} +{"level":"error","message":"[Metrics] Error recorded: Error — msg-5","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:28.112"} +{"level":"error","message":"[Metrics] Error recorded: ValidationError — bad input","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:28.259"} +{"level":"error","message":"[Metrics] Error recorded: Error — oops","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:28.296"} +{"level":"error","message":"Mint certificate error: Student with ID non-existent-student not found","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:35.911"} +{"level":"error","message":"Mint certificate error: Course with ID non-existent-course not found","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:35.944"} +{"level":"error","message":"Certificate issuance failed for cert-api-stud-api-cour-1782302017794: \nInvalid `prisma.certificate.update()` invocation in\n/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/certificates/CertificateService.ts:129:32\n\n 126 const mintResult = await certificateBlockchainService.mintCertificate(metadata);\n 127 \n 128 // Update certificate with blockchain transaction details\n→ 129 await prisma.certificate.update(\nAn operation failed because it depends on one or more records that were required but not found. No record was found for an update.","metadata":{"metadata":{"clientVersion":"7.8.0","code":"P2025","environment":"test","meta":{"modelName":"Certificate","operation":"an update"},"name":"PrismaClientKnownRequestError","service":"web3-student-lab-backend","stack":"PrismaClientKnownRequestError: \nInvalid `prisma.certificate.update()` invocation in\n/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/certificates/CertificateService.ts:129:32\n\n 126 const mintResult = await certificateBlockchainService.mintCertificate(metadata);\n 127 \n 128 // Update certificate with blockchain transaction details\n→ 129 await prisma.certificate.update(\nAn operation failed because it depends on one or more records that were required but not found. No record was found for an update.\n at zr.handleRequestError (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/@prisma+client@7.8.0_prisma@7.8.0_@types+react@19.2.15_react-dom@19.2.6_react@19.2.6__r_c0688981f32c309d1de8339543b52172/node_modules/@prisma/client/src/runtime/RequestHandler.ts:237:13)\n at zr.handleAndLogRequestError (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/@prisma+client@7.8.0_prisma@7.8.0_@types+react@19.2.15_react-dom@19.2.6_react@19.2.6__r_c0688981f32c309d1de8339543b52172/node_modules/@prisma/client/src/runtime/RequestHandler.ts:183:12)\n at zr.request (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/@prisma+client@7.8.0_prisma@7.8.0_@types+react@19.2.15_react-dom@19.2.6_react@19.2.6__r_c0688981f32c309d1de8339543b52172/node_modules/@prisma/client/src/runtime/RequestHandler.ts:152:12)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at a (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/@prisma+client@7.8.0_prisma@7.8.0_@types+react@19.2.15_react-dom@19.2.6_react@19.2.6__r_c0688981f32c309d1de8339543b52172/node_modules/@prisma/client/src/runtime/getPrismaClient.ts:963:24)\n at CertificateService.mintCertificate (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/certificates/CertificateService.ts:129:7)\n at CertificateController.mintCertificate (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/certificates/certificates.controller.ts:181:22)"}},"timestamp":"2026-06-24 12:53:38.460"} +{"level":"error","message":"Mint certificate error: \nInvalid `prisma.certificate.update()` invocation in\n/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/certificates/CertificateService.ts:153:32\n\n 150 });\n 151 } catch (error) {\n 152 logger.error(`Certificate issuance failed for ${certificateId}:`, error);\n→ 153 await prisma.certificate.update(\nAn operation failed because it depends on one or more records that were required but not found. No record was found for an update.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:38.474"} +{"level":"error","message":"Mint certificate error: Student with ID api-student-123 not found","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:38.561"} +{"level":"error","message":"Mint certificate error: Student with ID api-student-123 not found","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:38.576"} +{"level":"error","message":"Mint certificate error: Student with ID api-student-123 not found","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:38.621"} +{"level":"error","message":"Mint certificate error: Student with ID api-student-123 not found","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:38.653"} +{"level":"error","message":"Mint certificate error: Student with ID api-student-123 not found","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:38.673"} +{"level":"error","message":"Mint certificate error: Student with ID api-student-123 not found","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:38.697"} +{"level":"error","message":"Mint certificate error: Student with ID api-student-123 not found","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:38.723"} +{"level":"error","message":"Mint certificate error: Student with ID api-student-123 not found","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:38.908"} +{"level":"error","message":"Mint certificate error: Student with ID api-student-123 not found","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:38.935"} +{"level":"error","message":"Mint certificate error: Student with ID api-student-123 not found","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:39.112"} +{"level":"error","message":"Redis ping failed: Stream isn't writeable and enableOfflineQueue options is false","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Stream isn't writeable and enableOfflineQueue options is false\n at EventEmitter.sendCommand (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Redis.js:376:32)\n at EventEmitter.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/utils/Commander.js:90:25)\n at RedisClient.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:94:40)\n at RedisClient.connect (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:83:18)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/cache-distributed.test.ts:11:23)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusHook (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:980:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:804:7)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 12:53:44.016"} +{"correlationId":"2b74e08f-df50-41a3-9c11-e0e030b4cb86","level":"error","message":"Request completed","metadata":{"metadata":{"duration":"0ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":500,"url":"/api/test"}},"timestamp":"2026-06-24 12:53:45.396"} +{"correlationId":"7173012a-37fb-41eb-b6b3-12cd3c951223","level":"error","message":"Request completed","metadata":{"metadata":{"duration":"0ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":500,"url":"/api/test"}},"timestamp":"2026-06-24 12:53:45.465"} +{"correlationId":"test-correlation-id-123","level":"error","message":"Test error message Test error","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Test error\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/logger.test.ts:96:25)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 12:53:46.436"} +{"correlationId":"test-correlation-id-123","level":"error","message":"Error message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:46.469"} +{"level":"error","message":"Redis ping failed: Stream isn't writeable and enableOfflineQueue options is false","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Stream isn't writeable and enableOfflineQueue options is false\n at EventEmitter.sendCommand (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Redis.js:376:32)\n at EventEmitter.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/utils/Commander.js:90:25)\n at RedisClient.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:94:40)\n at RedisClient.connect (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:83:18)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/cache.test.ts:7:23)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusHook (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:980:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:804:7)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 12:53:45.958"} diff --git a/backend/logs/error.log b/backend/logs/error.log index 01b672be..5f4cb594 100644 --- a/backend/logs/error.log +++ b/backend/logs/error.log @@ -180,3 +180,239 @@ {"level":"error","message":"Redis ping failed: Stream isn't writeable and enableOfflineQueue options is false","metadata":{"metadata":{"environment":"development","service":"web3-student-lab-backend","stack":"Error: Stream isn't writeable and enableOfflineQueue options is false\n at EventEmitter.sendCommand (/home/knights/Documents/Drips Miantainer Project/Web3-Student-Lab/backend/node_modules/ioredis/built/Redis.js:376:32)\n at EventEmitter.ping (/home/knights/Documents/Drips Miantainer Project/Web3-Student-Lab/backend/node_modules/ioredis/built/utils/Commander.js:90:25)\n at RedisClient.ping (/home/knights/Documents/Drips Miantainer Project/Web3-Student-Lab/backend/src/cache/RedisClient.ts:94:40)\n at RedisClient.connect (/home/knights/Documents/Drips Miantainer Project/Web3-Student-Lab/backend/src/cache/RedisClient.ts:83:18)\n at (/home/knights/Documents/Drips Miantainer Project/Web3-Student-Lab/backend/src/index.ts:47:15)\n at ModuleJob.run (node:internal/modules/esm/module_job:345:25)\n at async onImport.tracePromise.__proto__ (node:internal/modules/esm/loader:665:26)\n at async asyncRunEntryPointWithESMLoader (node:internal/modules/run_main:117:5)"}},"timestamp":"2026-06-07 16:38:44.182"} {"level":"error","message":"Redis ping failed: Stream isn't writeable and enableOfflineQueue options is false","metadata":{"metadata":{"environment":"development","service":"web3-student-lab-backend","stack":"Error: Stream isn't writeable and enableOfflineQueue options is false\n at EventEmitter.sendCommand (/home/knights/Documents/Drips Miantainer Project/Web3-Student-Lab/backend/node_modules/ioredis/built/Redis.js:376:32)\n at EventEmitter.ping (/home/knights/Documents/Drips Miantainer Project/Web3-Student-Lab/backend/node_modules/ioredis/built/utils/Commander.js:90:25)\n at RedisClient.ping (/home/knights/Documents/Drips Miantainer Project/Web3-Student-Lab/backend/src/cache/RedisClient.ts:94:40)\n at RedisClient.connect (/home/knights/Documents/Drips Miantainer Project/Web3-Student-Lab/backend/src/cache/RedisClient.ts:83:18)\n at (/home/knights/Documents/Drips Miantainer Project/Web3-Student-Lab/backend/src/index.ts:47:15)\n at ModuleJob.run (node:internal/modules/esm/module_job:345:25)\n at async onImport.tracePromise.__proto__ (node:internal/modules/esm/loader:665:26)\n at async asyncRunEntryPointWithESMLoader (node:internal/modules/run_main:117:5)"}},"timestamp":"2026-06-07 16:38:57.098"} {"level":"error","message":"Redis ping failed: Stream isn't writeable and enableOfflineQueue options is false","metadata":{"metadata":{"environment":"development","service":"web3-student-lab-backend","stack":"Error: Stream isn't writeable and enableOfflineQueue options is false\n at EventEmitter.sendCommand (/home/knights/Documents/Drips Miantainer Project/Web3-Student-Lab/backend/node_modules/ioredis/built/Redis.js:376:32)\n at EventEmitter.ping (/home/knights/Documents/Drips Miantainer Project/Web3-Student-Lab/backend/node_modules/ioredis/built/utils/Commander.js:90:25)\n at RedisClient.ping (/home/knights/Documents/Drips Miantainer Project/Web3-Student-Lab/backend/src/cache/RedisClient.ts:94:40)\n at RedisClient.connect (/home/knights/Documents/Drips Miantainer Project/Web3-Student-Lab/backend/src/cache/RedisClient.ts:83:18)\n at (/home/knights/Documents/Drips Miantainer Project/Web3-Student-Lab/backend/src/index.ts:47:15)\n at ModuleJob.run (node:internal/modules/esm/module_job:345:25)\n at async onImport.tracePromise.__proto__ (node:internal/modules/esm/loader:665:26)\n at async asyncRunEntryPointWithESMLoader (node:internal/modules/run_main:117:5)"}},"timestamp":"2026-06-07 22:50:26.146"} +{"correlationId":"f47af035-26d6-4d15-92be-b662d2c30fce","level":"error","message":"Request completed","metadata":{"metadata":{"duration":"1ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":500,"url":"/api/test"}},"timestamp":"2026-06-24 11:24:41.509"} +{"correlationId":"1866e880-69d5-4d76-aa01-d59ec2455605","level":"error","message":"Request completed","metadata":{"metadata":{"duration":"2ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":500,"url":"/api/test"}},"timestamp":"2026-06-24 11:24:41.583"} +{"level":"error","message":"Redis ping failed: Stream isn't writeable and enableOfflineQueue options is false","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Stream isn't writeable and enableOfflineQueue options is false\n at EventEmitter.sendCommand (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Redis.js:376:32)\n at EventEmitter.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/utils/Commander.js:90:25)\n at RedisClient.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:94:40)\n at RedisClient.connect (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:83:18)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/cache-distributed.test.ts:11:23)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusHook (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:980:40)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:804:7)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:24:43.145"} +{"correlationId":"test-correlation-id-123","level":"error","message":"Test error message Test error","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Test error\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/logger.test.ts:96:25)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:24:43.814"} +{"correlationId":"test-correlation-id-123","level":"error","message":"Error message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:43.844"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: DATABASE_URL\nDescription: PostgreSQL connection string for database connectivity\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:44.018"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:44.035"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"short\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:44.038"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"short\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:44.040"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"your-secret-key-change-in-production\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:44.044"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"your-secret-key-change-in-production\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:44.046"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: DATABASE_URL\nDescription: PostgreSQL connection string for database connectivity\nCurrent value: \"invalid-url-format\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:44.049"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: DATABASE_URL\nDescription: PostgreSQL connection string for database connectivity\nCurrent value: \"invalid-url-format\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:44.051"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: STELLAR_ISSUER_SECRET_KEY\nDescription: Stellar secret key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nMissing required environment variable: STELLAR_ISSUER_PUBLIC_KEY\nDescription: Stellar public key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:44.053"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: STELLAR_ISSUER_SECRET_KEY\nDescription: Stellar secret key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nMissing required environment variable: STELLAR_ISSUER_PUBLIC_KEY\nDescription: Stellar public key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:44.059"} +{"level":"error","message":"DB health check failed","metadata":{"metadata":{"environment":"test","error":"database unavailable","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:24:47.320"} +{"level":"error","message":"Redis ping failed: Stream isn't writeable and enableOfflineQueue options is false","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Stream isn't writeable and enableOfflineQueue options is false\n at EventEmitter.sendCommand (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Redis.js:376:32)\n at EventEmitter.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/utils/Commander.js:90:25)\n at RedisClient.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:94:40)\n at RedisClient.connect (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:83:18)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/cache.test.ts:7:23)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusHook (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:980:40)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:804:7)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:24:48.159"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1011","meta":{"driverAdapterError":{"cause":{"kind":"TlsConnectionError","reason":"The server does not support SSL connections"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:22.526"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1011","meta":{"driverAdapterError":{"cause":{"kind":"TlsConnectionError","reason":"The server does not support SSL connections"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:22.585"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1011","meta":{"driverAdapterError":{"cause":{"kind":"TlsConnectionError","reason":"The server does not support SSL connections"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:22.616"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1011","meta":{"driverAdapterError":{"cause":{"kind":"TlsConnectionError","reason":"The server does not support SSL connections"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:22.627"} +{"level":"error","message":"Redis ping failed: Stream isn't writeable and enableOfflineQueue options is false","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Stream isn't writeable and enableOfflineQueue options is false\n at EventEmitter.sendCommand (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Redis.js:376:32)\n at EventEmitter.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/utils/Commander.js:90:25)\n at RedisClient.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:94:40)\n at RedisClient.connect (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:83:18)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/cache-distributed.test.ts:11:23)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusHook (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:980:40)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:804:7)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:25:47.837"} +{"correlationId":"547b95c3-fc76-4382-b3eb-2cd6d938efa1","level":"error","message":"Request completed","metadata":{"metadata":{"duration":"1ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":500,"url":"/api/test"}},"timestamp":"2026-06-24 11:25:49.138"} +{"correlationId":"934e3539-afb2-4d5d-8a5c-0bc2ae167dc0","level":"error","message":"Request completed","metadata":{"metadata":{"duration":"1ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":500,"url":"/api/test"}},"timestamp":"2026-06-24 11:25:49.196"} +{"correlationId":"test-correlation-id-123","level":"error","message":"Test error message Test error","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Test error\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/logger.test.ts:96:25)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:25:49.483"} +{"correlationId":"test-correlation-id-123","level":"error","message":"Error message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:49.507"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: DATABASE_URL\nDescription: PostgreSQL connection string for database connectivity\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:49.616"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:49.634"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"short\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:49.637"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"short\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:49.639"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"your-secret-key-change-in-production\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:49.642"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"your-secret-key-change-in-production\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:49.643"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: DATABASE_URL\nDescription: PostgreSQL connection string for database connectivity\nCurrent value: \"invalid-url-format\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:49.648"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: DATABASE_URL\nDescription: PostgreSQL connection string for database connectivity\nCurrent value: \"invalid-url-format\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:49.650"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: STELLAR_ISSUER_SECRET_KEY\nDescription: Stellar secret key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nMissing required environment variable: STELLAR_ISSUER_PUBLIC_KEY\nDescription: Stellar public key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:49.656"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: STELLAR_ISSUER_SECRET_KEY\nDescription: Stellar secret key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nMissing required environment variable: STELLAR_ISSUER_PUBLIC_KEY\nDescription: Stellar public key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:49.658"} +{"level":"error","message":"Redis ping failed: Stream isn't writeable and enableOfflineQueue options is false","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Stream isn't writeable and enableOfflineQueue options is false\n at EventEmitter.sendCommand (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Redis.js:376:32)\n at EventEmitter.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/utils/Commander.js:90:25)\n at RedisClient.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:94:40)\n at RedisClient.connect (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:83:18)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/cache.test.ts:7:23)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusHook (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:980:40)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:804:7)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:25:50.355"} +{"level":"error","message":"DB health check failed","metadata":{"metadata":{"environment":"test","error":"database unavailable","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:25:50.754"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1000","meta":{"driverAdapterError":{"cause":{"kind":"AuthenticationFailed","originalCode":"28P01","originalMessage":"password authentication failed for user \"dummy\"","user":"dummy"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:45.113"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1000","meta":{"driverAdapterError":{"cause":{"kind":"AuthenticationFailed","originalCode":"28P01","originalMessage":"password authentication failed for user \"dummy\"","user":"dummy"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:45.184"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1000","meta":{"driverAdapterError":{"cause":{"kind":"AuthenticationFailed","originalCode":"28P01","originalMessage":"password authentication failed for user \"dummy\"","user":"dummy"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:45.225"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1000","meta":{"driverAdapterError":{"cause":{"kind":"AuthenticationFailed","originalCode":"28P01","originalMessage":"password authentication failed for user \"dummy\"","user":"dummy"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:35:45.252"} +{"level":"error","message":"Redis ping failed: Stream isn't writeable and enableOfflineQueue options is false","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Stream isn't writeable and enableOfflineQueue options is false\n at EventEmitter.sendCommand (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Redis.js:376:32)\n at EventEmitter.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/utils/Commander.js:90:25)\n at RedisClient.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:94:40)\n at RedisClient.connect (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:83:18)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/cache-distributed.test.ts:11:23)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusHook (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:980:40)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:804:7)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:36:00.675"} +{"correlationId":"94ee1c3d-049b-442f-a006-ec6c0f9c81dd","level":"error","message":"Request completed","metadata":{"metadata":{"duration":"1ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":500,"url":"/api/test"}},"timestamp":"2026-06-24 11:36:01.964"} +{"correlationId":"d756e1af-b2a9-4c36-842f-1287501d1bea","level":"error","message":"Request completed","metadata":{"metadata":{"duration":"4ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":500,"url":"/api/test"}},"timestamp":"2026-06-24 11:36:02.020"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: DATABASE_URL\nDescription: PostgreSQL connection string for database connectivity\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:02.241"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:02.280"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"short\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:02.287"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"short\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:02.290"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"your-secret-key-change-in-production\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:02.301"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"your-secret-key-change-in-production\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:02.305"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: DATABASE_URL\nDescription: PostgreSQL connection string for database connectivity\nCurrent value: \"invalid-url-format\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:02.311"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: DATABASE_URL\nDescription: PostgreSQL connection string for database connectivity\nCurrent value: \"invalid-url-format\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:02.314"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: STELLAR_ISSUER_SECRET_KEY\nDescription: Stellar secret key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nMissing required environment variable: STELLAR_ISSUER_PUBLIC_KEY\nDescription: Stellar public key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:02.322"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: STELLAR_ISSUER_SECRET_KEY\nDescription: Stellar secret key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nMissing required environment variable: STELLAR_ISSUER_PUBLIC_KEY\nDescription: Stellar public key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:02.326"} +{"correlationId":"test-correlation-id-123","level":"error","message":"Test error message Test error","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Test error\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/logger.test.ts:96:25)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:36:03.068"} +{"correlationId":"test-correlation-id-123","level":"error","message":"Error message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:03.122"} +{"level":"error","message":"Redis ping failed: Stream isn't writeable and enableOfflineQueue options is false","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Stream isn't writeable and enableOfflineQueue options is false\n at EventEmitter.sendCommand (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Redis.js:376:32)\n at EventEmitter.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/utils/Commander.js:90:25)\n at RedisClient.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:94:40)\n at RedisClient.connect (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:83:18)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/cache.test.ts:7:23)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusHook (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:980:40)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:804:7)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:36:04.462"} +{"level":"error","message":"DB health check failed","metadata":{"metadata":{"environment":"test","error":"database unavailable","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:05.269"} +{"level":"error","message":"Mint certificate error: Student with ID non-existent-student not found","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:49.943"} +{"level":"error","message":"Mint certificate error: Course with ID non-existent-course not found","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:49.957"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1000","meta":{"driverAdapterError":{"cause":{"kind":"AuthenticationFailed","originalCode":"28P01","originalMessage":"password authentication failed for user \"dummy\"","user":"dummy"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:54.833"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1000","meta":{"driverAdapterError":{"cause":{"kind":"AuthenticationFailed","originalCode":"28P01","originalMessage":"password authentication failed for user \"dummy\"","user":"dummy"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:54.850"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1000","meta":{"driverAdapterError":{"cause":{"kind":"AuthenticationFailed","originalCode":"28P01","originalMessage":"password authentication failed for user \"dummy\"","user":"dummy"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:54.926"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1000","meta":{"driverAdapterError":{"cause":{"kind":"AuthenticationFailed","originalCode":"28P01","originalMessage":"password authentication failed for user \"dummy\"","user":"dummy"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:36:54.942"} +{"level":"error","message":"Redis ping failed: Stream isn't writeable and enableOfflineQueue options is false","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Stream isn't writeable and enableOfflineQueue options is false\n at EventEmitter.sendCommand (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Redis.js:376:32)\n at EventEmitter.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/utils/Commander.js:90:25)\n at RedisClient.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:94:40)\n at RedisClient.connect (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:83:18)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/cache-distributed.test.ts:11:23)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusHook (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:980:40)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:804:7)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:37:13.748"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: DATABASE_URL\nDescription: PostgreSQL connection string for database connectivity\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:14.641"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:14.658"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"short\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:14.667"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"short\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:14.669"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"your-secret-key-change-in-production\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:14.672"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"your-secret-key-change-in-production\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:14.673"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: DATABASE_URL\nDescription: PostgreSQL connection string for database connectivity\nCurrent value: \"invalid-url-format\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:14.677"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: DATABASE_URL\nDescription: PostgreSQL connection string for database connectivity\nCurrent value: \"invalid-url-format\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:14.680"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: STELLAR_ISSUER_SECRET_KEY\nDescription: Stellar secret key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nMissing required environment variable: STELLAR_ISSUER_PUBLIC_KEY\nDescription: Stellar public key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:14.684"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: STELLAR_ISSUER_SECRET_KEY\nDescription: Stellar secret key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nMissing required environment variable: STELLAR_ISSUER_PUBLIC_KEY\nDescription: Stellar public key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:14.687"} +{"correlationId":"test-correlation-id-123","level":"error","message":"Test error message Test error","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Test error\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/logger.test.ts:96:25)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:37:15.174"} +{"correlationId":"test-correlation-id-123","level":"error","message":"Error message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:15.225"} +{"correlationId":"f6031a68-cd49-4045-8bf3-7a228c1cd039","level":"error","message":"Request completed","metadata":{"metadata":{"duration":"1ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":500,"url":"/api/test"}},"timestamp":"2026-06-24 11:37:15.692"} +{"correlationId":"614b98ac-52b5-4069-8ee6-08205e275603","level":"error","message":"Request completed","metadata":{"metadata":{"duration":"2ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":500,"url":"/api/test"}},"timestamp":"2026-06-24 11:37:15.748"} +{"level":"error","message":"Redis ping failed: Stream isn't writeable and enableOfflineQueue options is false","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Stream isn't writeable and enableOfflineQueue options is false\n at EventEmitter.sendCommand (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Redis.js:376:32)\n at EventEmitter.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/utils/Commander.js:90:25)\n at RedisClient.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:94:40)\n at RedisClient.connect (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:83:18)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/cache.test.ts:7:23)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusHook (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:980:40)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:804:7)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7)"}},"timestamp":"2026-06-24 11:37:15.960"} +{"level":"error","message":"DB health check failed","metadata":{"metadata":{"environment":"test","error":"database unavailable","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:37:17.068"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1000","meta":{"driverAdapterError":{"cause":{"kind":"AuthenticationFailed","originalCode":"28P01","originalMessage":"password authentication failed for user \"dummy\"","user":"dummy"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:40:56.001"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1000","meta":{"driverAdapterError":{"cause":{"kind":"AuthenticationFailed","originalCode":"28P01","originalMessage":"password authentication failed for user \"dummy\"","user":"dummy"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:40:56.111"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1000","meta":{"driverAdapterError":{"cause":{"kind":"AuthenticationFailed","originalCode":"28P01","originalMessage":"password authentication failed for user \"dummy\"","user":"dummy"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:40:56.158"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1000","meta":{"driverAdapterError":{"cause":{"kind":"AuthenticationFailed","originalCode":"28P01","originalMessage":"password authentication failed for user \"dummy\"","user":"dummy"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:40:56.218"} +{"level":"error","message":"Mint certificate error: Student with ID non-existent-student not found","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:05.950"} +{"level":"error","message":"Mint certificate error: Course with ID non-existent-course not found","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:05.980"} +{"level":"error","message":"Redis ping failed: Stream isn't writeable and enableOfflineQueue options is false","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Stream isn't writeable and enableOfflineQueue options is false\n at EventEmitter.sendCommand (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Redis.js:376:32)\n at EventEmitter.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/utils/Commander.js:90:25)\n at RedisClient.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:94:40)\n at RedisClient.connect (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:83:18)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/cache-distributed.test.ts:11:23)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusHook (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:980:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:804:7)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 11:41:06.718"} +{"correlationId":"dc1f73e5-0d9d-4964-a76d-e92e808b1fd3","level":"error","message":"Request completed","metadata":{"metadata":{"duration":"2ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":500,"url":"/api/test"}},"timestamp":"2026-06-24 11:41:08.207"} +{"correlationId":"5be7a4fc-ce3c-4a27-89b6-f51f8ef0287e","level":"error","message":"Request completed","metadata":{"metadata":{"duration":"3ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":500,"url":"/api/test"}},"timestamp":"2026-06-24 11:41:08.381"} +{"correlationId":"test-correlation-id-123","level":"error","message":"Test error message Test error","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Test error\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/logger.test.ts:96:25)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 11:41:08.540"} +{"correlationId":"test-correlation-id-123","level":"error","message":"Error message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.614"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: DATABASE_URL\nDescription: PostgreSQL connection string for database connectivity\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.889"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.951"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"short\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.957"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"short\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.961"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"your-secret-key-change-in-production\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.967"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"your-secret-key-change-in-production\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:08.988"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: DATABASE_URL\nDescription: PostgreSQL connection string for database connectivity\nCurrent value: \"invalid-url-format\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:09.001"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: DATABASE_URL\nDescription: PostgreSQL connection string for database connectivity\nCurrent value: \"invalid-url-format\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:09.006"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: STELLAR_ISSUER_SECRET_KEY\nDescription: Stellar secret key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nMissing required environment variable: STELLAR_ISSUER_PUBLIC_KEY\nDescription: Stellar public key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:09.011"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: STELLAR_ISSUER_SECRET_KEY\nDescription: Stellar secret key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nMissing required environment variable: STELLAR_ISSUER_PUBLIC_KEY\nDescription: Stellar public key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:09.015"} +{"level":"error","message":"Redis ping failed: Stream isn't writeable and enableOfflineQueue options is false","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Stream isn't writeable and enableOfflineQueue options is false\n at EventEmitter.sendCommand (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Redis.js:376:32)\n at EventEmitter.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/utils/Commander.js:90:25)\n at RedisClient.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:94:40)\n at RedisClient.connect (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:83:18)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/cache.test.ts:7:23)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusHook (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:980:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:804:7)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 11:41:08.800"} +{"level":"error","message":"DB health check failed","metadata":{"metadata":{"environment":"test","error":"database unavailable","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:41:09.877"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1000","meta":{"driverAdapterError":{"cause":{"kind":"AuthenticationFailed","originalCode":"28P01","originalMessage":"password authentication failed for user \"dummy\"","user":"dummy"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:12.967"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1000","meta":{"driverAdapterError":{"cause":{"kind":"AuthenticationFailed","originalCode":"28P01","originalMessage":"password authentication failed for user \"dummy\"","user":"dummy"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:13.047"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1000","meta":{"driverAdapterError":{"cause":{"kind":"AuthenticationFailed","originalCode":"28P01","originalMessage":"password authentication failed for user \"dummy\"","user":"dummy"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:13.104"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1000","meta":{"driverAdapterError":{"cause":{"kind":"AuthenticationFailed","originalCode":"28P01","originalMessage":"password authentication failed for user \"dummy\"","user":"dummy"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:13.149"} +{"level":"error","message":"Mint certificate error: Student with ID non-existent-student not found","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:20.444"} +{"level":"error","message":"Mint certificate error: Course with ID non-existent-course not found","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:20.481"} +{"level":"error","message":"Redis ping failed: Stream isn't writeable and enableOfflineQueue options is false","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Stream isn't writeable and enableOfflineQueue options is false\n at EventEmitter.sendCommand (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Redis.js:376:32)\n at EventEmitter.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/utils/Commander.js:90:25)\n at RedisClient.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:94:40)\n at RedisClient.connect (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:83:18)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/cache-distributed.test.ts:11:23)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusHook (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:980:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:804:7)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 11:42:22.418"} +{"correlationId":"1e408580-1435-4ac8-834c-dacd0ba84642","level":"error","message":"Request completed","metadata":{"metadata":{"duration":"29ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":500,"url":"/api/test"}},"timestamp":"2026-06-24 11:42:23.672"} +{"correlationId":"3c091ae1-54de-4f9c-bd87-1edc5403f9d0","level":"error","message":"Request completed","metadata":{"metadata":{"duration":"5ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":500,"url":"/api/test"}},"timestamp":"2026-06-24 11:42:23.795"} +{"correlationId":"test-correlation-id-123","level":"error","message":"Test error message Test error","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Test error\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/logger.test.ts:96:25)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 11:42:24.827"} +{"correlationId":"test-correlation-id-123","level":"error","message":"Error message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:24.883"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: DATABASE_URL\nDescription: PostgreSQL connection string for database connectivity\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:24.960"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:25.067"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"short\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:25.073"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"short\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:25.078"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"your-secret-key-change-in-production\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:25.087"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"your-secret-key-change-in-production\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:25.092"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: DATABASE_URL\nDescription: PostgreSQL connection string for database connectivity\nCurrent value: \"invalid-url-format\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:25.107"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: DATABASE_URL\nDescription: PostgreSQL connection string for database connectivity\nCurrent value: \"invalid-url-format\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:25.121"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: STELLAR_ISSUER_SECRET_KEY\nDescription: Stellar secret key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nMissing required environment variable: STELLAR_ISSUER_PUBLIC_KEY\nDescription: Stellar public key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:25.129"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: STELLAR_ISSUER_SECRET_KEY\nDescription: Stellar secret key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nMissing required environment variable: STELLAR_ISSUER_PUBLIC_KEY\nDescription: Stellar public key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:25.134"} +{"level":"error","message":"DB health check failed","metadata":{"metadata":{"environment":"test","error":"database unavailable","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:42:26.067"} +{"level":"error","message":"Redis ping failed: Stream isn't writeable and enableOfflineQueue options is false","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Stream isn't writeable and enableOfflineQueue options is false\n at EventEmitter.sendCommand (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Redis.js:376:32)\n at EventEmitter.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/utils/Commander.js:90:25)\n at RedisClient.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:94:40)\n at RedisClient.connect (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:83:18)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/cache.test.ts:7:23)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusHook (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:980:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:804:7)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 11:42:25.944"} +{"level":"error","message":"Mint certificate error: Student with ID non-existent-student not found","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:08.182"} +{"level":"error","message":"Mint certificate error: Course with ID non-existent-course not found","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:44:08.200"} +{"level":"error","message":"Mint certificate error: Student with ID non-existent-student not found","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:28.707"} +{"level":"error","message":"Mint certificate error: Course with ID non-existent-course not found","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:45:28.726"} +{"correlationId":"6c4c6300-3d36-406c-8044-c019063d08fc","level":"error","message":"Request completed","metadata":{"metadata":{"duration":"2ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":500,"url":"/api/test"}},"timestamp":"2026-06-24 11:48:40.782"} +{"correlationId":"635c23e0-dbed-488b-a5af-3657671476ad","level":"error","message":"Request completed","metadata":{"metadata":{"duration":"2ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":500,"url":"/api/test"}},"timestamp":"2026-06-24 11:48:40.945"} +{"correlationId":"test-correlation-id-123","level":"error","message":"Test error message Test error","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Test error\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/logger.test.ts:96:25)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 11:48:43.121"} +{"correlationId":"test-correlation-id-123","level":"error","message":"Error message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:43.208"} +{"level":"error","message":"Redis ping failed: Stream isn't writeable and enableOfflineQueue options is false","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Stream isn't writeable and enableOfflineQueue options is false\n at EventEmitter.sendCommand (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Redis.js:376:32)\n at EventEmitter.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/utils/Commander.js:90:25)\n at RedisClient.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:94:40)\n at RedisClient.connect (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:83:18)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/cache-distributed.test.ts:11:23)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusHook (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:980:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:804:7)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 11:48:43.409"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: DATABASE_URL\nDescription: PostgreSQL connection string for database connectivity\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:43.609"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:43.657"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"short\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:43.662"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"short\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:43.672"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"your-secret-key-change-in-production\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:43.677"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"your-secret-key-change-in-production\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:43.685"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: DATABASE_URL\nDescription: PostgreSQL connection string for database connectivity\nCurrent value: \"invalid-url-format\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:43.691"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: DATABASE_URL\nDescription: PostgreSQL connection string for database connectivity\nCurrent value: \"invalid-url-format\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:43.695"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: STELLAR_ISSUER_SECRET_KEY\nDescription: Stellar secret key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nMissing required environment variable: STELLAR_ISSUER_PUBLIC_KEY\nDescription: Stellar public key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:43.701"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: STELLAR_ISSUER_SECRET_KEY\nDescription: Stellar secret key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nMissing required environment variable: STELLAR_ISSUER_PUBLIC_KEY\nDescription: Stellar public key for certificate issuance (production only)\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:43.719"} +{"level":"error","message":"Mint certificate error: Student with ID non-existent-student not found","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:52.801"} +{"level":"error","message":"Mint certificate error: Course with ID non-existent-course not found","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:52.868"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1000","meta":{"driverAdapterError":{"cause":{"kind":"AuthenticationFailed","originalCode":"28P01","originalMessage":"password authentication failed for user \"dummy\"","user":"dummy"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:53.006"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1000","meta":{"driverAdapterError":{"cause":{"kind":"AuthenticationFailed","originalCode":"28P01","originalMessage":"password authentication failed for user \"dummy\"","user":"dummy"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:53.088"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1000","meta":{"driverAdapterError":{"cause":{"kind":"AuthenticationFailed","originalCode":"28P01","originalMessage":"password authentication failed for user \"dummy\"","user":"dummy"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:53.277"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1000","meta":{"driverAdapterError":{"cause":{"kind":"AuthenticationFailed","originalCode":"28P01","originalMessage":"password authentication failed for user \"dummy\"","user":"dummy"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:53.331"} +{"level":"error","message":"DB health check failed","metadata":{"metadata":{"environment":"test","error":"database unavailable","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:48:53.385"} +{"level":"error","message":"Redis ping failed: Stream isn't writeable and enableOfflineQueue options is false","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Stream isn't writeable and enableOfflineQueue options is false\n at EventEmitter.sendCommand (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Redis.js:376:32)\n at EventEmitter.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/utils/Commander.js:90:25)\n at RedisClient.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:94:40)\n at RedisClient.connect (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:83:18)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/cache.test.ts:7:23)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusHook (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:980:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:804:7)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 11:48:53.948"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1000","meta":{"driverAdapterError":{"cause":{"kind":"AuthenticationFailed","originalCode":"28P01","originalMessage":"password authentication failed for user \"dummy\"","user":"dummy"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:49:12.187"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1000","meta":{"driverAdapterError":{"cause":{"kind":"AuthenticationFailed","originalCode":"28P01","originalMessage":"password authentication failed for user \"dummy\"","user":"dummy"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:49:12.223"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1000","meta":{"driverAdapterError":{"cause":{"kind":"AuthenticationFailed","originalCode":"28P01","originalMessage":"password authentication failed for user \"dummy\"","user":"dummy"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:49:12.268"} +{"level":"error","message":"Failed to create audit log:","metadata":{"metadata":{"environment":"test","error":{"clientVersion":"7.8.0","code":"P1000","meta":{"driverAdapterError":{"cause":{"kind":"AuthenticationFailed","originalCode":"28P01","originalMessage":"password authentication failed for user \"dummy\"","user":"dummy"},"name":"DriverAdapterError"},"modelName":"AuditLog"},"name":"PrismaClientKnownRequestError"},"service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 11:49:12.321"} +{"level":"error","message":"[Metrics] Error recorded: ValidationError — Invalid email","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:50:19.714"} +{"level":"error","message":"[Metrics] Error recorded: UnhandledRejection — Promise rejected","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:50:19.771"} +{"level":"error","message":"[Metrics] Error recorded: TypeError — Cannot read property","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:50:19.804"} +{"level":"error","message":"[Metrics] Error recorded: DBError — Connection refused","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:50:19.855"} +{"level":"error","message":"[Metrics] Error recorded: ValidationError — bad input","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:50:20.049"} +{"level":"error","message":"[Metrics] Error recorded: ValidationError — bad input 2","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:50:20.090"} +{"level":"error","message":"[Metrics] Error recorded: DBError — timeout","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:50:20.133"} +{"level":"error","message":"[Metrics] Error recorded: Error — oops","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:50:20.216"} +{"level":"error","message":"[Metrics] Error recorded: Error — msg-0","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:50:20.240"} +{"level":"error","message":"[Metrics] Error recorded: Error — msg-1","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:50:20.246"} +{"level":"error","message":"[Metrics] Error recorded: Error — msg-2","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:50:20.252"} +{"level":"error","message":"[Metrics] Error recorded: Error — msg-3","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:50:20.259"} +{"level":"error","message":"[Metrics] Error recorded: Error — msg-4","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:50:20.322"} +{"level":"error","message":"[Metrics] Error recorded: Error — msg-5","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:50:20.331"} +{"level":"error","message":"[Metrics] Error recorded: ValidationError — bad input","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:50:20.878"} +{"level":"error","message":"[Metrics] Error recorded: Error — oops","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:50:21.110"} +{"level":"error","message":"Redis ping failed: Stream isn't writeable and enableOfflineQueue options is false","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Stream isn't writeable and enableOfflineQueue options is false\n at EventEmitter.sendCommand (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Redis.js:376:32)\n at EventEmitter.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/utils/Commander.js:90:25)\n at RedisClient.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:94:40)\n at RedisClient.connect (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:83:18)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/cache-distributed.test.ts:11:23)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusHook (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:980:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:804:7)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 12:50:29.706"} +{"level":"error","message":"Cache get error for key courses:list: Stream isn't writeable and enableOfflineQueue options is false","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Stream isn't writeable and enableOfflineQueue options is false\n at EventEmitter.sendCommand (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Redis.js:376:32)\n at execPipeline (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Pipeline.js:348:25)\n at Pipeline.exec (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Pipeline.js:291:5)\n at Immediate.executeAutoPipeline (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/autoPipelining.js:53:14)\n at processImmediate (node:internal/timers:487:21)\n at process.callbackTrampoline (node:internal/async_hooks:130:17)"}},"timestamp":"2026-06-24 12:50:30.032"} +{"level":"error","message":"Cache get error for key leaderboard:global: Stream isn't writeable and enableOfflineQueue options is false","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Stream isn't writeable and enableOfflineQueue options is false\n at EventEmitter.sendCommand (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Redis.js:376:32)\n at execPipeline (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Pipeline.js:348:25)\n at Pipeline.exec (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Pipeline.js:291:5)\n at Immediate.executeAutoPipeline (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/autoPipelining.js:53:14)\n at processImmediate (node:internal/timers:487:21)\n at process.callbackTrampoline (node:internal/async_hooks:130:17)"}},"timestamp":"2026-06-24 12:50:30.056"} +{"level":"error","message":"Cache get error for key leaderboard:weekly: Stream isn't writeable and enableOfflineQueue options is false","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Stream isn't writeable and enableOfflineQueue options is false\n at EventEmitter.sendCommand (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Redis.js:376:32)\n at execPipeline (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Pipeline.js:348:25)\n at Pipeline.exec (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Pipeline.js:291:5)\n at Immediate.executeAutoPipeline (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/autoPipelining.js:53:14)\n at processImmediate (node:internal/timers:487:21)\n at process.callbackTrampoline (node:internal/async_hooks:130:17)"}},"timestamp":"2026-06-24 12:50:30.143"} +{"correlationId":"6ac1c9c1-b881-487d-995c-80f35e20a0e0","level":"error","message":"Request completed","metadata":{"metadata":{"duration":"1ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":500,"url":"/api/test"}},"timestamp":"2026-06-24 12:50:32.662"} +{"correlationId":"test-correlation-id-123","level":"error","message":"Test error message Test error","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Test error\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/logger.test.ts:96:25)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 12:50:36.163"} +{"correlationId":"759465f9-ea33-491d-9078-18151d9b551a","level":"error","message":"Request completed","metadata":{"metadata":{"duration":"1ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":500,"url":"/api/test"}},"timestamp":"2026-06-24 12:50:33.123"} +{"correlationId":"test-correlation-id-123","level":"error","message":"Error message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:50:36.343"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: DATABASE_URL\nDescription: PostgreSQL connection string for database connectivity\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:50:38.243"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:50:38.415"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"short\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:50:38.426"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"short\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:50:38.436"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"your-secret-key-change-in-production\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:50:38.469"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"your-secret-key-change-in-production\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:50:38.507"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: DATABASE_URL\nDescription: PostgreSQL connection string for database connectivity\nCurrent value: \"invalid-url-format\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:50:38.522"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: DATABASE_URL\nDescription: PostgreSQL connection string for database connectivity\nCurrent value: \"invalid-url-format\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:50:38.539"} +{"level":"error","message":"Redis ping failed: Stream isn't writeable and enableOfflineQueue options is false","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Stream isn't writeable and enableOfflineQueue options is false\n at EventEmitter.sendCommand (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Redis.js:376:32)\n at EventEmitter.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/utils/Commander.js:90:25)\n at RedisClient.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:94:40)\n at RedisClient.connect (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:83:18)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/cache.test.ts:7:23)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusHook (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:980:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:804:7)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 12:50:41.910"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: DATABASE_URL\nDescription: PostgreSQL connection string for database connectivity\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:27.415"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nMissing required environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nPlease check your .env file and .env.example for guidance.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:27.502"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"short\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:27.509"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"short\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:27.516"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"your-secret-key-change-in-production\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:27.525"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: JWT_SECRET\nDescription: Secret key for JWT token signing and verification\nCurrent value: \"your-secret-key-change-in-production\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:27.529"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: DATABASE_URL\nDescription: PostgreSQL connection string for database connectivity\nCurrent value: \"invalid-url-format\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:27.536"} +{"level":"error","message":"❌ Environment Configuration Error: Environment validation failed:\n\nInvalid value for environment variable: DATABASE_URL\nDescription: PostgreSQL connection string for database connectivity\nCurrent value: \"invalid-url-format\"\nPlease check .env.example for the correct format.\n\nPlease copy .env.example to .env and fill in the required values.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:27.547"} +{"level":"error","message":"[Metrics] Error recorded: ValidationError — Invalid email","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:27.951"} +{"level":"error","message":"[Metrics] Error recorded: UnhandledRejection — Promise rejected","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:27.961"} +{"level":"error","message":"[Metrics] Error recorded: TypeError — Cannot read property","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:27.971"} +{"level":"error","message":"[Metrics] Error recorded: DBError — Connection refused","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:27.979"} +{"level":"error","message":"[Metrics] Error recorded: ValidationError — bad input","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:28.014"} +{"level":"error","message":"[Metrics] Error recorded: ValidationError — bad input 2","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:28.017"} +{"level":"error","message":"[Metrics] Error recorded: DBError — timeout","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:28.020"} +{"level":"error","message":"[Metrics] Error recorded: Error — oops","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:28.081"} +{"level":"error","message":"[Metrics] Error recorded: Error — msg-0","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:28.091"} +{"level":"error","message":"[Metrics] Error recorded: Error — msg-1","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:28.103"} +{"level":"error","message":"[Metrics] Error recorded: Error — msg-2","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:28.106"} +{"level":"error","message":"[Metrics] Error recorded: Error — msg-3","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:28.108"} +{"level":"error","message":"[Metrics] Error recorded: Error — msg-4","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:28.110"} +{"level":"error","message":"[Metrics] Error recorded: Error — msg-5","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:28.112"} +{"level":"error","message":"[Metrics] Error recorded: ValidationError — bad input","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:28.259"} +{"level":"error","message":"[Metrics] Error recorded: Error — oops","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:28.296"} +{"level":"error","message":"Mint certificate error: Student with ID non-existent-student not found","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:35.910"} +{"level":"error","message":"Mint certificate error: Course with ID non-existent-course not found","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:35.943"} +{"level":"error","message":"Certificate issuance failed for cert-api-stud-api-cour-1782302017794: \nInvalid `prisma.certificate.update()` invocation in\n/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/certificates/CertificateService.ts:129:32\n\n 126 const mintResult = await certificateBlockchainService.mintCertificate(metadata);\n 127 \n 128 // Update certificate with blockchain transaction details\n→ 129 await prisma.certificate.update(\nAn operation failed because it depends on one or more records that were required but not found. No record was found for an update.","metadata":{"metadata":{"clientVersion":"7.8.0","code":"P2025","environment":"test","meta":{"modelName":"Certificate","operation":"an update"},"name":"PrismaClientKnownRequestError","service":"web3-student-lab-backend","stack":"PrismaClientKnownRequestError: \nInvalid `prisma.certificate.update()` invocation in\n/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/certificates/CertificateService.ts:129:32\n\n 126 const mintResult = await certificateBlockchainService.mintCertificate(metadata);\n 127 \n 128 // Update certificate with blockchain transaction details\n→ 129 await prisma.certificate.update(\nAn operation failed because it depends on one or more records that were required but not found. No record was found for an update.\n at zr.handleRequestError (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/@prisma+client@7.8.0_prisma@7.8.0_@types+react@19.2.15_react-dom@19.2.6_react@19.2.6__r_c0688981f32c309d1de8339543b52172/node_modules/@prisma/client/src/runtime/RequestHandler.ts:237:13)\n at zr.handleAndLogRequestError (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/@prisma+client@7.8.0_prisma@7.8.0_@types+react@19.2.15_react-dom@19.2.6_react@19.2.6__r_c0688981f32c309d1de8339543b52172/node_modules/@prisma/client/src/runtime/RequestHandler.ts:183:12)\n at zr.request (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/@prisma+client@7.8.0_prisma@7.8.0_@types+react@19.2.15_react-dom@19.2.6_react@19.2.6__r_c0688981f32c309d1de8339543b52172/node_modules/@prisma/client/src/runtime/RequestHandler.ts:152:12)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at a (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/@prisma+client@7.8.0_prisma@7.8.0_@types+react@19.2.15_react-dom@19.2.6_react@19.2.6__r_c0688981f32c309d1de8339543b52172/node_modules/@prisma/client/src/runtime/getPrismaClient.ts:963:24)\n at CertificateService.mintCertificate (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/certificates/CertificateService.ts:129:7)\n at CertificateController.mintCertificate (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/certificates/certificates.controller.ts:181:22)"}},"timestamp":"2026-06-24 12:53:38.459"} +{"level":"error","message":"Mint certificate error: \nInvalid `prisma.certificate.update()` invocation in\n/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/certificates/CertificateService.ts:153:32\n\n 150 });\n 151 } catch (error) {\n 152 logger.error(`Certificate issuance failed for ${certificateId}:`, error);\n→ 153 await prisma.certificate.update(\nAn operation failed because it depends on one or more records that were required but not found. No record was found for an update.","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:38.473"} +{"level":"error","message":"Mint certificate error: Student with ID api-student-123 not found","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:38.549"} +{"level":"error","message":"Mint certificate error: Student with ID api-student-123 not found","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:38.576"} +{"level":"error","message":"Mint certificate error: Student with ID api-student-123 not found","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:38.621"} +{"level":"error","message":"Mint certificate error: Student with ID api-student-123 not found","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:38.644"} +{"level":"error","message":"Mint certificate error: Student with ID api-student-123 not found","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:38.673"} +{"level":"error","message":"Mint certificate error: Student with ID api-student-123 not found","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:38.692"} +{"level":"error","message":"Mint certificate error: Student with ID api-student-123 not found","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:38.716"} +{"level":"error","message":"Mint certificate error: Student with ID api-student-123 not found","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:38.902"} +{"level":"error","message":"Mint certificate error: Student with ID api-student-123 not found","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:38.935"} +{"level":"error","message":"Mint certificate error: Student with ID api-student-123 not found","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:39.112"} +{"level":"error","message":"Redis ping failed: Stream isn't writeable and enableOfflineQueue options is false","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Stream isn't writeable and enableOfflineQueue options is false\n at EventEmitter.sendCommand (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Redis.js:376:32)\n at EventEmitter.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/utils/Commander.js:90:25)\n at RedisClient.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:94:40)\n at RedisClient.connect (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:83:18)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/cache-distributed.test.ts:11:23)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusHook (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:980:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:804:7)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 12:53:44.014"} +{"correlationId":"2b74e08f-df50-41a3-9c11-e0e030b4cb86","level":"error","message":"Request completed","metadata":{"metadata":{"duration":"0ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":500,"url":"/api/test"}},"timestamp":"2026-06-24 12:53:45.395"} +{"correlationId":"7173012a-37fb-41eb-b6b3-12cd3c951223","level":"error","message":"Request completed","metadata":{"metadata":{"duration":"0ms","environment":"test","method":"GET","service":"web3-student-lab-backend","statusCode":500,"url":"/api/test"}},"timestamp":"2026-06-24 12:53:45.464"} +{"correlationId":"test-correlation-id-123","level":"error","message":"Test error message Test error","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Test error\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/logger.test.ts:96:25)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3)\n at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 12:53:46.435"} +{"correlationId":"test-correlation-id-123","level":"error","message":"Error message","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend"}},"timestamp":"2026-06-24 12:53:46.469"} +{"level":"error","message":"Redis ping failed: Stream isn't writeable and enableOfflineQueue options is false","metadata":{"metadata":{"environment":"test","service":"web3-student-lab-backend","stack":"Error: Stream isn't writeable and enableOfflineQueue options is false\n at EventEmitter.sendCommand (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/Redis.js:376:32)\n at EventEmitter.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/ioredis@5.11.0/node_modules/ioredis/built/utils/Commander.js:90:25)\n at RedisClient.ping (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:94:40)\n at RedisClient.connect (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/cache/RedisClient.ts:83:18)\n at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/cache.test.ts:7:23)\n at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28)\n at new Promise ()\n at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10)\n at _callCircusHook (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:980:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:804:7)\n at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11)\n at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3)\n at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21)\n at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19)\n at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:276:16)\n at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:344:7)\n at Object.worker (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/testWorker.js:498:12)"}},"timestamp":"2026-06-24 12:53:45.957"} diff --git a/backend/test_output.log b/backend/test_output.log new file mode 100644 index 00000000..072a3008 --- /dev/null +++ b/backend/test_output.log @@ -0,0 +1,1105 @@ +ts-jest[config] (WARN) + The "ts-jest" config option "isolatedModules" is deprecated and will be removed in v30.0.0. Please use "isolatedModules: true" in /home/knights/Documents/Drips/Web3-Student-Lab/backend/tsconfig.json instead, see https://www.typescriptlang.org/tsconfig/#isolatedModules + + console.log + ◇ injected env (9) from .env.test // tip: ◈ secrets for agents [www.dotenvx.com] + + at _log (node_modules/.pnpm/dotenv@17.4.2/node_modules/dotenv/lib/main.js:131:11) + + console.log + DEBUG getStudentProgress: studentId: student-1 courseId: course-1 + + at getStudentProgress (src/routes/learning/learning.service.ts:216:11) + + console.log + DEBUG getStudentProgress: returned from cache: { + id: 'progress-1', + studentId: 'student-1', + courseId: 'course-1', + completedLessons: [ 'course-1-lesson-1' ], + currentModuleId: 'course-1-module-1', + percentage: 25, + status: 'in_progress', + lastAccessedAt: 2026-06-24T11:29:22.887Z, + completedAt: null, + createdAt: 2026-06-24T11:29:22.887Z, + updatedAt: 2026-06-24T11:29:22.887Z + } + + at getStudentProgress (src/routes/learning/learning.service.ts:222:13) + + console.log + DEBUG getStudentProgress: studentId: student-1 courseId: course-1 + + at getStudentProgress (src/routes/learning/learning.service.ts:216:11) + + console.log + DEBUG getStudentProgress: database findUnique returned: { + id: 'progress-db-1', + studentId: 'student-1', + courseId: 'course-1', + completedLessons: [ 'course-1-lesson-1', 'course-1-lesson-2' ], + currentModuleId: 'course-1-module-1', + percentage: 50, + status: 'in_progress', + lastAccessedAt: 2026-06-24T11:29:22.979Z, + completedAt: null, + createdAt: 2026-06-24T11:29:22.979Z, + updatedAt: 2026-06-24T11:29:22.979Z + } + + at getStudentProgress (src/routes/learning/learning.service.ts:235:13) + + console.log + DEBUG getStudentProgress: returning parsed DB progress: { + id: 'progress-db-1', + studentId: 'student-1', + courseId: 'course-1', + completedLessons: [ 'course-1-lesson-1', 'course-1-lesson-2' ], + currentModuleId: 'course-1-module-1', + percentage: 50, + status: 'in_progress', + lastAccessedAt: 2026-06-24T11:29:22.979Z, + completedAt: null, + createdAt: 2026-06-24T11:29:22.979Z, + updatedAt: 2026-06-24T11:29:22.979Z + } + + at getStudentProgress (src/routes/learning/learning.service.ts:241:15) + + console.log + DEBUG getStudentProgress: studentId: new-student courseId: course-1 + + at getStudentProgress (src/routes/learning/learning.service.ts:216:11) + + console.log + DEBUG getStudentProgress: database findUnique returned: null + + at getStudentProgress (src/routes/learning/learning.service.ts:235:13) + + console.log + DEBUG getStudentProgress: returning initial progress: { + id: 'progress-new-student-course-1', + studentId: 'new-student', + courseId: 'course-1', + completedLessons: [], + currentModuleId: 'course-1-module-1', + percentage: 0, + status: 'not_started', + lastAccessedAt: 2026-06-24T11:29:22.997Z, + completedAt: null, + createdAt: 2026-06-24T11:29:22.997Z, + updatedAt: 2026-06-24T11:29:22.997Z + } + + at getStudentProgress (src/routes/learning/learning.service.ts:272:11) + + console.log + DEBUG getStudentProgress: studentId: student-new courseId: course-1 + + at getStudentProgress (src/routes/learning/learning.service.ts:216:11) + + console.log + DEBUG getStudentProgress: database findUnique returned: null + + at getStudentProgress (src/routes/learning/learning.service.ts:235:13) + + console.log + DEBUG getStudentProgress: returning initial progress: { + id: 'progress-student-new-course-1', + studentId: 'student-new', + courseId: 'course-1', + completedLessons: [], + currentModuleId: 'course-1-module-1', + percentage: 0, + status: 'not_started', + lastAccessedAt: 2026-06-24T11:29:23.009Z, + completedAt: null, + createdAt: 2026-06-24T11:29:23.009Z, + updatedAt: 2026-06-24T11:29:23.009Z + } + + at getStudentProgress (src/routes/learning/learning.service.ts:272:11) + + console.log + DEBUG getStudentProgress: studentId: student-fallback courseId: course-1 + + at getStudentProgress (src/routes/learning/learning.service.ts:216:11) + + console.warn + Database error in getStudentProgress, using mock store: Error: DB Connection failed + at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/progress.unit.test.ts:166:50) + at Promise.finally.completed (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1561:28) + at new Promise () + at callAsyncCircusFn (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1501:10) + at _callCircusTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1011:40) + at _runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:951:3) + at /home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:853:7 + at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:866:11) + at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11) + at _runTestsForDescribeBlock (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:861:11) + at run (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:765:3) + at runAndTransformResultsToJestFormat (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/jestAdapterInit.js:1993:21) + at jestAdapter (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-circus@30.4.2/node_modules/jest-circus/build/runner.js:111:19) + at runTestInternal (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:276:16) + at runTest (/home/knights/Documents/Drips/Web3-Student-Lab/backend/node_modules/.pnpm/jest-runner@30.4.2/node_modules/jest-runner/build/index.js:344:7) + + 243 | } + 244 | } catch (_error) { + > 245 | console.warn('Database error in getStudentProgress, using mock store:', _error); + | ^ + 246 | } + 247 | + 248 | // Fallback to mock store + + at getStudentProgress (src/routes/learning/learning.service.ts:245:13) + at Object. (tests/progress.unit.test.ts:169:22) + + console.log + DEBUG getStudentProgress: returning initial progress: { + id: 'progress-student-fallback-course-1', + studentId: 'student-fallback', + courseId: 'course-1', + completedLessons: [], + currentModuleId: 'course-1-module-1', + percentage: 0, + status: 'not_started', + lastAccessedAt: 2026-06-24T11:29:23.055Z, + completedAt: null, + createdAt: 2026-06-24T11:29:23.055Z, + updatedAt: 2026-06-24T11:29:23.055Z + } + + at getStudentProgress (src/routes/learning/learning.service.ts:272:11) + + console.log + DEBUG getStudentProgress: studentId: cache-test-student courseId: course-1 + + at getStudentProgress (src/routes/learning/learning.service.ts:216:11) + + console.log + DEBUG getStudentProgress: database findUnique returned: { + id: 'progress-1', + studentId: 'cache-test-student', + courseId: 'course-1', + completedLessons: [], + currentModuleId: null, + percentage: 0, + status: 'not_started', + lastAccessedAt: 2026-06-24T11:29:23.059Z, + completedAt: null, + createdAt: 2026-06-24T11:29:23.059Z, + updatedAt: 2026-06-24T11:29:23.059Z + } + + at getStudentProgress (src/routes/learning/learning.service.ts:235:13) + + console.log + DEBUG getStudentProgress: returning parsed DB progress: { + id: 'progress-1', + studentId: 'cache-test-student', + courseId: 'course-1', + completedLessons: [], + currentModuleId: null, + percentage: 0, + status: 'not_started', + lastAccessedAt: 2026-06-24T11:29:23.059Z, + completedAt: null, + createdAt: 2026-06-24T11:29:23.059Z, + updatedAt: 2026-06-24T11:29:23.059Z + } + + at getStudentProgress (src/routes/learning/learning.service.ts:241:15) + + console.log + DEBUG getStudentProgress: studentId: student-A courseId: course-1 + + at getStudentProgress (src/routes/learning/learning.service.ts:216:11) + + console.log + DEBUG getStudentProgress: studentId: student-B courseId: course-1 + + at getStudentProgress (src/routes/learning/learning.service.ts:216:11) + + console.log + DEBUG getStudentProgress: database findUnique returned: null + + at getStudentProgress (src/routes/learning/learning.service.ts:235:13) + at async Promise.all (index 0) + + console.log + DEBUG getStudentProgress: database findUnique returned: null + + at getStudentProgress (src/routes/learning/learning.service.ts:235:13) + at async Promise.all (index 1) + + console.log + DEBUG getStudentProgress: returning initial progress: { + id: 'progress-student-A-course-1', + studentId: 'student-A', + courseId: 'course-1', + completedLessons: [], + currentModuleId: 'course-1-module-1', + percentage: 0, + status: 'not_started', + lastAccessedAt: 2026-06-24T11:29:23.071Z, + completedAt: null, + createdAt: 2026-06-24T11:29:23.071Z, + updatedAt: 2026-06-24T11:29:23.071Z + } + + at getStudentProgress (src/routes/learning/learning.service.ts:272:11) + at async Promise.all (index 0) + + console.log + DEBUG getStudentProgress: returning initial progress: { + id: 'progress-student-B-course-1', + studentId: 'student-B', + courseId: 'course-1', + completedLessons: [], + currentModuleId: 'course-1-module-1', + percentage: 0, + status: 'not_started', + lastAccessedAt: 2026-06-24T11:29:23.072Z, + completedAt: null, + createdAt: 2026-06-24T11:29:23.072Z, + updatedAt: 2026-06-24T11:29:23.072Z + } + + at getStudentProgress (src/routes/learning/learning.service.ts:272:11) + at async Promise.all (index 1) + + console.log + DEBUG getStudentProgress: studentId: student-add courseId: course-1 + + at getStudentProgress (src/routes/learning/learning.service.ts:216:11) + + console.log + DEBUG getStudentProgress: database findUnique returned: null + + at getStudentProgress (src/routes/learning/learning.service.ts:235:13) + + console.log + DEBUG getStudentProgress: returning initial progress: { + id: 'progress-student-add-course-1', + studentId: 'student-add', + courseId: 'course-1', + completedLessons: [], + currentModuleId: 'course-1-module-1', + percentage: 0, + status: 'not_started', + lastAccessedAt: 2026-06-24T11:29:23.095Z, + completedAt: null, + createdAt: 2026-06-24T11:29:23.095Z, + updatedAt: 2026-06-24T11:29:23.095Z + } + + at getStudentProgress (src/routes/learning/learning.service.ts:272:11) + + console.log + DEBUG: studentId: student-add existingProgress: { + id: 'progress-student-add-course-1', + studentId: 'student-add', + courseId: 'course-1', + completedLessons: [], + currentModuleId: 'course-1-module-1', + percentage: 0, + status: 'not_started', + lastAccessedAt: 2026-06-24T11:29:23.095Z, + completedAt: null, + createdAt: 2026-06-24T11:29:23.095Z, + updatedAt: 2026-06-24T11:29:23.095Z + } completedLessonSet: [] + + at updateStudentProgress (src/routes/learning/learning.service.ts:301:11) + + console.error + Error during lesson completion webhook trigger: TypeError: Cannot read properties of undefined (reading 'findUnique') + at updateStudentProgress (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/routes/learning/learning.service.ts:319:46) + at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/progress.unit.test.ts:256:22) + + 361 | } + 362 | } catch (err) { + > 363 | console.error('Error during lesson completion webhook trigger:', err); + | ^ + 364 | } + 365 | } + 366 | completedLessonSet.add(input.lessonId); + + at updateStudentProgress (src/routes/learning/learning.service.ts:363:17) + at Object. (tests/progress.unit.test.ts:256:22) + + console.log + DEBUG getStudentProgress: studentId: student-remove courseId: course-1 + + at getStudentProgress (src/routes/learning/learning.service.ts:216:11) + + console.log + DEBUG getStudentProgress: database findUnique returned: { + id: 'progress-1', + studentId: 'student-add', + courseId: 'course-1', + completedLessons: [], + currentModuleId: 'course-1-module-1', + percentage: 0, + status: 'not_started', + lastAccessedAt: 2026-06-24T11:29:23.092Z, + completedAt: null, + createdAt: 2026-06-24T11:29:23.092Z, + updatedAt: 2026-06-24T11:29:23.092Z + } + + at getStudentProgress (src/routes/learning/learning.service.ts:235:13) + + console.log + DEBUG getStudentProgress: returning parsed DB progress: { + id: 'progress-1', + studentId: 'student-add', + courseId: 'course-1', + completedLessons: [], + currentModuleId: 'course-1-module-1', + percentage: 0, + status: 'not_started', + lastAccessedAt: 2026-06-24T11:29:23.092Z, + completedAt: null, + createdAt: 2026-06-24T11:29:23.092Z, + updatedAt: 2026-06-24T11:29:23.092Z + } + + at getStudentProgress (src/routes/learning/learning.service.ts:241:15) + + console.log + DEBUG: studentId: student-remove existingProgress: { + id: 'progress-1', + studentId: 'student-add', + courseId: 'course-1', + completedLessons: [], + currentModuleId: 'course-1-module-1', + percentage: 0, + status: 'not_started', + lastAccessedAt: 2026-06-24T11:29:23.092Z, + completedAt: null, + createdAt: 2026-06-24T11:29:23.092Z, + updatedAt: 2026-06-24T11:29:23.092Z + } completedLessonSet: [] + + at updateStudentProgress (src/routes/learning/learning.service.ts:301:11) + + console.log + DEBUG getStudentProgress: studentId: student-nodedup courseId: course-1 + + at getStudentProgress (src/routes/learning/learning.service.ts:216:11) + + console.log + DEBUG getStudentProgress: database findUnique returned: { + id: 'progress-1', + studentId: 'student-remove', + courseId: 'course-1', + completedLessons: [ 'course-1-lesson-1' ], + currentModuleId: 'course-1-module-1', + percentage: 25, + status: 'in_progress', + lastAccessedAt: 2026-06-24T11:29:23.106Z, + completedAt: null, + createdAt: 2026-06-24T11:29:23.106Z, + updatedAt: 2026-06-24T11:29:23.106Z + } + + at getStudentProgress (src/routes/learning/learning.service.ts:235:13) + + console.log + DEBUG getStudentProgress: returning parsed DB progress: { + id: 'progress-1', + studentId: 'student-remove', + courseId: 'course-1', + completedLessons: [ 'course-1-lesson-1' ], + currentModuleId: 'course-1-module-1', + percentage: 25, + status: 'in_progress', + lastAccessedAt: 2026-06-24T11:29:23.106Z, + completedAt: null, + createdAt: 2026-06-24T11:29:23.106Z, + updatedAt: 2026-06-24T11:29:23.106Z + } + + at getStudentProgress (src/routes/learning/learning.service.ts:241:15) + + console.log + DEBUG: studentId: student-nodedup existingProgress: { + id: 'progress-1', + studentId: 'student-remove', + courseId: 'course-1', + completedLessons: [ 'course-1-lesson-1' ], + currentModuleId: 'course-1-module-1', + percentage: 25, + status: 'in_progress', + lastAccessedAt: 2026-06-24T11:29:23.106Z, + completedAt: null, + createdAt: 2026-06-24T11:29:23.106Z, + updatedAt: 2026-06-24T11:29:23.106Z + } completedLessonSet: [ 'course-1-lesson-1' ] + + at updateStudentProgress (src/routes/learning/learning.service.ts:301:11) + + console.log + DEBUG getStudentProgress: studentId: student-pct100 courseId: course-1 + + at getStudentProgress (src/routes/learning/learning.service.ts:216:11) + + console.log + DEBUG getStudentProgress: database findUnique returned: { + id: 'progress-1', + studentId: 'student-nodedup', + courseId: 'course-1', + completedLessons: [ 'course-1-lesson-1' ], + currentModuleId: 'course-1-module-1', + percentage: 25, + status: 'in_progress', + lastAccessedAt: 2026-06-24T11:29:23.113Z, + completedAt: null, + createdAt: 2026-06-24T11:29:23.113Z, + updatedAt: 2026-06-24T11:29:23.113Z + } + + at getStudentProgress (src/routes/learning/learning.service.ts:235:13) + + console.log + DEBUG getStudentProgress: returning parsed DB progress: { + id: 'progress-1', + studentId: 'student-nodedup', + courseId: 'course-1', + completedLessons: [ 'course-1-lesson-1' ], + currentModuleId: 'course-1-module-1', + percentage: 25, + status: 'in_progress', + lastAccessedAt: 2026-06-24T11:29:23.113Z, + completedAt: null, + createdAt: 2026-06-24T11:29:23.113Z, + updatedAt: 2026-06-24T11:29:23.113Z + } + + at getStudentProgress (src/routes/learning/learning.service.ts:241:15) + + console.log + DEBUG: studentId: student-pct100 existingProgress: { + id: 'progress-1', + studentId: 'student-nodedup', + courseId: 'course-1', + completedLessons: [ 'course-1-lesson-1' ], + currentModuleId: 'course-1-module-1', + percentage: 25, + status: 'in_progress', + lastAccessedAt: 2026-06-24T11:29:23.113Z, + completedAt: null, + createdAt: 2026-06-24T11:29:23.113Z, + updatedAt: 2026-06-24T11:29:23.113Z + } completedLessonSet: [ 'course-1-lesson-1' ] + + at updateStudentProgress (src/routes/learning/learning.service.ts:301:11) + + console.error + Error during lesson completion webhook trigger: TypeError: Cannot read properties of undefined (reading 'findUnique') + at updateStudentProgress (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/routes/learning/learning.service.ts:319:46) + at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/progress.unit.test.ts:367:22) + + 361 | } + 362 | } catch (err) { + > 363 | console.error('Error during lesson completion webhook trigger:', err); + | ^ + 364 | } + 365 | } + 366 | completedLessonSet.add(input.lessonId); + + at updateStudentProgress (src/routes/learning/learning.service.ts:363:17) + at Object. (tests/progress.unit.test.ts:367:22) + + console.log + DEBUG getStudentProgress: studentId: student-explicit courseId: course-1 + + at getStudentProgress (src/routes/learning/learning.service.ts:216:11) + + console.log + DEBUG getStudentProgress: database findUnique returned: { + id: 'progress-1', + studentId: 'student-pct100', + courseId: 'course-1', + completedLessons: [ 'course-1-lesson-1', 'course-1-lesson-2', 'course-1-lesson-3' ], + currentModuleId: 'course-1-module-2', + percentage: 75, + status: 'in_progress', + lastAccessedAt: 2026-06-24T11:29:23.122Z, + completedAt: null, + createdAt: 2026-06-24T11:29:23.122Z, + updatedAt: 2026-06-24T11:29:23.122Z + } + + at getStudentProgress (src/routes/learning/learning.service.ts:235:13) + + console.log + DEBUG getStudentProgress: returning parsed DB progress: { + id: 'progress-1', + studentId: 'student-pct100', + courseId: 'course-1', + completedLessons: [ 'course-1-lesson-1', 'course-1-lesson-2', 'course-1-lesson-3' ], + currentModuleId: 'course-1-module-2', + percentage: 75, + status: 'in_progress', + lastAccessedAt: 2026-06-24T11:29:23.122Z, + completedAt: null, + createdAt: 2026-06-24T11:29:23.122Z, + updatedAt: 2026-06-24T11:29:23.122Z + } + + at getStudentProgress (src/routes/learning/learning.service.ts:241:15) + + console.log + DEBUG: studentId: student-explicit existingProgress: { + id: 'progress-1', + studentId: 'student-pct100', + courseId: 'course-1', + completedLessons: [ 'course-1-lesson-1', 'course-1-lesson-2', 'course-1-lesson-3' ], + currentModuleId: 'course-1-module-2', + percentage: 75, + status: 'in_progress', + lastAccessedAt: 2026-06-24T11:29:23.122Z, + completedAt: null, + createdAt: 2026-06-24T11:29:23.122Z, + updatedAt: 2026-06-24T11:29:23.122Z + } completedLessonSet: [ 'course-1-lesson-1', 'course-1-lesson-2', 'course-1-lesson-3' ] + + at updateStudentProgress (src/routes/learning/learning.service.ts:301:11) + + console.log + DEBUG getStudentProgress: studentId: student-activity courseId: course-1 + + at getStudentProgress (src/routes/learning/learning.service.ts:216:11) + + console.log + DEBUG getStudentProgress: database findUnique returned: { + id: 'progress-1', + studentId: 'student-explicit', + courseId: 'course-1', + completedLessons: [], + currentModuleId: null, + percentage: 0, + status: 'not_started', + lastAccessedAt: 2026-06-24T11:29:23.132Z, + completedAt: null, + createdAt: 2026-06-24T11:29:23.132Z, + updatedAt: 2026-06-24T11:29:23.132Z + } + + at getStudentProgress (src/routes/learning/learning.service.ts:235:13) + + console.log + DEBUG getStudentProgress: returning parsed DB progress: { + id: 'progress-1', + studentId: 'student-explicit', + courseId: 'course-1', + completedLessons: [], + currentModuleId: null, + percentage: 0, + status: 'not_started', + lastAccessedAt: 2026-06-24T11:29:23.132Z, + completedAt: null, + createdAt: 2026-06-24T11:29:23.132Z, + updatedAt: 2026-06-24T11:29:23.132Z + } + + at getStudentProgress (src/routes/learning/learning.service.ts:241:15) + + console.log + DEBUG: studentId: student-activity existingProgress: { + id: 'progress-1', + studentId: 'student-explicit', + courseId: 'course-1', + completedLessons: [], + currentModuleId: null, + percentage: 0, + status: 'not_started', + lastAccessedAt: 2026-06-24T11:29:23.132Z, + completedAt: null, + createdAt: 2026-06-24T11:29:23.132Z, + updatedAt: 2026-06-24T11:29:23.132Z + } completedLessonSet: [] + + at updateStudentProgress (src/routes/learning/learning.service.ts:301:11) + + console.error + Error during lesson completion webhook trigger: TypeError: Cannot read properties of undefined (reading 'findUnique') + at updateStudentProgress (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/routes/learning/learning.service.ts:319:46) + at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/progress.unit.test.ts:436:7) + + 361 | } + 362 | } catch (err) { + > 363 | console.error('Error during lesson completion webhook trigger:', err); + | ^ + 364 | } + 365 | } + 366 | completedLessonSet.add(input.lessonId); + + at updateStudentProgress (src/routes/learning/learning.service.ts:363:17) + at Object. (tests/progress.unit.test.ts:436:7) + + console.log + DEBUG getStudentProgress: studentId: student-dedup courseId: course-1 + + at getStudentProgress (src/routes/learning/learning.service.ts:216:11) + + console.log + DEBUG getStudentProgress: database findUnique returned: { + id: 'progress-1', + studentId: 'student-activity', + courseId: 'course-1', + completedLessons: [], + currentModuleId: null, + percentage: 0, + status: 'not_started', + lastAccessedAt: 2026-06-24T11:29:23.142Z, + completedAt: null, + createdAt: 2026-06-24T11:29:23.142Z, + updatedAt: 2026-06-24T11:29:23.142Z + } + + at getStudentProgress (src/routes/learning/learning.service.ts:235:13) + + console.log + DEBUG getStudentProgress: returning parsed DB progress: { + id: 'progress-1', + studentId: 'student-activity', + courseId: 'course-1', + completedLessons: [], + currentModuleId: null, + percentage: 0, + status: 'not_started', + lastAccessedAt: 2026-06-24T11:29:23.142Z, + completedAt: null, + createdAt: 2026-06-24T11:29:23.142Z, + updatedAt: 2026-06-24T11:29:23.142Z + } + + at getStudentProgress (src/routes/learning/learning.service.ts:241:15) + + console.log + DEBUG: studentId: student-dedup existingProgress: { + id: 'progress-1', + studentId: 'student-activity', + courseId: 'course-1', + completedLessons: [], + currentModuleId: null, + percentage: 0, + status: 'not_started', + lastAccessedAt: 2026-06-24T11:29:23.142Z, + completedAt: null, + createdAt: 2026-06-24T11:29:23.142Z, + updatedAt: 2026-06-24T11:29:23.142Z + } completedLessonSet: [] + + at updateStudentProgress (src/routes/learning/learning.service.ts:301:11) + + console.error + Error during lesson completion webhook trigger: TypeError: Cannot read properties of undefined (reading 'findUnique') + at updateStudentProgress (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/routes/learning/learning.service.ts:319:46) + at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/progress.unit.test.ts:464:7) + + 361 | } + 362 | } catch (err) { + > 363 | console.error('Error during lesson completion webhook trigger:', err); + | ^ + 364 | } + 365 | } + 366 | completedLessonSet.add(input.lessonId); + + at updateStudentProgress (src/routes/learning/learning.service.ts:363:17) + at Object. (tests/progress.unit.test.ts:464:7) + + console.log + DEBUG getStudentProgress: studentId: student-fallback-upsert courseId: course-1 + + at getStudentProgress (src/routes/learning/learning.service.ts:216:11) + + console.log + DEBUG getStudentProgress: database findUnique returned: { + id: 'progress-1', + studentId: 'student-dedup', + courseId: 'course-1', + completedLessons: [ 'course-1-lesson-1' ], + currentModuleId: 'course-1-module-1', + percentage: 25, + status: 'in_progress', + lastAccessedAt: 2026-06-24T11:29:23.153Z, + completedAt: null, + createdAt: 2026-06-24T11:29:23.153Z, + updatedAt: 2026-06-24T11:29:23.153Z + } + + at getStudentProgress (src/routes/learning/learning.service.ts:235:13) + + console.log + DEBUG getStudentProgress: returning parsed DB progress: { + id: 'progress-1', + studentId: 'student-dedup', + courseId: 'course-1', + completedLessons: [ 'course-1-lesson-1' ], + currentModuleId: 'course-1-module-1', + percentage: 25, + status: 'in_progress', + lastAccessedAt: 2026-06-24T11:29:23.153Z, + completedAt: null, + createdAt: 2026-06-24T11:29:23.153Z, + updatedAt: 2026-06-24T11:29:23.153Z + } + + at getStudentProgress (src/routes/learning/learning.service.ts:241:15) + + console.log + DEBUG: studentId: student-fallback-upsert existingProgress: { + id: 'progress-1', + studentId: 'student-dedup', + courseId: 'course-1', + completedLessons: [ 'course-1-lesson-1' ], + currentModuleId: 'course-1-module-1', + percentage: 25, + status: 'in_progress', + lastAccessedAt: 2026-06-24T11:29:23.153Z, + completedAt: null, + createdAt: 2026-06-24T11:29:23.153Z, + updatedAt: 2026-06-24T11:29:23.153Z + } completedLessonSet: [ 'course-1-lesson-1' ] + + at updateStudentProgress (src/routes/learning/learning.service.ts:301:11) + + console.warn + Database error in updateStudentProgress, updated in mock store only + + 421 | return toProgress(progress); + 422 | } catch (_error) { + > 423 | console.warn('Database error in updateStudentProgress, updated in mock store only'); + | ^ + 424 | await invalidateUserProgressCache(studentId); + 425 | return updatedProgress; + 426 | } + + at updateStudentProgress (src/routes/learning/learning.service.ts:423:13) + at Object. (tests/progress.unit.test.ts:492:22) + + console.log + DEBUG getStudentProgress: studentId: student-cache-invalidate courseId: course-1 + + at getStudentProgress (src/routes/learning/learning.service.ts:216:11) + + console.log + DEBUG getStudentProgress: database findUnique returned: { + id: 'progress-1', + studentId: 'student-fallback-upsert', + courseId: 'course-1', + completedLessons: [], + currentModuleId: null, + percentage: 0, + status: 'not_started', + lastAccessedAt: 2026-06-24T11:29:23.171Z, + completedAt: null, + createdAt: 2026-06-24T11:29:23.171Z, + updatedAt: 2026-06-24T11:29:23.171Z + } + + at getStudentProgress (src/routes/learning/learning.service.ts:235:13) + + console.log + DEBUG getStudentProgress: returning parsed DB progress: { + id: 'progress-1', + studentId: 'student-fallback-upsert', + courseId: 'course-1', + completedLessons: [], + currentModuleId: null, + percentage: 0, + status: 'not_started', + lastAccessedAt: 2026-06-24T11:29:23.171Z, + completedAt: null, + createdAt: 2026-06-24T11:29:23.171Z, + updatedAt: 2026-06-24T11:29:23.171Z + } + + at getStudentProgress (src/routes/learning/learning.service.ts:241:15) + + console.log + DEBUG: studentId: student-cache-invalidate existingProgress: { + id: 'progress-1', + studentId: 'student-fallback-upsert', + courseId: 'course-1', + completedLessons: [], + currentModuleId: null, + percentage: 0, + status: 'not_started', + lastAccessedAt: 2026-06-24T11:29:23.171Z, + completedAt: null, + createdAt: 2026-06-24T11:29:23.171Z, + updatedAt: 2026-06-24T11:29:23.171Z + } completedLessonSet: [] + + at updateStudentProgress (src/routes/learning/learning.service.ts:301:11) + + console.error + Error during lesson completion webhook trigger: TypeError: Cannot read properties of undefined (reading 'findUnique') + at updateStudentProgress (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/routes/learning/learning.service.ts:319:46) + at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/progress.unit.test.ts:525:7) + + 361 | } + 362 | } catch (err) { + > 363 | console.error('Error during lesson completion webhook trigger:', err); + | ^ + 364 | } + 365 | } + 366 | completedLessonSet.add(input.lessonId); + + at updateStudentProgress (src/routes/learning/learning.service.ts:363:17) + at Object. (tests/progress.unit.test.ts:525:7) + + console.log + DEBUG getStudentProgress: studentId: student-completed-at courseId: course-1 + + at getStudentProgress (src/routes/learning/learning.service.ts:216:11) + + console.log + DEBUG getStudentProgress: database findUnique returned: { + id: 'progress-1', + studentId: 'student-cache-invalidate', + courseId: 'course-1', + completedLessons: [], + currentModuleId: null, + percentage: 0, + status: 'not_started', + lastAccessedAt: 2026-06-24T11:29:23.182Z, + completedAt: null, + createdAt: 2026-06-24T11:29:23.182Z, + updatedAt: 2026-06-24T11:29:23.182Z + } + + at getStudentProgress (src/routes/learning/learning.service.ts:235:13) + + console.log + DEBUG getStudentProgress: returning parsed DB progress: { + id: 'progress-1', + studentId: 'student-cache-invalidate', + courseId: 'course-1', + completedLessons: [], + currentModuleId: null, + percentage: 0, + status: 'not_started', + lastAccessedAt: 2026-06-24T11:29:23.182Z, + completedAt: null, + createdAt: 2026-06-24T11:29:23.182Z, + updatedAt: 2026-06-24T11:29:23.182Z + } + + at getStudentProgress (src/routes/learning/learning.service.ts:241:15) + + console.log + DEBUG: studentId: student-completed-at existingProgress: { + id: 'progress-1', + studentId: 'student-cache-invalidate', + courseId: 'course-1', + completedLessons: [], + currentModuleId: null, + percentage: 0, + status: 'not_started', + lastAccessedAt: 2026-06-24T11:29:23.182Z, + completedAt: null, + createdAt: 2026-06-24T11:29:23.182Z, + updatedAt: 2026-06-24T11:29:23.182Z + } completedLessonSet: [] + + at updateStudentProgress (src/routes/learning/learning.service.ts:301:11) + + console.error + Error during lesson completion webhook trigger: TypeError: Cannot read properties of undefined (reading 'findUnique') + at updateStudentProgress (/home/knights/Documents/Drips/Web3-Student-Lab/backend/src/routes/learning/learning.service.ts:319:46) + at Object. (/home/knights/Documents/Drips/Web3-Student-Lab/backend/tests/progress.unit.test.ts:564:22) + + 361 | } + 362 | } catch (err) { + > 363 | console.error('Error during lesson completion webhook trigger:', err); + | ^ + 364 | } + 365 | } + 366 | completedLessonSet.add(input.lessonId); + + at updateStudentProgress (src/routes/learning/learning.service.ts:363:17) + at Object. (tests/progress.unit.test.ts:564:22) + + console.log + DEBUG getStudentProgress: studentId: student-module-id courseId: course-1 + + at getStudentProgress (src/routes/learning/learning.service.ts:216:11) + + console.log + DEBUG getStudentProgress: database findUnique returned: { + id: 'progress-1', + studentId: 'student-completed-at', + courseId: 'course-1', + completedLessons: [ 'course-1-lesson-1', 'course-1-lesson-2', 'course-1-lesson-3' ], + currentModuleId: 'course-1-module-2', + percentage: 75, + status: 'in_progress', + lastAccessedAt: 2026-06-24T11:29:23.194Z, + completedAt: null, + createdAt: 2026-06-24T11:29:23.194Z, + updatedAt: 2026-06-24T11:29:23.194Z + } + + at getStudentProgress (src/routes/learning/learning.service.ts:235:13) + + console.log + DEBUG getStudentProgress: returning parsed DB progress: { + id: 'progress-1', + studentId: 'student-completed-at', + courseId: 'course-1', + completedLessons: [ 'course-1-lesson-1', 'course-1-lesson-2', 'course-1-lesson-3' ], + currentModuleId: 'course-1-module-2', + percentage: 75, + status: 'in_progress', + lastAccessedAt: 2026-06-24T11:29:23.194Z, + completedAt: null, + createdAt: 2026-06-24T11:29:23.194Z, + updatedAt: 2026-06-24T11:29:23.194Z + } + + at getStudentProgress (src/routes/learning/learning.service.ts:241:15) + + console.log + DEBUG: studentId: student-module-id existingProgress: { + id: 'progress-1', + studentId: 'student-completed-at', + courseId: 'course-1', + completedLessons: [ 'course-1-lesson-1', 'course-1-lesson-2', 'course-1-lesson-3' ], + currentModuleId: 'course-1-module-2', + percentage: 75, + status: 'in_progress', + lastAccessedAt: 2026-06-24T11:29:23.194Z, + completedAt: null, + createdAt: 2026-06-24T11:29:23.194Z, + updatedAt: 2026-06-24T11:29:23.194Z + } completedLessonSet: [ 'course-1-lesson-1', 'course-1-lesson-2', 'course-1-lesson-3' ] + + at updateStudentProgress (src/routes/learning/learning.service.ts:301:11) + + console.log + DEBUG getStudentProgress: studentId: student-zero courseId: course-1 + + at getStudentProgress (src/routes/learning/learning.service.ts:216:11) + + console.log + DEBUG getStudentProgress: database findUnique returned: { + id: 'progress-1', + studentId: 'student-module-id', + courseId: 'course-1', + completedLessons: [], + currentModuleId: null, + percentage: 0, + status: 'not_started', + lastAccessedAt: 2026-06-24T11:29:23.217Z, + completedAt: null, + createdAt: 2026-06-24T11:29:23.217Z, + updatedAt: 2026-06-24T11:29:23.217Z + } + + at getStudentProgress (src/routes/learning/learning.service.ts:235:13) + + console.log + DEBUG getStudentProgress: returning parsed DB progress: { + id: 'progress-1', + studentId: 'student-module-id', + courseId: 'course-1', + completedLessons: [], + currentModuleId: null, + percentage: 0, + status: 'not_started', + lastAccessedAt: 2026-06-24T11:29:23.217Z, + completedAt: null, + createdAt: 2026-06-24T11:29:23.217Z, + updatedAt: 2026-06-24T11:29:23.217Z + } + + at getStudentProgress (src/routes/learning/learning.service.ts:241:15) + + console.log + DEBUG getStudentProgress: studentId: fresh-student courseId: course-2 + + at getStudentProgress (src/routes/learning/learning.service.ts:216:11) + + console.log + DEBUG getStudentProgress: database findUnique returned: null + + at getStudentProgress (src/routes/learning/learning.service.ts:235:13) + + console.log + DEBUG getStudentProgress: returning initial progress: { + id: 'progress-fresh-student-course-2', + studentId: 'fresh-student', + courseId: 'course-2', + completedLessons: [], + currentModuleId: 'course-2-module-1', + percentage: 0, + status: 'not_started', + lastAccessedAt: 2026-06-24T11:29:23.240Z, + completedAt: null, + createdAt: 2026-06-24T11:29:23.240Z, + updatedAt: 2026-06-24T11:29:23.240Z + } + + at getStudentProgress (src/routes/learning/learning.service.ts:272:11) + +(node:88651) ExperimentalWarning: VM Modules is an experimental feature and might change at any time +(Use `node --trace-warnings ...` to show where the warning was created) +FAIL tests/progress.unit.test.ts + Progress Service - Unit Tests + getStudentProgress() + ✓ should return progress from cache when available (94 ms) + ✓ should fetch from database when cache misses (13 ms) + ✓ should return default initial progress when no record exists (12 ms) + ✓ should seed currentModuleId from curriculum for initial progress (7 ms) + ✓ should fallback to mock store when database fails (45 ms) + ✓ should cache database result for subsequent requests (5 ms) + ✓ should correctly use progress key for different student-course combinations (11 ms) + updateStudentProgress() + ✓ should throw LESSON_NOT_FOUND for invalid lesson (14 ms) + ✓ should add lesson to completedLessons when marking as completed (12 ms) + ✓ should remove lesson from completedLessons when marking as not completed (8 ms) + ✓ should not duplicate completed lessons on re-completion (9 ms) + ✓ should calculate percentage as 100 when all lessons are completed (10 ms) + ✓ should use explicit percentage when provided (10 ms) + ✓ should log student activity on new lesson completion (10 ms) + ✕ should not log activity when re-completing an already-completed lesson (16 ms) + ✓ should fallback to mock store when database upsert fails (12 ms) + ✓ should invalidate user progress cache after update (12 ms) + ✓ should set completedAt when course is completed (22 ms) + ✓ should update currentModuleId when completing lesson in a module (10 ms) + Progress Status Calculations + ✓ should calculate 0% for no completed lessons (5 ms) + ✓ should set status as not_started when no lessons completed (8 ms) + + ● Progress Service - Unit Tests › updateStudentProgress() › should not log activity when re-completing an already-completed lesson + + expect(jest.fn()).not.toHaveBeenCalled() + + Expected number of calls: 0 + Received number of calls: 1 + + 1: {"data": {"action": "COMPLETED_LESSON", "courseId": "course-1", "lessonId": "course-1-lesson-1", "studentId": "student-dedup"}} + + 468 | + 469 | // Assert: Activity was NOT logged again (de-duplication) + > 470 | expect(mockPrismaStudentActivityCreate).not.toHaveBeenCalled(); + | ^ + 471 | }); + 472 | + 473 | it('should fallback to mock store when database upsert fails', async () => { + + at Object. (tests/progress.unit.test.ts:470:51) + +Test Suites: 1 failed, 1 total +Tests: 1 failed, 20 passed, 21 total +Snapshots: 0 total +Time: 2.668 s +Ran all test suites matching tests/progress.unit.test.ts. +Force exiting Jest: Have you considered using `--detectOpenHandles` to detect async operations that kept running after all tests finished? diff --git a/pending/001_create_jobs_table.sql b/pending/001_create_jobs_table.sql new file mode 100644 index 00000000..0d8c3ca8 --- /dev/null +++ b/pending/001_create_jobs_table.sql @@ -0,0 +1,42 @@ +-- Create jobs table for async task queue +CREATE TABLE IF NOT EXISTS jobs ( + id UUID PRIMARY KEY, + job_type VARCHAR(50) NOT NULL, + status VARCHAR(20) NOT NULL DEFAULT 'queued', + payload JSONB NOT NULL, + result JSONB, + progress_percent INTEGER NOT NULL DEFAULT 0, + progress_message VARCHAR(255) NOT NULL DEFAULT 'Queued', + webhook_url VARCHAR(500), + webhook_headers JSONB, + webhook_secret VARCHAR(255), + error_message TEXT, + error_type VARCHAR(50), + timeout_secs INTEGER NOT NULL DEFAULT 300, + retry_count INTEGER NOT NULL DEFAULT 0, + created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(), + started_at TIMESTAMP WITH TIME ZONE, + completed_at TIMESTAMP WITH TIME ZONE, + updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW() +); + +-- Create indexes for efficient querying +CREATE INDEX IF NOT EXISTS idx_jobs_status ON jobs(status); +CREATE INDEX IF NOT EXISTS idx_jobs_created_at ON jobs(created_at); +CREATE INDEX IF NOT EXISTS idx_jobs_status_created_at ON jobs(status, created_at); + +-- Create function to update updated_at timestamp +CREATE OR REPLACE FUNCTION update_updated_at_column() +RETURNS TRIGGER AS $$ +BEGIN + NEW.updated_at = NOW(); + RETURN NEW; +END; +$$ language 'plpgsql'; + +-- Create trigger to automatically update updated_at +DROP TRIGGER IF EXISTS update_jobs_updated_at ON jobs; +CREATE TRIGGER update_jobs_updated_at + BEFORE UPDATE ON jobs + FOR EACH ROW + EXECUTE FUNCTION update_updated_at_column(); diff --git a/pending/002_create_fee_tables.sql b/pending/002_create_fee_tables.sql new file mode 100644 index 00000000..48590f2b --- /dev/null +++ b/pending/002_create_fee_tables.sql @@ -0,0 +1,32 @@ +-- Migration 002: Create fee market analysis tables +-- Stores historical ledger fee data and transaction fee records for fee prediction + +CREATE TABLE IF NOT EXISTS ledger_fee_samples ( + ledger_sequence BIGINT PRIMARY KEY, + collected_at TIMESTAMP NOT NULL, + base_reserve BIGINT NOT NULL, + base_fee BIGINT NOT NULL, + max_fee BIGINT NOT NULL, + fee_charged BIGINT NOT NULL, + transaction_count INTEGER NOT NULL, + ledger_close_time TIMESTAMP NOT NULL +); + +CREATE TABLE IF NOT EXISTS transaction_fee_records ( + id TEXT PRIMARY KEY, + ledger_sequence BIGINT NOT NULL, + tx_hash VARCHAR(64) NOT NULL, + fee_bid BIGINT NOT NULL, + fee_charged BIGINT NOT NULL, + resource_fee BIGINT NOT NULL, + inclusion_success BOOLEAN NOT NULL, + recorded_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (ledger_sequence) REFERENCES ledger_fee_samples(ledger_sequence) +); + +-- Indexes for efficient time-series queries +CREATE INDEX IF NOT EXISTS idx_fee_samples_sequence ON ledger_fee_samples(ledger_sequence); +CREATE INDEX IF NOT EXISTS idx_fee_samples_close_time ON ledger_fee_samples(ledger_close_time); +CREATE INDEX IF NOT EXISTS idx_tx_records_ledger ON transaction_fee_records(ledger_sequence); +CREATE INDEX IF NOT EXISTS idx_tx_records_hash ON transaction_fee_records(tx_hash); +CREATE INDEX IF NOT EXISTS idx_tx_records_recorded_at ON transaction_fee_records(recorded_at); diff --git a/scripts/create_26_to.py b/scripts/create_26_to.py new file mode 100644 index 00000000..1a851445 --- /dev/null +++ b/scripts/create_26_to.py @@ -0,0 +1,367 @@ +#!/usr/bin/env python3 +import subprocess +import time + +issues = [ + ("[Frontend/Contract] Build Decentralized Subscription Service with Recurring Payments and Cancellation Logic", """## 📋 Overview +**Labels**: `smart-contract` `complexity: hard` `eta-2-days` `subscription` `recurring-payments` `DeFi` + +## 🎯 Problem Statement +Recurring payments require centralized processors and lack user control. The platform needs a decentralized subscription service with automated recurring payments and user-controlled cancellation. + +## 📝 Task Breakdown +### Phase 1: Subscription Creation (0.5 days) +- [ ] Implement subscription plan creation +- [ ] Create recurring payment scheduling +- [ ] Add payment amount and frequency +- [ ] Build subscription activation + +### Phase 2: Payment Automation (0.5 days) +- [ ] Implement automatic payment execution +- [ ] Create payment retry on failure +- [ ] Add balance checking before payment +- [ ] Build payment history tracking + +### Phase 3: Cancellation Logic (0.5 days) +- [ ] Implement user-initiated cancellation +- [ ] Create prorated refund calculation +- [ ] Add cancellation effective date +- [ ] Build subscription pause/resume + +### Phase 4: Frontend Interface (0.5 days) +- [ ] Create subscription management dashboard +- [ ] Build payment history view +- [ ] Add cancellation interface +- [ ] Implement subscription analytics + +## ✅ Acceptance Criteria +- [ ] Subscriptions created with proper terms +- [ ] Payments executed automatically +- [ ] Cancellation processed correctly +- [ ] Refunds calculated accurately +- [ ] Frontend manages subscriptions +- [ ] All operations emit proper events + +## 📁 Files to Create +- `contracts/src/subscription_service.rs` +- `contracts/src/recurring_payments.rs` +- `frontend/src/components/subscriptions/SubscriptionDashboard.tsx` + +## 🎯 Success Metrics +- Subscription creation <3 seconds +- Payment automation 100% reliable +- Cancellation instant +- Support for 10000+ subscriptions"""), + + ("[Frontend/Contract] Create DEX Aggregator with Best Price Routing and Split Trade Execution", """## 📋 Overview +**Labels**: `smart-contract` `complexity: hard` `eta-2-days` `DEX` `aggregator` `price-optimization` + +## 🎯 Problem Statement +Users get suboptimal prices when trading on single DEXs. The platform needs a DEX aggregator that finds the best prices across multiple pools and splits trades for optimal execution. + +## 📝 Task Breakdown +### Phase 1: Price Discovery (0.5 days) +- [ ] Implement multi-pool price querying +- [ ] Create price comparison logic +- [ ] Add slippage calculation +- [ ] Build best route finding + +### Phase 2: Split Execution (0.5 days) +- [ ] Implement trade splitting across pools +- [ ] Create optimal allocation algorithm +- [ ] Add atomic multi-pool execution +- [ ] Build partial fill handling + +### Phase 3: Optimization (0.5 days) +- [ ] Implement gas cost estimation +- [ ] Create net price calculation (after gas) +- [ ] Add MEV protection +- [ ] Build execution simulation + +### Phase 4: Frontend Interface (0.5 days) +- [ ] Create swap interface with routing +- [ ] Build price comparison display +- [ ] Add route visualization +- [ ] Implement trade execution tracking + +## ✅ Acceptance Criteria +- [ ] Best prices found across pools +- [ ] Trades split optimally +- [ ] Execution atomic and safe +- [ ] Gas costs minimized +- [ ] Frontend shows routing clearly +- [ ] All operations emit proper events + +## 📁 Files to Create +- `contracts/src/dex_aggregator.rs` +- `contracts/src/route_optimizer.rs` +- `frontend/src/components/defi/AggregatorInterface.tsx` + +## 🎯 Success Metrics +- Price improvement >1% vs single DEX +- Route finding <1 second +- Execution success >99% +- Gas optimization >20%"""), + + ("[Frontend/Contract] Implement Automated Token Buyback Program with Market Purchase and Burn Mechanism", """## 📋 Overview +**Labels**: `smart-contract` `complexity: hard` `eta-2-days` `buyback` `tokenomics` `deflationary` + +## 🎯 Problem Statement +Tokens lack deflationary mechanisms to increase value over time. The platform needs an automated buyback program that uses protocol revenue to purchase and burn tokens from the market. + +## 📝 Task Breakdown +### Phase 1: Buyback Configuration (0.5 days) +- [ ] Implement buyback percentage of revenue +- [ ] Create buyback frequency scheduling +- [ ] Add minimum/maximum buyback limits +- [ ] Build treasury management + +### Phase 2: Market Purchase (0.5 days) +- [ ] Implement DEX integration for purchases +- [ ] Create market order execution +- [ ] Add slippage protection +- [ ] Build purchase history + +### Phase 3: Burn Mechanism (0.5 days) +- [ ] Implement token burning after purchase +- [ ] Create burn verification +- [ ] Add supply tracking updates +- [ ] Build burn certificate generation + +### Phase 4: Frontend Dashboard (0.5 days) +- [ ] Create buyback program dashboard +- [ ] Build buyback history display +- [ ] Add supply reduction visualization +- [ ] Implement revenue tracking + +## ✅ Acceptance Criteria +- [ ] Buybacks executed automatically +- [ ] Tokens purchased at market prices +- [ ] Burning verified on-chain +- [ ] Supply tracking accurate +- [ ] Frontend displays program data +- [ ] All operations emit proper events + +## 📁 Files to Create +- `contracts/src/token_buyback.rs` +- `contracts/src/burn_mechanism.rs` +- `frontend/src/components/tokenomics/BuybackDashboard.tsx` + +## 🎯 Success Metrics +- Buyback execution reliable +- Burn verification 100% +- Supply tracking accurate +- Program transparent"""), + + ("[Frontend/Contract] Build Decentralized Freelance Platform with Milestone Payments and Reputation System", """## 📋 Overview +**Labels**: `smart-contract` `complexity: hard` `eta-2-days` `freelance` `escrow` `reputation` + +## 🎯 Problem Statement +Freelancers face payment delays and clients risk poor work quality. The platform needs a decentralized freelance platform with milestone-based escrow payments and on-chain reputation. + +## 📝 Task Breakdown +### Phase 1: Job Posting (0.5 days) +- [ ] Implement job creation with requirements +- [ ] Create milestone definition +- [ ] Add budget and timeline +- [ ] Build application system + +### Phase 2: Milestone Escrow (0.5 days) +- [ ] Implement fund deposit for milestones +- [ ] Create milestone completion verification +- [ ] Add client approval workflow +- [ ] Build automatic release on approval + +### Phase 3: Reputation System (0.5 days) +- [ ] Implement rating after completion +- [ ] Create reputation score calculation +- [ ] Add review storage +- [ ] Build reputation decay over time + +### Phase 4: Frontend Interface (0.5 days) +- [ ] Create job marketplace browsing +- [ ] Build milestone tracking dashboard +- [ ] Add reputation profile display +- [ ] Implement payment history + +## ✅ Acceptance Criteria +- [ ] Jobs posted with clear milestones +- [ ] Funds held in escrow securely +- [ ] Milestone payments released properly +- [ ] Reputation tracked accurately +- [ ] Frontend manages workflow +- [ ] All operations emit proper events + +## 📁 Files to Create +- `contracts/src/freelance_platform.rs` +- `contracts/src/reputation_system.rs` +- `frontend/src/components/freelance/FreelanceDashboard.tsx` + +## 🎯 Success Metrics +- Job creation <5 seconds +- Milestone payments automatic +- Reputation calculation fair +- Support for 5000+ freelancers"""), + + ("[Frontend/Contract] Create Synthetic Asset Protocol with Price Oracle Integration and Collateral Management", """## 📋 Overview +**Labels**: `smart-contract` `complexity: hard` `eta-2-days` `synthetic-assets` `DeFi` `oracle` + +## 🎯 Problem Statement +Users cannot gain exposure to real-world assets on-chain. The platform needs a synthetic asset protocol that mirrors real-world prices with proper collateralization. + +## 📝 Task Breakdown +### Phase 1: Synthetic Asset Creation (0.5 days) +- [ ] Implement synthetic asset minting +- [ ] Create collateral requirement checking +- [ ] Add price oracle integration +- [ ] Build asset tracking + +### Phase 2: Price Oracle (0.5 days) +- [ ] Implement oracle price feeds +- [ ] Create price update mechanism +- [ ] Add stale price detection +- [ ] Build price deviation alerts + +### Phase 3: Collateral Management (0.5 days) +- [ ] Implement collateral deposit +- [ ] Create liquidation on under-collateralization +- [ ] Add collateral ratio monitoring +- [ ] Build liquidation incentives + +### Phase 4: Frontend Interface (0.5 days) +- [ ] Create synthetic asset trading +- [ ] Build collateral management +- [ ] Add price tracking dashboard +- [ ] Implement position monitoring + +## ✅ Acceptance Criteria +- [ ] Synthetics track real-world prices +- [ ] Collateralization enforced +- [ ] Liquidations execute properly +- [ ] Oracle prices accurate +- [ ] Frontend displays positions +- [ ] All operations emit proper events + +## 📁 Files to Create +- `contracts/src/synthetic_assets.rs` +- `contracts/src/oracle_integration.rs` +- `frontend/src/components/synthetics/SyntheticsDashboard.tsx` + +## 🎯 Success Metrics +- Price tracking accuracy >99% +- Liquidation execution <5 seconds +- Collateral management safe +- Support for 20+ synthetic assets"""), + + ("[Frontend/Contract] Implement Token-Gated Access Control with NFT Membership and Tier-Based Permissions", """## �� Overview +**Labels**: `smart-contract` `complexity: hard` `eta-2-days` `access-control` `NFT` `membership` + +## 🎯 Problem Statement +Communities lack flexible access control based on token ownership. The platform needs token-gated access with NFT memberships and tier-based permissions for exclusive content. + +## 📝 Task Breakdown +### Phase 1: NFT Membership (0.5 days) +- [ ] Implement membership NFT minting +- [ ] Create tier levels (Bronze, Silver, Gold) +- [ ] Add tier benefits configuration +- [ ] Build NFT transfer restrictions + +### Phase 2: Access Control (0.5 days) +- [ ] Implement token balance checking +- [ ] Create tier-based permission system +- [ ] Add access verification +- [ ] Build temporary access grants + +### Phase 3: Benefits Distribution (0.5 days) +- [ ] Implement tier-specific rewards +- [ ] Create automatic benefit distribution +- [ ] Add exclusive content access +- [ ] Build benefit claiming + +### Phase 4: Frontend Interface (0.5 days) +- [ ] Create membership dashboard +- [ ] Build access-gated content display +- [ ] Add tier comparison view +- [ ] Implement benefits tracking + +## ✅ Acceptance Criteria +- [ ] Membership NFTs minted correctly +- [ ] Access control enforced by tier +- [ ] Benefits distributed automatically +- [ ] Permissions updated on transfer +- [ ] Frontend manages access seamlessly +- [ ] All operations emit proper events + +## 📁 Files to Create +- `contracts/src/token_gated_access.rs` +- `contracts/src/membership_nft.rs` +- `frontend/src/components/membership/MembershipDashboard.tsx` + +## 🎯 Success Metrics +- Access verification <1 second +- Tier management flexible +- Benefits distribution accurate +- Support for 10000+ members"""), + + ("[Frontend/Contract] Build Decentralized Document Backup with Encrypted Storage and Recovery Keys", """## 📋 Overview +**Labels**: `smart-contract` `complexity: hard` `eta-2-days` `backup` `encryption` `document-management` + +## 🎯 Problem Statement +Document storage lacks privacy and disaster recovery. The platform needs decentralized encrypted backup with recovery key management and redundant storage. + +## 📝 Task Breakdown +### Phase 1: Encrypted Backup (0.5 days) +- [ ] Implement document encryption before storage +- [ ] Create decentralized storage distribution +- [ ] Add encryption key management +- [ ] Build backup scheduling + +### Phase 2: Recovery System (0.5 days) +- [ ] Implement recovery key generation +- [ ] Create multi-key recovery (M-of-N) +- [ ] Add key distribution to trusted parties +- [ ] Build recovery workflow + +### Phase 3: Redundancy (0.5 days) +- [ ] Implement redundant backup across nodes +- [ ] Create backup verification +- [ ] Add automatic re-backup on failure +- [ ] Build backup versioning + +### Phase 4: Frontend Interface (0.5 days) +- [ ] Create backup management dashboard +- [ ] Build document browser +- [ ] Add recovery interface +- [ ] Implement backup status monitoring + +## ✅ Acceptance Criteria +- [ ] Documents encrypted before storage +- [ ] Recovery keys distributed securely +- [ ] Redundancy maintained +- [ ] Recovery workflow functional +- [ ] Frontend manages backups +- [ ] All operations emit proper events + +## 📁 Files to Create +- `contracts/src/document_backup.rs` +- `contracts/src/recovery_system.rs` +- `frontend/src/components/backup/BackupDashboard.tsx` + +## 🎯 Success Metrics +- Backup encryption strong +- Recovery success 100% +- Redundancy >3 copies +- Support for 100GB+ storage"""), +] + +print("Creating issues 26-32...\\n") +for i, (title, body) in enumerate(issues, 26): + print(f"Issue #{i}/50...") + result = subprocess.run(["gh", "issue", "create", "--title", title, "--body", body], capture_output=True, text=True) + if result.returncode == 0: + print(f"✓ Issue #{i} created successfully") + time.sleep(2) + else: + print(f"✗ Issue #{i} failed: {result.stderr[:80]}") + +print("\\n✅ Issues 26-32 complete!") diff --git a/scripts/rewrite_issues_batch.py b/scripts/rewrite_issues_batch.py new file mode 100644 index 00000000..ddcf21aa --- /dev/null +++ b/scripts/rewrite_issues_batch.py @@ -0,0 +1,329 @@ +#!/usr/bin/env python3 +import subprocess + +issues = { + 268: { + "title": "[Frontend] Interactive Transaction Flow Visualizer", + "body": """## �� Overview +**Labels**: `frontend` `complexity: hard` `eta-2-days` `data-visualization` +**Contributor Persona**: Frontend Expert (Requires expertise in D3.js, Stellar transaction lifecycle, and visual flow diagrams) + +## 🎯 Problem Statement +Students struggle to understand the complex flow of Stellar transactions. The current documentation is text-heavy and lacks interactive visualizations that show each step of transaction processing. + +## 📍 Current State +- Static documentation explaining transaction flow +- No visual representation of transaction lifecycle +- Difficult to debug failed transactions +- Limited understanding of submission, validation, and confirmation steps + +## ✨ Desired State +- Interactive flow diagram showing transaction lifecycle +- Real-time visualization of transaction status +- Step-by-step breakdown with detailed explanations +- Ability to trace historical transactions visually + +## 🛠 Technical Requirements +- **D3.js** for flow visualization +- Stellar SDK integration for transaction data +- Real-time status updates via WebSocket + +## 📝 Task Breakdown + +### Phase 1: Flow Diagram Design (0.5 days) +- [ ] Design transaction flow diagram layout +- [ ] Define nodes for each transaction step +- [ ] Create visual states (pending, success, failed) +- [ ] Implement basic D3.js flow chart + +### Phase 2: Interactive Features (0.5 days) +- [ ] Add click handlers to show step details +- [ ] Implement hover tooltips with explanations +- [ ] Create animated transitions between states +- [ ] Add zoom and pan controls + +### Phase 3: Real-time Integration (0.5 days) +- [ ] Connect to Stellar SDK for transaction data +- [ ] Implement real-time status updates +- [ ] Add transaction submission from visualizer +- [ ] Create error state visualizations + +### Phase 4: Historical Tracking (0.5 days) +- [ ] Build transaction history panel +- [ ] Add ability to replay past transactions +- [ ] Implement filtering and search +- [ ] Create export functionality (PNG, SVG) + +## ✅ Acceptance Criteria +- [ ] Flow diagram accurately represents Stellar transaction lifecycle +- [ ] Real-time updates reflect transaction status changes +- [ ] All steps have clear, educational explanations +- [ ] Visualization is responsive and performant +- [ ] Students can trace complete transaction flow +- [ ] Interactive features work smoothly + +## 📁 Files to Create/Modify +- `frontend/src/components/transaction/FlowVisualizer.tsx` +- `frontend/src/components/transaction/TransactionSteps.tsx` +- `frontend/src/lib/transaction/TransactionTracker.ts` +- D3.js visualization utilities + +## 📚 Resources +- [D3.js Documentation](https://d3js.org/) +- [Stellar Transaction Lifecycle](https://developers.stellar.org/docs/learn/encyclopedia/transactions/transaction-lifecycle) +- [Stellar SDK Guide](https://stellar.github.io/js-stellar-sdk/) + +## 🎯 Success Metrics +- 80% of students use visualizer for transaction debugging +- Transaction understanding score improves by 50% +- Visualization renders in <500ms +- Zero performance issues with 100+ transactions""" + }, + 267: { + "title": "[Frontend] Dynamic Code Execution Sandbox with Resource Limits", + "body": """## �� Overview +**Labels**: `frontend` `complexity: hard` `eta-2-days` `security` +**Contributor Persona**: Frontend Expert (Requires expertise in Web Workers, sandboxed execution, and resource management) + +## 🎯 Problem Statement +Users need a safe environment to test Soroban smart contract code without risking system resources or security. The current playground lacks execution sandboxing and resource limits. + +## 📍 Current State +- No isolated execution environment +- Missing resource limits (CPU, memory, time) +- Potential security risks from untrusted code +- No execution timeout handling + +## ✨ Desired State +- Fully sandboxed code execution environment +- Configurable resource limits (CPU, memory, execution time) +- Secure isolation from main application +- Detailed execution metrics and error reporting + +## 🛠 Technical Requirements +- **Web Workers** for isolated execution +- Resource monitoring and limiting +- Secure code evaluation mechanisms + +## 📝 Task Breakdown + +### Phase 1: Sandbox Architecture (0.5 days) +- [ ] Implement Web Worker-based execution environment +- [ ] Create secure message passing between main thread and worker +- [ ] Design sandbox API for code execution +- [ ] Implement worker lifecycle management + +### Phase 2: Resource Limits (0.5 days) +- [ ] Add execution timeout (configurable, default 30s) +- [ ] Implement memory usage monitoring +- [ ] Create CPU usage tracking +- [ ] Add resource limit violation handling + +### Phase 3: Security Hardening (0.5 days) +- [ ] Sanitize code before execution +- [ ] Block dangerous APIs and operations +- [ ] Implement content security policies +- [ ] Add execution logging for audit trail + +### Phase 4: Execution Metrics (0.5 days) +- [ ] Track execution time and display to user +- [ ] Monitor memory consumption +- [ ] Create detailed error reporting +- [ ] Add execution history and replay + +## ✅ Acceptance Criteria +- [ ] Code executes in fully isolated environment +- [ ] Resource limits enforced and violations handled gracefully +- [ ] No security vulnerabilities in sandbox +- [ ] Execution metrics accurately reported +- [ ] Timeout prevents infinite loops +- [ ] Error messages are clear and actionable + +## 📁 Files to Create/Modify +- `frontend/src/lib/sandbox/CodeSandbox.ts` +- `frontend/src/lib/sandbox/SandboxWorker.js` +- `frontend/src/lib/sandbox/ResourceManager.ts` +- `frontend/src/components/sandbox/ExecutionMetrics.tsx` + +## 📚 Resources +- [Web Workers API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API) +- [Secure Code Evaluation Best Practices](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval) +- [Resource Limiting Strategies](https://web.dev/performance-best-practices-2020/) + +## 🎯 Success Metrics +- Zero security incidents from code execution +- Execution timeout works 100% of the time +- Resource usage stays within defined limits +- Execution metrics accuracy >95%""" + }, + 259: { + "title": "[Frontend] Real-time Collaborative Code Review System", + "body": """## 📋 Overview +**Labels**: `frontend` `complexity: hard` `eta-2-days` `collaboration` +**Contributor Persona**: Frontend Expert (Requires expertise in real-time collaboration, comment systems, and code review workflows) + +## 🎯 Problem Statement +Students and instructors lack a collaborative code review system within the IDE. Code reviews happen externally, breaking the learning workflow and losing context. + +## 📍 Current State +- No inline commenting on code +- Missing code review workflow +- External tools required for reviews +- No real-time collaboration on reviews + +## ✨ Desired State +- Inline code commenting system +- Real-time collaborative reviews +- Review request and approval workflow +- Threaded discussions on code sections + +## �� Technical Requirements +- Real-time collaboration via Yjs/WebSocket +- Code annotation and commenting system +- Review workflow state management + +## 📝 Task Breakdown + +### Phase 1: Inline Comments (0.5 days) +- [ ] Create inline comment UI components +- [ ] Implement comment positioning on code lines +- [ ] Add comment creation and editing +- [ ] Build comment thread system + +### Phase 2: Real-time Collaboration (0.5 days) +- [ ] Sync comments via Yjs +- [ ] Show other users' cursors and selections +- [ ] Implement real-time comment updates +- [ ] Add presence indicators for reviewers + +### Phase 3: Review Workflow (0.5 days) +- [ ] Create review request system +- [ ] Implement approval/rejection workflow +- [ ] Add review status indicators +- [ ] Build review summary dashboard + +### Phase 4: Advanced Features (0.5 days) +- [ ] Add code suggestion/diff view +- [ ] Implement @mentions and notifications +- [ ] Create review templates +- [ ] Add review history and analytics + +## ✅ Acceptance Criteria +- [ ] Users can add inline comments on any line +- [ ] Comments sync in real-time across all collaborators +- [ ] Review workflow functions end-to-end +- [ ] Threaded discussions work correctly +- [ ] Review status visible to all participants +- [ ] Notifications alert users to new comments + +## 📁 Files to Create/Modify +- `frontend/src/components/review/CodeReview.tsx` +- `frontend/src/components/review/InlineComment.tsx` +- `frontend/src/lib/review/ReviewManager.ts` +- `frontend/src/lib/review/CommentSync.ts` + +## 📚 Resources +- [Yjs Documentation](https://docs.yjs.dev/) +- [GitHub Code Review Best Practices](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/reviewing-changes-in-pull-requests/about-pull-request-reviews) +- [Real-time Collaboration Patterns](https://realtimepatterns.com/) + +## 🎯 Success Metrics +- >70% of assignments use built-in review system +- Comment creation time <2 seconds +- Real-time sync latency <500ms +- User satisfaction score >4.5/5""" + }, + 258: { + "title": "[Frontend] Multi-language Support with Dynamic Locale Switching", + "body": """## 📋 Overview +**Labels**: `frontend` `complexity: medium` `eta-2-days` `i18n` +**Contributor Persona**: Frontend Expert (Requires expertise in internationalization, localization, and React i18n patterns) + +## 🎯 Problem Statement +The application only supports English, limiting accessibility for non-English speaking students. There's no infrastructure for multi-language support or dynamic locale switching. + +## 📍 Current State +- All content hardcoded in English +- No i18n infrastructure in place +- Missing translation management system +- No locale detection or switching + +## ✨ Desired State +- Full internationalization support +- Dynamic locale switching without page reload +- Community-driven translation system +- Automatic locale detection based on browser settings + +## 🛠 Technical Requirements +- **next-i18next** or **react-i18next** for i18n +- Translation file management +- RTL language support architecture + +## 📝 Task Breakdown + +### Phase 1: i18n Setup (0.5 days) +- [ ] Install and configure i18n library +- [ ] Create translation file structure +- [ ] Extract all hardcoded strings to translation keys +- [ ] Implement language detection logic + +### Phase 2: Translation Management (0.5 days) +- [ ] Create translation files for initial languages (EN, ES, ZH) +- [ ] Build translation missing fallback system +- [ ] Add pluralization and interpolation support +- [ ] Implement date/number formatting per locale + +### Phase 3: Locale Switching (0.5 days) +- [ ] Create language selector component +- [ ] Implement dynamic locale switching +- [ ] Persist language preference to user profile +- [ ] Add RTL layout support for Arabic/Hebrew + +### Phase 4: Advanced Features (0.5 days) +- [ ] Add translation contribution interface +- [ ] Implement translation progress tracking +- [ ] Create locale-specific content routing +- [ ] Add automated translation validation + +## ✅ Acceptance Criteria +- [ ] All UI text translatable and translated +- [ ] Locale switching works without page reload +- [ ] Language preference persists across sessions +- [ ] RTL languages display correctly +- [ ] Dates, numbers, currencies formatted per locale +- [ ] Missing translations gracefully fallback + +## 📁 Files to Create/Modify +- `frontend/src/i18n/` directory structure +- `frontend/src/components/common/LanguageSelector.tsx` +- Translation JSON files for each locale +- Next.js i18n configuration + +## 📚 Resources +- [next-i18next Documentation](https://github.com/i18next/next-i18next) +- [RTL Layout Guide](https://rtlstyling.com/) +- [i18n Best Practices](https://www.i18next.com/) + +## 🎯 Success Metrics +- Support for 5+ languages +- Translation coverage >95% +- Locale switching time <100ms +- User adoption of non-English locales >30%""" + }, +} + +for issue_num, data in issues.items(): + print(f"Updating issue #{issue_num}...") + cmd = [ + "gh", "issue", "edit", str(issue_num), + "--title", data["title"], + "--body", data["body"] + ] + result = subprocess.run(cmd, capture_output=True, text=True) + if result.returncode == 0: + print(f"✓ Issue #{issue_num} updated successfully") + else: + print(f"✗ Issue #{issue_num} failed: {result.stderr}") + print() + +print("✅ Batch 2 complete!")