paper-dynasty-database/app/routers_v2/scout_opportunities.py
cal 77179d3c9c fix: clamp limit lower bound to 1 to prevent silent empty responses
Addresses reviewer feedback: max(0,...) admitted limit=0 which would
silently return no results even when matching records exist.
Changed to max(1,...) consistent with feedback on PRs #149 and #152.
2026-03-24 12:06:37 +00:00

1 line
5.3 KiB
Python

aW1wb3J0IGpzb24KZnJvbSBkYXRldGltZSBpbXBvcnQgZGF0ZXRpbWUKZnJvbSBmYXN0YXBpIGltcG9ydCBBUElSb3V0ZXIsIERlcGVuZHMsIEhUVFBFeGNlcHRpb24KZnJvbSB0eXBpbmcgaW1wb3J0IE9wdGlvbmFsLCBMaXN0CmltcG9ydCBsb2dnaW5nCmltcG9ydCBweWRhbnRpYwoKZnJvbSAuLmRiX2VuZ2luZSBpbXBvcnQgU2NvdXRPcHBvcnR1bml0eSwgU2NvdXRDbGFpbSwgbW9kZWxfdG9fZGljdApmcm9tIC4uZGVwZW5kZW5jaWVzIGltcG9ydCBvYXV0aDJfc2NoZW1lLCB2YWxpZF90b2tlbgoKcm91dGVyID0gQVBJUm91dGVyKHByZWZpeD0iL2FwaS92Mi9zY291dF9vcHBvcnR1bml0aWVzIiwgdGFncz1bInNjb3V0X29wcG9ydHVuaXRpZXMiXSkKCgpjbGFzcyBTY291dE9wcG9ydHVuaXR5TW9kZWwocHlkYW50aWMuQmFzZU1vZGVsKToKICAgIHBhY2tfaWQ6IE9wdGlvbmFsW2ludF0gPSBOb25lCiAgICBvcGVuZXJfdGVhbV9pZDogaW50CiAgICBjYXJkX2lkczogTGlzdFtpbnRdCiAgICBleHBpcmVzX2F0OiBpbnQKICAgIGNyZWF0ZWQ6IE9wdGlvbmFsW2ludF0gPSBOb25lCgoKZGVmIG9wcG9ydHVuaXR5X3RvX2RpY3Qob3BwLCByZWN1cnNlPVRydWUpOgogICAgIiIiQ29udmVydCBhIFNjb3V0T3Bwb3J0dW5pdHkgdG8gZGljdCB3aXRoIGNhcmRfaWRzIGRlc2VyaWFsaXplZC4iIiIKICAgIHJlc3VsdCA9IG1vZGVsX3RvX2RpY3Qob3BwLCByZWN1cnNlPXJlY3Vyc2UpCiAgICBpZiBpc2luc3RhbmNlKHJlc3VsdC5nZXQoImNhcmRfaWRzIiksIHN0cik6CiAgICAgICAgcmVzdWx0WyJjYXJkX2lkcyJdID0ganNvbi5sb2FkcyhyZXN1bHRbImNhcmRfaWRzIl0pCiAgICByZXR1cm4gcmVzdWx0CgoKQHJvdXRlci5nZXQoIiIpCmFzeW5jIGRlZiBnZXRfc2NvdXRfb3Bwb3J0dW5pdGllcygKICAgIGNsYWltZWQ6IE9wdGlvbmFsW2Jvb2xdID0gTm9uZSwKICAgIGV4cGlyZWRfYmVmb3JlOiBPcHRpb25hbFtpbnRdID0gTm9uZSwKICAgIG9wZW5lcl90ZWFtX2lkOiBPcHRpb25hbFtpbnRdID0gTm9uZSwKICAgIGxpbWl0OiBPcHRpb25hbFtpbnRdID0gMTAwLAopOgoKICAgIGxpbWl0ID0gbWF4KDEsIG1pbihsaW1pdCwgNTAwKSkKICAgIHF1ZXJ5ID0gU2NvdXRPcHBvcnR1bml0eS5zZWxlY3QoKS5vcmRlcl9ieShTY291dE9wcG9ydHVuaXR5LmlkKQoKICAgIGlmIG9wZW5lcl90ZWFtX2lkIGlzIG5vdCBOb25lOgogICAgICAgIHF1ZXJ5ID0gcXVlcnkud2hlcmUoU2NvdXRPcHBvcnR1bml0eS5vcGVuZXJfdGVhbV9pZCA9PSBvcGVuZXJfdGVhbV9pZCkKCiAgICBpZiBleHBpcmVkX2JlZm9yZSBpcyBub3QgTm9uZToKICAgICAgICBxdWVyeSA9IHF1ZXJ5LndoZXJlKFNjb3V0T3Bwb3J0dW5pdHkuZXhwaXJlc19hdCA8IGV4cGlyZWRfYmVmb3JlKQoKICAgIGlmIGNsYWltZWQgaXMgbm90IE5vbmU6CiAgICAgICAgIyBDaGVjayB3aGV0aGVyIGFueSBzY291dF9jbGFpbXMgZXhpc3QgZm9yIGVhY2ggb3Bwb3J0dW5pdHkKICAgICAgICBjbGFpbV9zdWJxdWVyeSA9IFNjb3V0Q2xhaW0uc2VsZWN0KFNjb3V0Q2xhaW0uc2NvdXRfb3Bwb3J0dW5pdHkpCiAgICAgICAgaWYgY2xhaW1lZDoKICAgICAgICAgICAgcXVlcnkgPSBxdWVyeS53aGVyZShTY291dE9wcG9ydHVuaXR5LmlkLmluXyhjbGFpbV9zdWJxdWVyeSkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcXVlcnkgPSBxdWVyeS53aGVyZShTY291dE9wcG9ydHVuaXR5LmlkLm5vdF9pbihjbGFpbV9zdWJxdWVyeSkpCgogICAgcXVlcnkgPSBxdWVyeS5saW1pdChsaW1pdCkKICAgIHJlc3VsdHMgPSBbb3Bwb3J0dW5pdHlfdG9fZGljdCh4LCByZWN1cnNlPUZhbHNlKSBmb3IgeCBpbiBxdWVyeV0KICAgIHJldHVybiB7ImNvdW50IjogbGVuKHJlc3VsdHMpLCAicmVzdWx0cyI6IHJlc3VsdHN9CgoKQHJvdXRlci5nZXQoIi97b3Bwb3J0dW5pdHlfaWR9IikKYXN5bmMgZGVmIGdldF9vbmVfc2NvdXRfb3Bwb3J0dW5pdHkob3Bwb3J0dW5pdHlfaWQ6IGludCk6CiAgICB0cnk6CiAgICAgICAgb3BwID0gU2NvdXRPcHBvcnR1bml0eS5nZXRfYnlfaWQob3Bwb3J0dW5pdHlfaWQpCiAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oCiAgICAgICAgICAgIHN0YXR1c19jb2RlPTQwNCwKICAgICAgICAgICAgZGV0YWlsPWYiTm8gc2NvdXQgb3Bwb3J0dW5pdHkgZm91bmQgd2l0aCBpZCB7b3Bwb3J0dW5pdHlfaWR9IiwKICAgICAgICApCgogICAgcmV0dXJuIG9wcG9ydHVuaXR5X3RvX2RpY3Qob3BwKQoKCkByb3V0ZXIucG9zdCgiIikKYXN5bmMgZGVmIHBvc3Rfc2NvdXRfb3Bwb3J0dW5pdHkoCiAgICBvcHBvcnR1bml0eTogU2NvdXRPcHBvcnR1bml0eU1vZGVsLCB0b2tlbjogc3RyID0gRGVwZW5kcyhvYXV0aDJfc2NoZW1lKQopOgogICAgaWYgbm90IHZhbGlkX3Rva2VuKHRva2VuKToKICAgICAgICBsb2dnaW5nLndhcm5pbmcoZiJCYWQgVG9rZW46IHt0b2tlbn0iKQogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oCiAgICAgICAgICAgIHN0YXR1c19jb2RlPTQwMSwKICAgICAgICAgICAgZGV0YWlsPSJZb3UgYXJlIG5vdCBhdXRob3JpemVkIHRvIHBvc3Qgc2NvdXQgb3Bwb3J0dW5pdGllcy4gVGhpcyBldmVudCBoYXMgYmVlbiBsb2dnZWQuIiwKICAgICAgICApCgogICAgb3BwX2RhdGEgPSBvcHBvcnR1bml0eS5kaWN0KCkKICAgIG9wcF9kYXRhWyJjYXJkX2lkcyJdID0ganNvbi5kdW1wcyhvcHBfZGF0YVsiY2FyZF9pZHMiXSkKICAgIGlmIG9wcF9kYXRhWyJjcmVhdGVkIl0gaXMgTm9uZToKICAgICAgICBvcHBfZGF0YVsiY3JlYXRlZCJdID0gaW50KGRhdGV0aW1lLnRpbWVzdGFtcChkYXRldGltZS5ub3coKSkgKiAxMDAwKQoKICAgIHRoaXNfb3BwID0gU2NvdXRPcHBvcnR1bml0eSgqKm9wcF9kYXRhKQogICAgc2F2ZWQgPSB0aGlzX29wcC5zYXZlKCkKCiAgICBpZiBzYXZlZCA9PSAxOgogICAgICAgIHJldHVybiBvcHBvcnR1bml0eV90b19kaWN0KHRoaXNfb3BwKQogICAgZWxzZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKHN0YXR1c19jb2RlPTQxOCwgZGV0YWlsPSJDb3VsZCBub3Qgc2F2ZSBzY291dCBvcHBvcnR1bml0eSIpCgoKQHJvdXRlci5kZWxldGUoIi97b3Bwb3J0dW5pdHlfaWR9IikKYXN5bmMgZGVmIGRlbGV0ZV9zY291dF9vcHBvcnR1bml0eSgKICAgIG9wcG9ydHVuaXR5X2lkOiBpbnQsIHRva2VuOiBzdHIgPSBEZXBlbmRzKG9hdXRoMl9zY2hlbWUpCik6CiAgICBpZiBub3QgdmFsaWRfdG9rZW4odG9rZW4pOgogICAgICAgIGxvZ2dpbmcud2FybmluZyhmIkJhZCBUb2tlbjoge3Rva2VufSIpCiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbigKICAgICAgICAgICAgc3RhdHVzX2NvZGU9NDAxLAogICAgICAgICAgICBkZXRhaWw9IllvdSBhcmUgbm90IGF1dGhvcml6ZWQgdG8gZGVsZXRlIHNjb3V0IG9wcG9ydHVuaXRpZXMuIFRoaXMgZXZlbnQgaGFzIGJlZW4gbG9nZ2VkLiIsCiAgICAgICAgKQogICAgdHJ5OgogICAgICAgIG9wcCA9IFNjb3V0T3Bwb3J0dW5pdHkuZ2V0X2J5X2lkKG9wcG9ydHVuaXR5X2lkKQogICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKAogICAgICAgICAgICBzdGF0dXNfY29kZT00MDQsCiAgICAgICAgICAgIGRldGFpbD1mIk5vIHNjb3V0IG9wcG9ydHVuaXR5IGZvdW5kIHdpdGggaWQge29wcG9ydHVuaXR5X2lkfSIsCiAgICAgICAgKQoKICAgIGNvdW50ID0gb3BwLmRlbGV0ZV9pbnN0YW5jZSgpCiAgICBpZiBjb3VudCA9PSAxOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oCiAgICAgICAgICAgIHN0YXR1c19jb2RlPTIwMCwKICAgICAgICAgICAgZGV0YWlsPWYiU2NvdXQgb3Bwb3J0dW5pdHkge29wcG9ydHVuaXR5X2lkfSBoYXMgYmVlbiBkZWxldGVkIiwKICAgICAgICApCiAgICBlbHNlOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oCiAgICAgICAgICAgIHN0YXR1c19jb2RlPTUwMCwKICAgICAgICAgICAgZGV0YWlsPWYiU2NvdXQgb3Bwb3J0dW5pdHkge29wcG9ydHVuaXR5X2lkfSB3YXMgbm90IGRlbGV0ZWQiLAogICAgICAgICkK