diff --git a/.speakeasy/gen.lock b/.speakeasy/gen.lock index bfe19776..6b1426e7 100644 --- a/.speakeasy/gen.lock +++ b/.speakeasy/gen.lock @@ -1,25 +1,25 @@ lockVersion: 2.0.0 id: bfe29c99-6e67-43fe-b928-64d6a5ed6aa8 management: - docChecksum: 0287e8de7608f4dc4fbbea8b43cf9a7b + docChecksum: 8b01195a0766b4a09bfcde384b218b0d docVersion: "2025-11-10" - speakeasyVersion: 1.675.4 - generationVersion: 2.779.2 - releaseVersion: 4.2.0 - configChecksum: b1fe406888b77cfb62c3d99dc9a485ff + speakeasyVersion: 1.700.2 + generationVersion: 2.801.2 + releaseVersion: 4.2.1 + configChecksum: 430005f7b3039eac87da134a2c01d44d repoURL: https://github.com/clerk/clerk-sdk-python.git installationURL: https://github.com/clerk/clerk-sdk-python.git published: true persistentEdits: - generation_id: eff32e01-f0ed-4067-b833-0d1501a86cd8 - pristine_commit_hash: 02fc710ca46f4ada60271f80f7098701b4764c29 - pristine_tree_hash: ae88024246fb0f804f9f0ef3b5075472b6d03ddc + generation_id: f2f09f22-7826-4eb0-8754-7662929790f4 + pristine_commit_hash: 0ab2c32dada4cc0eec42fcd648cbcd0e096cdaab + pristine_tree_hash: eceac91008646365f5ba12e9faaa7846de9fd2a5 features: python: additionalDependencies: 1.0.0 additionalProperties: 1.0.1 constsAndDefaults: 1.0.5 - core: 5.23.13 + core: 5.23.18 customCodeRegions: 0.1.1 defaultEnabledRetries: 0.2.0 deprecations: 3.0.2 @@ -36,12 +36,12 @@ features: methodArguments: 1.0.2 multipartFileContentType: 1.0.0 nameOverrides: 3.0.1 - nullables: 1.0.1 - openEnums: 1.0.1 + nullables: 1.0.2 + openEnums: 1.0.3 responseFormat: 1.0.1 retries: 3.0.3 - sdkHooks: 1.2.0 - unions: 3.1.1 + sdkHooks: 1.2.1 + unions: 3.1.2 uploadStreams: 1.0.0 trackedFiles: .gitattributes: @@ -80,6 +80,14 @@ trackedFiles: id: ca45ef327f10 last_write_checksum: sha1:16498328861fbc9d2d338377144a328378ba1f91 pristine_git_object: 34cd2dadb223860f283d4d8668586b43717991ea + docs/models/addrolestorolesetrequest.md: + id: 6a250e3c76ea + last_write_checksum: sha1:ccead16d6785475e47280bcf55d3b99a4bf36984 + pristine_git_object: 5f55abf3bdda72f88222b072f5d0c273fccf9205 + docs/models/addrolestorolesetrequestbody.md: + id: 5edda3a527f3 + last_write_checksum: sha1:22ceb69d7787c3e7fc7e3cfc307b6d35dea0bd00 + pristine_git_object: faa7449f8505c6513777c11dcab1ce425a43b842 docs/models/admin.md: id: 901b28ee785f last_write_checksum: sha1:f9a9ec7079fb6391aa0cffe100cac8b146b46db3 @@ -252,6 +260,26 @@ trackedFiles: id: 01a815f37af4 last_write_checksum: sha1:f90bc321fcc4abe06d5476ec4d163fbda69eb4f3 pristine_git_object: 5fd27e3ccc4530897406ac6eafe078f924880a15 + docs/models/commercepriceresponse.md: + id: ba8679c3aa94 + last_write_checksum: sha1:dc26094fc33af8fc9f3f0cd1f12fc69291ac17ee + pristine_git_object: daddf4282686e86e4d07c4bc38f90c686654ac4d + docs/models/commercepriceresponseobject.md: + id: 82be7ff0a538 + last_write_checksum: sha1:0ed8765f1a8bb54d39b76c2aa270de6882952310 + pristine_git_object: 7bb2ba63003a504e48fdd04731791b42fc8f65d6 + docs/models/commercepricetransitiondetails.md: + id: e1a67a698e50 + last_write_checksum: sha1:cc7797119cd28e73779efbcccbc4f85eb3392c60 + pristine_git_object: 5e83fabac89b6a786664be469b20354c336dbc79 + docs/models/commercepricetransitionresponse.md: + id: ab7d1555f2fd + last_write_checksum: sha1:5e9974a82ea6edf97168c9ec0769fbd67fe55a8b + pristine_git_object: 04213ba41b25a60af45b1ebd3600434bf07b21c3 + docs/models/commercepricetransitionresponseobject.md: + id: 47ce4b946ed3 + last_write_checksum: sha1:34fd99a44eb0a2a873a3b8e19beff20a4bd4cf9a + pristine_git_object: bcf5af7b527692d707be311cb3e516fe3b07ed4d docs/models/commercesubscription.md: id: 361cee759b70 last_write_checksum: sha1:9094c0aa0f7ce392f9ee1475c0a05546872e2c01 @@ -262,8 +290,8 @@ trackedFiles: pristine_git_object: 65b9e27bfbecf38f0bb384d20d9cc049fe510947 docs/models/commercesubscriptionitem.md: id: b9fbc7f15c99 - last_write_checksum: sha1:7aacfb1fb3ff54665604e3e261cc75f2c1de60bc - pristine_git_object: c31a81db8de62fcc16f236920ec33005646f1758 + last_write_checksum: sha1:5aa1753f2f6f06fba4bb0eec5f1907c077b27151 + pristine_git_object: da17de960d46b2b7a171d24bab56befa56824590 docs/models/commercesubscriptionitemamount.md: id: 1707cf10af87 last_write_checksum: sha1:c7e591e269ada11d072bae979c33fc4d9d4a2591 @@ -342,8 +370,12 @@ trackedFiles: pristine_git_object: 67824999722616765b79381035bd3f8960e39ce1 docs/models/createapikeyresponsebody.md: id: e097b5805b0b - last_write_checksum: sha1:ca04ad5666556b29ea5a59e089d51ba2eae059e1 - pristine_git_object: 87c07004bba5702ded1724fe8be681fb8b60d26c + last_write_checksum: sha1:78aa98f2594bbbba47e46a13aef3fc993ac990e2 + pristine_git_object: 96b07c78918917b576fb8694272198a2991dc840 + docs/models/createbillingpricetransitionrequest.md: + id: 2f54882189ae + last_write_checksum: sha1:351cd681d4e927f0b39d172358a2959d7391d856 + pristine_git_object: 397502bab27e0fe0dab4351ef1a8951d75949fd4 docs/models/createblocklistidentifierrequestbody.md: id: b9bdf1e9d1e0 last_write_checksum: sha1:22944e17a963036c016d6e51a4a9bdb6ca29d684 @@ -394,12 +426,12 @@ trackedFiles: pristine_git_object: 6fbf1e694cb7ba8648a92869c863883cee0f2685 docs/models/createm2mtokenresponsebody.md: id: 6db128c5d0b2 - last_write_checksum: sha1:52d0a0fe824b01819b76fd75894df9aeed1b9ea3 - pristine_git_object: 4f970e8ed33eb42bc52a45c38c5def61385a4adb + last_write_checksum: sha1:a005c5649a7fa3f6ab54eeb007f0cf14cb10ee0a + pristine_git_object: 93ee10e5621d3bde3cae9b9a9e782ab9e05f33e7 docs/models/createmachinerequestbody.md: id: 08e58089a5cc - last_write_checksum: sha1:c53dd4c88768179675f60c586ddd3779ca76c725 - pristine_git_object: 2f76374ebaeb02ce14f816f5d769f898a6bdf6cb + last_write_checksum: sha1:50a4af99593ba1b0dc4cde6d2c8b53e3f3e813e3 + pristine_git_object: 9d66e5b1e53de0eee54521c4b32f6d55a8dfb2bc docs/models/createmachinescoperequest.md: id: 950dd3ce4a9b last_write_checksum: sha1:1aa4b48a1f62d924b3754eaa70aabab03acd3c6a @@ -426,16 +458,16 @@ trackedFiles: pristine_git_object: 54a9b1f75f32a666fb14a43550a6c8455da4b1eb docs/models/createorganizationinvitationbulkrequestbody.md: id: fa1f275947a6 - last_write_checksum: sha1:11aa77e53ee717ba74755201ff591a6042eface6 - pristine_git_object: dff1e827fdbb400dd539a7fbab3aeda6cda2e857 + last_write_checksum: sha1:dbc3271d608ec303e5eee63358438eb5f00cc53f + pristine_git_object: 444cd02521caecacd3dea02454a01ee6027be142 docs/models/createorganizationinvitationrequest.md: id: 3db063c2e2d7 last_write_checksum: sha1:34035306ef154dec743c4a7b3813a5167f1d5c0b pristine_git_object: e5e0eaa125afc1f65eeaadd30721aba52d790bab docs/models/createorganizationinvitationrequestbody.md: id: f93d492f5dda - last_write_checksum: sha1:9a7092659790c4033cad21ed6a33de2d6b080d46 - pristine_git_object: 2c4e102c99dddf7a4c6acf690fa9507430829f43 + last_write_checksum: sha1:487038e157f3459cc79b36c2cfd84411ba755ca2 + pristine_git_object: 150dd2debdda9002a0a729c3b231d17fceba13f7 docs/models/createorganizationmembershiprequest.md: id: 99fb9f4a43eb last_write_checksum: sha1:d6fed879abb8db56e2b244899f9b23bec751f4c4 @@ -464,6 +496,14 @@ trackedFiles: id: 4685b15a3abf last_write_checksum: sha1:1a1b4edc3c5010f3fbdcf9d7007d1a63a3ff241c pristine_git_object: 80f8e3f9be41fd4c1a28469c3d64905e87424161 + docs/models/createrolesetrequestbody.md: + id: 20179b65a27b + last_write_checksum: sha1:2ec8afc6c3f895d83a804d885f993965737d8afc + pristine_git_object: c8dff7c251684fc9a2390aa508e3889c4d8f16cb + docs/models/createrolesettype.md: + id: 498d77738048 + last_write_checksum: sha1:26d8a0b7d37ea008dbeaaf1df46d16167cf7e437 + pristine_git_object: 7b54ed42926251659f6e5128745b64e4680a31d2 docs/models/createsamlconnectionrequestbody.md: id: 758091a52cf1 last_write_checksum: sha1:fbcda102b082d789377bf4dd76464b2ce15cafd2 @@ -514,20 +554,28 @@ trackedFiles: pristine_git_object: aba9df9901592d507551828248e22b3f9e0695db docs/models/createuserrequestbody.md: id: 39d743a30444 - last_write_checksum: sha1:b481cb542a47d7a10cf9141267dbb01c700cde26 - pristine_git_object: 4b4fa5f39d76314acc93ee300848f36d75c04f84 + last_write_checksum: sha1:f7e0aaeb46adb2eb23f70da636c5a4436a4f27b9 + pristine_git_object: dfd3b956281ef6247640924054a636272bc3b19d docs/models/createwaitlistentryrequestbody.md: id: 181ff2ee24c2 last_write_checksum: sha1:65f994c81871aa15c81f31fdca105e6831cc87c8 pristine_git_object: 1c0aa8b7571f7a2a553e4fbd884221be84ad994c + docs/models/creatorrole.md: + id: e09c8bd2000a + last_write_checksum: sha1:a7b43bb5bfb2bdd53fa82f0410e2ee39742fa52e + pristine_git_object: d246737c144b05e81e8624cbdcbc26e0d2789738 docs/models/credit.md: id: c1a47bcd81f9 last_write_checksum: sha1:d0ffed761f218c87ddc174575570d24025efd7bd pristine_git_object: 862e791867a1492d3bad5e04146e456e4d344a4a docs/models/data.md: id: 9a31987caf78 - last_write_checksum: sha1:67b95837131f3bf7b79bcc896aaff6c559d7c3b8 - pristine_git_object: f8f70bc41e0d5a3803927ab0cfb6c7dae418df48 + last_write_checksum: sha1:b1fda835a4dde5725d68615b0cf7eedfe06bab9f + pristine_git_object: 6d52499cd6b41680e7eb99224d310b9b89af92df + docs/models/defaultrole.md: + id: 7233f673a8d1 + last_write_checksum: sha1:20dac796cb18a91f903ccfdb3ac5833f0796ae81 + pristine_git_object: 80043f0e5917c76b4623e4840a14e6a4c69a159e docs/models/deleteallowlistidentifierrequest.md: id: 4bd0d3fd7661 last_write_checksum: sha1:7ecd41292b31a19615f65f41d98d7f76a336d388 @@ -684,6 +732,10 @@ trackedFiles: id: 4e588929b81e last_write_checksum: sha1:b92a0a1f722103ea955842c5259b3152c7e30ac9 pristine_git_object: 5af92ef44b096dc626886c5ef9b0ffa2071a01ea + docs/models/effectivemode.md: + id: 7e6572459bba + last_write_checksum: sha1:daf6949f169f09cb39e57633c41db3c8cbaca86a + pristine_git_object: 2bca7a100e6066dd2c62c2513eaa8478fa86057c docs/models/emailaddress.md: id: d59acccbf5a1 last_write_checksum: sha1:bfd8b6f17c1441c50b6a5dea3e7cf4933740518c @@ -814,8 +866,8 @@ trackedFiles: pristine_git_object: 6228c000009936f46265a061e05db1010181fc96 docs/models/getapikeyresponsebody.md: id: b4c593431ad3 - last_write_checksum: sha1:84a484eb039f556aced6bfe052b6fb435b8eee81 - pristine_git_object: 8c495b4ecac92ee79dc8bf8955e5552e5539913e + last_write_checksum: sha1:074ac9ce20e9413398d913bfcad9c953c15d8dcb + pristine_git_object: d0a3fdf783d0dbf4c188fb809e235763bf0b9f46 docs/models/getapikeysapikeyserrors.md: id: 3b8c5c8dcc03 last_write_checksum: sha1:c97ce6e19eed5f9f4ba8a0d9148a4854be06ccd7 @@ -992,6 +1044,10 @@ trackedFiles: id: ffe098d7b069 last_write_checksum: sha1:a66df96196f3b7abae731ce594cb5c137f29a6d3 pristine_git_object: 25cd11de713d3b465fbe04fc010123f7eeae6c84 + docs/models/getrolesetrequest.md: + id: ee987695e9fd + last_write_checksum: sha1:4595bc54de34c7955a7207bd826091ecfec7fb39 + pristine_git_object: ce170b475b8a4828d6f0330f4199253ac408f208 docs/models/getsamlconnectionrequest.md: id: 62a7232c274f last_write_checksum: sha1:ff0095e2afbb249e73163da8171b2ad17020d6fd @@ -1048,6 +1104,10 @@ trackedFiles: id: 7a3d4b61b0bf last_write_checksum: sha1:6f28473c5b6ee54cf81f7bf39f488dab124fb180 pristine_git_object: 40d4d41eb1068143ae4e9663166923001a55bf36 + docs/models/immediatecharge.md: + id: b71d72c13442 + last_write_checksum: sha1:9b26e55086b000acfbc4432557d07755f201017b + pristine_git_object: 739574b0a55641acef19494736744255fd398095 docs/models/includeinvalid.md: id: f6ec0ead84d0 last_write_checksum: sha1:7011db490d0a13c97b1b2e9bb0f00e8f924191b1 @@ -1064,6 +1124,14 @@ trackedFiles: id: 54350ac395c2 last_write_checksum: sha1:b3c5bf60b926e052fa8caaa2bc547ea7ee003577 pristine_git_object: 808ebf94a5f5ae6d97bdcc1d08b6e15bfd24eca9 + docs/models/instanceprotect.md: + id: e5c5b3f574c4 + last_write_checksum: sha1:98a4caef29abea6f6f31dd9214b07289733279a7 + pristine_git_object: d5cea66e29277b63f2e8548fdbdcda980c17baf3 + docs/models/instanceprotectobject.md: + id: 0e9e3abf5631 + last_write_checksum: sha1:5654b02c927b445d03e6866ae74dc646e9ddb726 + pristine_git_object: 78515e941bef058cec4257d2c0f048ca062124a4 docs/models/instancerestrictions.md: id: 59c66ed7ef8f last_write_checksum: sha1:7d525c204e260b358d4115e24aa18ae43b88aa31 @@ -1204,6 +1272,10 @@ trackedFiles: id: eb2bf612ee15 last_write_checksum: sha1:96fc94907a6e3dcae3e0279a3ce3f087504b829c pristine_git_object: 0ba69b50c067735e8196281168bbe94cf20384c5 + docs/models/listrolesetsrequest.md: + id: d6a638463a63 + last_write_checksum: sha1:fc0fc395bbd240520872cdaeefd8fe16805ac4f4 + pristine_git_object: f0b4a5d8b030304df052e4777445fe0eb724d862 docs/models/listsamlconnectionsrequest.md: id: 1b516a9d408e last_write_checksum: sha1:cb6d2d4afd54c55c63b938cf88649138f4e814b6 @@ -1222,8 +1294,8 @@ trackedFiles: pristine_git_object: d1fb842789202e85461741c5ba187a6ffe745b43 docs/models/m2mtokens.md: id: 6f55325a39a2 - last_write_checksum: sha1:7391bd865089e42e5e1c9bf090ef35a1433bf038 - pristine_git_object: 4fc88e04f9710ce97668acd7e30d6363d508521b + last_write_checksum: sha1:89f164dd35a4fba8a4856ba65064fb07aefd1d92 + pristine_git_object: 1b816a4dbe3c0edd4a3d3e1cacb516bfa3e71665 docs/models/machine.md: id: efe0fffed699 last_write_checksum: sha1:c8ef4d7671475da1f21a1c4b5950347b956870bb @@ -1318,8 +1390,8 @@ trackedFiles: pristine_git_object: 6bf459915ff8f486b18e11349339625eccef154d docs/models/oauthaccesstoken.md: id: 79a48f12284a - last_write_checksum: sha1:2656449ccf9471e09ad250dbcdbabcfcc953d160 - pristine_git_object: 1bee722aa919491484636b5f7dd3e1fd422ef747 + last_write_checksum: sha1:3f854ed52c0f8942e58db48637aaf1908696a001 + pristine_git_object: b5cfd92156b93f9734a1a427a4c31a78176c84e6 docs/models/oauthaccesstokenobject.md: id: 713699c4af40 last_write_checksum: sha1:fc72b8bcf7fbef3453960703dff9b25ae80a11af @@ -1560,6 +1632,14 @@ trackedFiles: id: b9b3b7c89360 last_write_checksum: sha1:a9f1c9016885437dedc5f22a561d225c82a70cb8 pristine_git_object: b930c48f83ab6aefe21477331b9c0d8ed13ac946 + docs/models/previoussubscriptionitemstatus.md: + id: f35706530fa4 + last_write_checksum: sha1:fc6024cd773d37ee771c5da38bdec0c94421f668 + pristine_git_object: 86033b3078773252a22d647a39e83945511d1429 + docs/models/pricetransitionrequest.md: + id: be99eaddf6b2 + last_write_checksum: sha1:38db0d54f9fea918c40f2f0534844ebdb340718e + pristine_git_object: 0261adefb3faaf916fa95ebe68950978eca137c8 docs/models/protocol.md: id: 8174c2e84624 last_write_checksum: sha1:cbef57e0caea0b19fd9e98680c18b23a16e5442b @@ -1616,6 +1696,22 @@ trackedFiles: id: "189798591810" last_write_checksum: sha1:4092d110a103a7389bc4f817e48a8a0d352bcb1c pristine_git_object: 81169c89fb2fe04e53c8fa26e64b9c9e82c1d835 + docs/models/replaceroleinrolesetrequest.md: + id: ea2a31b1c6d6 + last_write_checksum: sha1:fb850774daff274c74ee4718c80cff2f693ee88d + pristine_git_object: d5113e37e5e94fb704f9a734410571af1766d6e6 + docs/models/replaceroleinrolesetrequestbody.md: + id: 98c7a2053b1c + last_write_checksum: sha1:1a1a1b8d27d03b77e28ce5cb5fcd0571a5b10de9 + pristine_git_object: 8c850d476adb69db3278354cfeed24c07eb4aa01 + docs/models/replacerolesetrequest.md: + id: 483e051daf3f + last_write_checksum: sha1:777eacc29d72a4674c4602b3215b689cab7dc474 + pristine_git_object: 6ec4d6c44027c9a90462cd066c528ec040cd8bb0 + docs/models/replacerolesetrequestbody.md: + id: dfb65f27414d + last_write_checksum: sha1:db80464f25eb7f380b09c1bb798ad1e57d47acc1 + pristine_git_object: 44aedc6069eff9adbd67411a14d6c1b299818a81 docs/models/requestbody.md: id: a15f5440d48c last_write_checksum: sha1:46ba85e6ce1ece116954e5612ea4f5a5dfd61573 @@ -1690,8 +1786,8 @@ trackedFiles: pristine_git_object: c9c62644f906366a0776e580052103e65a964e64 docs/models/revokeapikeyresponsebody.md: id: bceb964f5493 - last_write_checksum: sha1:d59a7f25421ee14d81a71b6289d14c58aee3ef8b - pristine_git_object: ac4bf540daf096f862ae8fd23a5743d1dd33e9b1 + last_write_checksum: sha1:92c5ad37fcca774ecfad032578c08116650d0236 + pristine_git_object: 66c29300f7899b8c6eb90479ed034b016699e380 docs/models/revokeinvitationrequest.md: id: 4d7e53fb4c55 last_write_checksum: sha1:481b1732aa3f0d969e78ea9b466c61b8eadca472 @@ -1726,8 +1822,8 @@ trackedFiles: pristine_git_object: d3033eaf637def047dcd885addcce0b7de5d8ed6 docs/models/revokem2mtokenresponsebody.md: id: cc9437069e79 - last_write_checksum: sha1:9605ebf6487e8e91defbeaf9de57979050f93da5 - pristine_git_object: 0315730b73ba5935ccb69d1ebfcdf54bd77edcf2 + last_write_checksum: sha1:12846dab34a82482ce4423553d574205dc9fe2c6 + pristine_git_object: 91ebf6fe6111455cc061583a48682a459d0e7aec docs/models/revokeorganizationinvitationrequest.md: id: a7917c689c76 last_write_checksum: sha1:2d70ca154e4635e076b274f55ce71d9780cfc76b @@ -1756,6 +1852,42 @@ trackedFiles: id: 2af79e204ed6 last_write_checksum: sha1:9416fe8208c489d7a119357782572bb4631132aa pristine_git_object: e6f2bb6e7942b54edce3e0f27f56bf8488646952 + docs/models/roleset.md: + id: cc9408fdb6ef + last_write_checksum: sha1:887df975ea401b514ac55ce8360735578e164e8c + pristine_git_object: c8acfcb35a65160b164b8c1f39954848fe4333c0 + docs/models/rolesetcreatorroleobject.md: + id: ec8d76701a65 + last_write_checksum: sha1:4fe67c79df3c750ac3bf0b147a23865d7d48bb6a + pristine_git_object: a108279a1a220c31faba90d9ab74b48d3c669d2f + docs/models/rolesetdefaultroleobject.md: + id: 34cc3389b0e6 + last_write_checksum: sha1:97a601631afd57b3450b36c157e6d58422a2daf7 + pristine_git_object: 5df9b4c0d5a3819c0b867b10765b267d51b8d50e + docs/models/rolesetitem.md: + id: 70777978b48e + last_write_checksum: sha1:3677d371c2c201f44814d901f51f4a0555c733b9 + pristine_git_object: bce1454b44f0448a88592ad1ff6987b39e558052 + docs/models/rolesetitemobject.md: + id: 4a4113366f05 + last_write_checksum: sha1:d4954e319e0bf792510f69f60b6f1a60f5b4e7c6 + pristine_git_object: f42ab724a159a1acc6647497e9604a71e43787b4 + docs/models/rolesetmigration.md: + id: 05596c781a55 + last_write_checksum: sha1:927c0e8fe9a39713afad9b1d62bb36447cc609e9 + pristine_git_object: 3a339c7c0aa6932c12043e9980a1cf2b74347d45 + docs/models/rolesetobject.md: + id: f5af4cdf097d + last_write_checksum: sha1:d519aa5892dea855a423415048e47ed734a7545f + pristine_git_object: 06fb7253828f5c7d31089afb8ad015320533b95d + docs/models/rolesetrolesetmigrationobject.md: + id: 00624a6b5e3a + last_write_checksum: sha1:9c1b1064394fb01d8c69e65a6d94037a1cc6c5bb + pristine_git_object: 7449a0b3557b379b1f8ec04f43d9ddff6663e082 + docs/models/rolesets.md: + id: 6668f9469afb + last_write_checksum: sha1:fc7130d1b99378aac027091e25501b41e29f20fa + pristine_git_object: 4f8f7d7585e57cb998fb29e2b68baf0e78a33480 docs/models/rotatemachinesecretkeyrequest.md: id: f06a22bf60f3 last_write_checksum: sha1:3b41509b12f478b6d51befc4716e5c841348a8f4 @@ -1808,10 +1940,18 @@ trackedFiles: id: b25ca6ab8bd3 last_write_checksum: sha1:a53d2b2b1174e0f68feb2fd506a7168418b91ff3 pristine_git_object: 7c175e9f24de246ecc1eadf8d597b2ac39f9d742 + docs/models/schemascommerceplan.md: + id: e31fed3b5ba6 + last_write_checksum: sha1:da8ad5898a51e8a33d1875442f65fefc88cd0cd9 + pristine_git_object: 2893aa190f4bfac932e26b0b44de127f5e3d388e + docs/models/schemascommerceplanobject.md: + id: 67f9e9ddb730 + last_write_checksum: sha1:dc3a8c8de06c645fdf02fcd58f9f74ddd7adbb4d + pristine_git_object: 0a914fbbd3e43b2d0239d8de32b341984f32b93c docs/models/schemascommercesubscriptionitem.md: id: 4bde94be475f - last_write_checksum: sha1:53f0f392e982c24046d42296fe286b7a92181b97 - pristine_git_object: 1f8d2d4bab1ba38f0acf162bd35b0a929dbb9761 + last_write_checksum: sha1:62bc7fe5370bbb3fac0bfccc3219926ae0b51886 + pristine_git_object: edc5f7175c984e4f93191dc9fb73480445356479 docs/models/schemascommercesubscriptionitemamount.md: id: 4d5532405ffd last_write_checksum: sha1:231418c1400f8c442c052eb919a4c24611804ba1 @@ -1908,6 +2048,14 @@ trackedFiles: id: 9842da81cc49 last_write_checksum: sha1:aa89a266eedad8206a7a6a4815434cc9459025bc pristine_git_object: 5d0232748c20bac11f1869c996b1f04af6b1bfe3 + docs/models/setuserpasswordcompromisedrequest.md: + id: ff7c17bb03c3 + last_write_checksum: sha1:3a162ecc2c99e2dd956bb2eed9ff23012eebd051 + pristine_git_object: 5c9d9a02a4b7dfc119fd08beaf0d48c12118b74a + docs/models/setuserpasswordcompromisedrequestbody.md: + id: 486c3feb1933 + last_write_checksum: sha1:d384dba4d654f3f3a410045bf4f0df039babb2fb + pristine_git_object: 4d6237f565762ee1bf6983d437473c8569919ca4 docs/models/setuserprofileimagerequest.md: id: e8522fed2740 last_write_checksum: sha1:4672b883007d459144e5fea9209f722a3155f1ba @@ -2032,6 +2180,10 @@ trackedFiles: id: 3720b8efc931 last_write_checksum: sha1:314e43073aa00a19e2de3bf0996ab0dba2bd583b pristine_git_object: 6351bace5391744cf56615eb7ba0942481096cb2 + docs/models/type.md: + id: 98c32f09b2c8 + last_write_checksum: sha1:88095923c540526d3094b1f533263ccf4f19e3fb + pristine_git_object: 5e7aa828aa4c786cf567cb85f58420efbab8132e docs/models/unbanuserrequest.md: id: a129633ae58b last_write_checksum: sha1:f527b4151b1ccd6b52331e272c74bdcd66886345 @@ -2040,6 +2192,10 @@ trackedFiles: id: facc7b0c6fba last_write_checksum: sha1:910206fc68b540edef47b173965f07ea6c58c687 pristine_git_object: 0505416bc6dff69ae3038682da9c4de1a23ecddb + docs/models/unsetuserpasswordcompromisedrequest.md: + id: 02d46d22ccb0 + last_write_checksum: sha1:d1c2997b9a8c6d5419229af65409bb98d203ba97 + pristine_git_object: 0a189fc442edae19b7e1fda824182dd87c9ffe0b docs/models/updateapikeyapikeyserrors.md: id: 1dae1e9c2cd4 last_write_checksum: sha1:297fa8c9e6b2000a05f52e43cfc69f4da75dae69 @@ -2070,8 +2226,8 @@ trackedFiles: pristine_git_object: ffb98e748573c2a8d21bde70d0b8ba6db66a7764 docs/models/updateapikeyresponsebody.md: id: 684bd19cc120 - last_write_checksum: sha1:01542ff745599c7a447b62b45275b7531f78ad79 - pristine_git_object: 164cde31391847f0eeeacc309b31e5182573d261 + last_write_checksum: sha1:88298828c4ad4c21cfbada646d544f4f1e285b98 + pristine_git_object: f2dff9c7cc2d9a7725948a13862c9ffb23cff6bf docs/models/updatedomainrequest.md: id: 2f1e89f6e793 last_write_checksum: sha1:3286be30e4e25c7fa25b3eeceba3faa136e280a1 @@ -2096,6 +2252,10 @@ trackedFiles: id: 2f7feba9be1a last_write_checksum: sha1:65cf4fa24922ec829a59eae305060e46328d6093 pristine_git_object: 53d6dfde7a6f0de5ca87d027dbe28bbb1ca15740 + docs/models/updateinstanceprotectrequestbody.md: + id: 5824de18f982 + last_write_checksum: sha1:5df5fd5e194124647b8b1c6bda7ff1b269f2858b + pristine_git_object: 0fefea3e73dbf9213bdadad23587576baba69131 docs/models/updateinstancerequestbody.md: id: 8e3074a048d3 last_write_checksum: sha1:18d3ecef56d6694ef839976be4a5a57bf0727ecc @@ -2192,6 +2352,18 @@ trackedFiles: id: 523a97a07ee7 last_write_checksum: sha1:4b014ca2eb892825114a8dfc57d530f1f9146fa2 pristine_git_object: 3df1011de4caa7e5760c30ed922c855085b8e85a + docs/models/updaterolesetrequest.md: + id: 86949122f760 + last_write_checksum: sha1:af186fb06bad7d000385f1bf962834990ad9b3b8 + pristine_git_object: 11a25bdd5054543bd5e8ff5da4c10b3ed654c505 + docs/models/updaterolesetrequestbody.md: + id: 347c265aa5c0 + last_write_checksum: sha1:8cc601b9987c4b3fa48112ad6460bf845ff2ad70 + pristine_git_object: 8a9d6d76f2782e05ce5a94a538caa32ea27b0d09 + docs/models/updaterolesettype.md: + id: d21bbd5d24f9 + last_write_checksum: sha1:ed5ebbdac18331b3b2a9ae86ec304f3fc6bb517d + pristine_git_object: 773d4b6c3ac984d236ec386b835964e55802bb3e docs/models/updatesamlconnectionrequest.md: id: 208f59a75cda last_write_checksum: sha1:1e8ada30632b00cd8240d4cac0e2a6c461ea8620 @@ -2222,8 +2394,8 @@ trackedFiles: pristine_git_object: d9255b5e342480d1adc6dc08ba08723252cf4ec0 docs/models/updateuserrequestbody.md: id: 42b8f74ba38a - last_write_checksum: sha1:064f9537dca20309a67a4a17713fde1ebd530b71 - pristine_git_object: e7783970f28ff5d4ad1263190720b507e75e5a12 + last_write_checksum: sha1:1f425ec50a23104914de5c3c8029ecfeb92b93d3 + pristine_git_object: efd2f854fbd827dfe2aa986c825065d0c2372e3d docs/models/uploadorganizationlogofile.md: id: 579ad4c6aa57 last_write_checksum: sha1:5023c31bf55680ee52432ded6d8cda3c12297962 @@ -2606,8 +2778,8 @@ trackedFiles: pristine_git_object: d6dfcce53db461286f03b371e365a31be03b8e4e docs/models/verifyapikeyresponsebody.md: id: 4b723ad7c662 - last_write_checksum: sha1:94b50f44e5c0be453a72249f05e8b310ea9a09d1 - pristine_git_object: 2a1bc66790dadc8c3c4e6c0628307982faf74cc9 + last_write_checksum: sha1:a03e312ce3fc5805215cb4e8a3aa1e08a3992263 + pristine_git_object: 56a8cfb59ec7f3f0d72cc648b8ce2219fed11fec docs/models/verifyclientrequestbody.md: id: a1a2a729f309 last_write_checksum: sha1:ef55df1c3967d630c58cd4f8d548d73235241919 @@ -2642,8 +2814,8 @@ trackedFiles: pristine_git_object: c01f96f401c9b0d9cc5b19710d0ad4d36fa4ef25 docs/models/verifym2mtokenresponsebody.md: id: 09f7388ae8d2 - last_write_checksum: sha1:75a02f35c1503dcf9d46eb65d213dbe68fafb567 - pristine_git_object: 55bfd8d0cbb27b8d0a2f70133b1b7f1b2afbb32a + last_write_checksum: sha1:da5948731740f660d765fd9d686ed4414466c087 + pristine_git_object: 41a337062e9f23c876f1fcccfa7fa1fa5d085b8c docs/models/verifyoauthaccesstokenerrors.md: id: 1133003cc098 last_write_checksum: sha1:d64f6df4a355ef5008d5394bab8961ec2db0bdea @@ -2754,8 +2926,8 @@ trackedFiles: pristine_git_object: 35f3f36a78c00a226b588f68ef192a3375c2c4d2 docs/sdks/billing/README.md: id: dc915331dd9d - last_write_checksum: sha1:cb06ed89fd23180bcf5df187e7971c2db634641c - pristine_git_object: 968c02b926c811ad81222da129bfde6f01cddcb3 + last_write_checksum: sha1:1463c7483ec7ba25753a30c61ff1e99ead6698a8 + pristine_git_object: 7fdfaac7110a37a853e174f274678b09056a5bfe docs/sdks/blocklistidentifierssdk/README.md: id: 8c5a4397c841 last_write_checksum: sha1:2b250f0eb6ba83fce9a645c9439358b6e6600654 @@ -2782,8 +2954,8 @@ trackedFiles: pristine_git_object: 40d266c0ca71b4a042c1624998026a9565b4a627 docs/sdks/instancesettingssdk/README.md: id: acfc6e2cdd5f - last_write_checksum: sha1:a5e6aaccd53e407e4ae833e4a8172de29e2b7b76 - pristine_git_object: 49ce0814e4bb3addd694107422f83ac9a81088db + last_write_checksum: sha1:44bfae1a90997773addfd6be76d3809e8e486691 + pristine_git_object: aa2a0d04e43d72abda2a11ccdb0738d764ae3c6c docs/sdks/invitations/README.md: id: 4f20950f4cbf last_write_checksum: sha1:a01321b496c15f4e32891416c7d21418f69be62d @@ -2802,8 +2974,8 @@ trackedFiles: pristine_git_object: 5c15a18a6205c1840ae2d6535bde2763d88559a7 docs/sdks/machines/README.md: id: ab83178bf481 - last_write_checksum: sha1:12fe358dd4f255a7c577d92c21f2b85d63221cfa - pristine_git_object: e2ae33128d24c2340d9574a6ff957a1ff8428104 + last_write_checksum: sha1:336c9e9051ada8ad871f1f3d53b597e0a073b084 + pristine_git_object: d028c155da5a150faff1949caf8131ae627190ac docs/sdks/miscellaneous/README.md: id: 897f13c5866e last_write_checksum: sha1:c809c94363c5defe32f983fbc40da193b5249550 @@ -2822,8 +2994,8 @@ trackedFiles: pristine_git_object: de2883989d61243a55be62cb082d8b4d6ba5ebfc docs/sdks/organizationinvitationssdk/README.md: id: a75042d035e8 - last_write_checksum: sha1:971a2078b542a72fcd3c8df4f684f91b3676293f - pristine_git_object: 643c2fbb974661b1732d0c7ff73c0f84deaaa9dc + last_write_checksum: sha1:746d9bc5b19c6ddea80d8e9359b0d029b11ba8fc + pristine_git_object: 5cd0f7423a28535cd402d5a5dc5da3dbd4f1e004 docs/sdks/organizationmembershipssdk/README.md: id: 71f18c70c58f last_write_checksum: sha1:5bb5e7b3457347a3471c4757e732a76eac751c2c @@ -2838,8 +3010,8 @@ trackedFiles: pristine_git_object: 327f8cee360b2a99686db8635dce0d5b3cfda973 docs/sdks/organizationssdk/README.md: id: bc6106d94add - last_write_checksum: sha1:3ed06d283fec3ce57d24a03c2b63f249371cccaa - pristine_git_object: bf16e5d33142cf35700026ea55785fd598e0d040 + last_write_checksum: sha1:84df835fcc50ce8200c8667f4372d003d59449ac + pristine_git_object: 9b57e84838beef3e6415979e1b66f7cced3d33eb docs/sdks/phonenumbers/README.md: id: bfed92f30c8c last_write_checksum: sha1:525905d8e54c5b500d6cf49a9daa3d7e7be02822 @@ -2852,6 +3024,10 @@ trackedFiles: id: 97ea1ad89d9d last_write_checksum: sha1:183a547184cdd37017764650bf7b371291549b16 pristine_git_object: 50ce0620eee1ccc4bde70fa7155dfeecef5f1028 + docs/sdks/rolesetssdk/README.md: + id: 2cc5c21cf3c6 + last_write_checksum: sha1:1c040eb1c6a695fe240035e74d6f5a9dd31ed22a + pristine_git_object: 274348119cfc9c4dedebd4ecf4f995c44832e2af docs/sdks/samlconnectionssdk/README.md: id: d7f9ac682d87 last_write_checksum: sha1:c616d7c7e949317057fbde3e5669c221a6698703 @@ -2878,8 +3054,8 @@ trackedFiles: pristine_git_object: 3b5b06e9e6e00d8c21aa5de0fa5754acec7173d5 docs/sdks/users/README.md: id: 5d80027045fe - last_write_checksum: sha1:f20dd8e05de5d94137b7ce1149cbd394d00402aa - pristine_git_object: e6bf7e4cec2a877b3db3125bbae0efb7889df3a2 + last_write_checksum: sha1:04e7ca8addadce8f715fed26f77aa9dda276a502 + pristine_git_object: d3e31fbc9bc71cca3b447be5a44ba070e3f1a856 docs/sdks/waitlistentriessdk/README.md: id: be78acbbb2f4 last_write_checksum: sha1:39f30b2bae25126fbb0457013220b3b38fbae0fe @@ -2902,8 +3078,8 @@ trackedFiles: pristine_git_object: cd1ee9f8ff424dca35c15ec5515aa1fa7aed2693 pyproject.toml: id: 5d07e7d72637 - last_write_checksum: sha1:cbe1a1086e6572342a826d4448650bedd5ef2b1e - pristine_git_object: 978f22cde056d6f788fe74ddf32767c6ea243150 + last_write_checksum: sha1:3d35ff5ad431ccbeb32d7d79b8450f1ef185d1f3 + pristine_git_object: a43bd66fe46c33ed602c4fbeab7c521dd423dc63 scripts/prepare_readme.py: id: e0c5957a6035 last_write_checksum: sha1:419f10ccc385a29136e599315b61a0aa7a1c3e15 @@ -2930,8 +3106,8 @@ trackedFiles: pristine_git_object: 4926429d3dfb2c34589715971acb070ed3756559 src/clerk_backend_api/_version.py: id: 9bcb16a88e08 - last_write_checksum: sha1:4d50c4318076e8009e03fcdba5f1cc82946f08c3 - pristine_git_object: 58ad7898f18d0a24580f82c4d9352a85271441c7 + last_write_checksum: sha1:ac8ad88cfd5ae8c9190fc7e623f8f3167a3827f9 + pristine_git_object: 902b307a9a92d35b60233616d6e9733dadc57e81 src/clerk_backend_api/actortokens.py: id: 3b3f89863233 last_write_checksum: sha1:b83001f21b2750ff95b82cc953ae588d8468d82a @@ -2946,16 +3122,16 @@ trackedFiles: pristine_git_object: ef977feb49d905b3c0f2ad61995643a5acb63749 src/clerk_backend_api/basesdk.py: id: 5a15c2d94747 - last_write_checksum: sha1:63680e88a89c0548845d7e45660a7a20a3d30bd4 - pristine_git_object: fb9028f4012fb52af0b0fbe35428f20cbb6d4329 + last_write_checksum: sha1:e5e76e4c14416f24b81df63939e6b63983703eb6 + pristine_git_object: eb488183d4c82930b91d5d78ed96d066f4599530 src/clerk_backend_api/betafeatures.py: id: ad6307385dcf last_write_checksum: sha1:c54636b28c5b7e0d6cb2e721e7cd7acfac0de3da pristine_git_object: 9f7613ba5d9963c0ed011dd5ef46fa33c2f6403d src/clerk_backend_api/billing.py: id: d2a23482b2e9 - last_write_checksum: sha1:73740b5b47bce6395d5494aa3f7ac1f998027366 - pristine_git_object: 129a00131a895de23aa135f31b83e50109fd121a + last_write_checksum: sha1:48856fa7e7882ddfcb60190259ed8c769e0cf877 + pristine_git_object: c8c42c866569fcc540a2e27e2844577b8ceaa8ee src/clerk_backend_api/blocklistidentifiers_sdk.py: id: 49e67487b740 last_write_checksum: sha1:513ed50c9c2ba7d7dd3fcc96ee15f8bd299d1c29 @@ -2986,8 +3162,8 @@ trackedFiles: pristine_git_object: 89560b566073785535643e694c112bedbd3db13d src/clerk_backend_api/instancesettings_sdk.py: id: 1ec41349c1e0 - last_write_checksum: sha1:9f04dad9bca50cdaccccb1c3c80f56d29886e82e - pristine_git_object: 3e7391c8de4b2ff2d63593413b7862c132da6084 + last_write_checksum: sha1:ac384d76c2186482ffb621f75d2a7d3fd3768095 + pristine_git_object: 9a864e4c3a1823f5c342e05966b85a662359d0a9 src/clerk_backend_api/invitations.py: id: 1bc9adec1572 last_write_checksum: sha1:58f6a4371229e13d2c26fc8a0d68c090d10dd034 @@ -3006,28 +3182,32 @@ trackedFiles: pristine_git_object: 658e691cc6895bbecad0856d5af35ceda0adb91e src/clerk_backend_api/machines.py: id: 5fbf914a1578 - last_write_checksum: sha1:c818fd6d78be7187253b1b57391444110e15aa4a - pristine_git_object: ac48476138b58423fa9fcf5b34a686d64269ecf0 + last_write_checksum: sha1:2b77c684baed1bc0db3f8089a939b3146c97d51a + pristine_git_object: 4c9d61540114699d36d15200f5c0277119fb8c5c src/clerk_backend_api/miscellaneous.py: id: 70bb358bb701 last_write_checksum: sha1:954fa6a04d112b80c7e8b16b4e8e87950504d0bb pristine_git_object: e7c169770991082a5066ac02759632e1af71fbb5 src/clerk_backend_api/models/__init__.py: id: 97d9388d85c1 - last_write_checksum: sha1:f40443e63f6d5a6b2dac84d28a2f1007843884e6 - pristine_git_object: 36b2913c798dcd36bfdb0557481f8226ccf72f58 + last_write_checksum: sha1:248ee4c692a4f0dd5dce69ba15fbb0e4875e8a29 + pristine_git_object: b20515491135689823285dbf54e87d3faa60e7b7 src/clerk_backend_api/models/actortoken.py: id: afa1aeb1f89c - last_write_checksum: sha1:595a51cc07030b8ae72e0b420bfe1dd01e27acc9 - pristine_git_object: 5bd5d11ed32619ecd38d2e1c7cc193948a60e4aa + last_write_checksum: sha1:e9e2aca724744193c95d120d22dd3ca0c6023b74 + pristine_git_object: 021b2528cdd1771e28a4d303a92830318381d4a6 src/clerk_backend_api/models/adddomainop.py: id: bc5a2ca3e43f - last_write_checksum: sha1:322cab14aa3330fd7723f8eae01200877cec0cbb - pristine_git_object: 9de660753532ccfde2d7d7da7f734937a958ee77 + last_write_checksum: sha1:0351d47b81ab93d5ce624a71c38e08d671559d7f + pristine_git_object: e6525d6f87959bd7f8bdb2a3c2944b8fba7257bd + src/clerk_backend_api/models/addrolestorolesetop.py: + id: 545dc13fd20c + last_write_checksum: sha1:be77c76b77d3027144482e89ad4e9fedf17fffed + pristine_git_object: 7abbfe2273ac1f742b1a2175a1c21fc6983213d8 src/clerk_backend_api/models/allowlistidentifier.py: id: 15fed620f318 - last_write_checksum: sha1:9b79006b37aaef0dd892cd45f5879122223e13a5 - pristine_git_object: 9061fa53f2cf46222b362345b00e654575a9c810 + last_write_checksum: sha1:a214d4719e2eb5b8c67f3a93df3a7c5762b9199c + pristine_git_object: 6fb00aa7bafe92d7074371d0536191303ca051e3 src/clerk_backend_api/models/assignpermissiontoorganizationroleop.py: id: 13b0d15fe2f7 last_write_checksum: sha1:b8518e79f35e9206d341360a617501f89bc4abb9 @@ -3038,44 +3218,44 @@ trackedFiles: pristine_git_object: 391a1f7659fe78a3fd5e5cf2965a2e412ddaa6bd src/clerk_backend_api/models/billingpaymentattempt.py: id: b33ce5ce325b - last_write_checksum: sha1:839ebf8d4fb81102e1544d219f83aec35819ab87 - pristine_git_object: 34beb3bff93acb4af535a739c5a03aed8c95202a + last_write_checksum: sha1:a549bcf67e003caea266bdd773eee60ec079f262 + pristine_git_object: a55054673b9e2dc47fe918955c6d146e6e1c0bce src/clerk_backend_api/models/billingstatement.py: id: ea675089f24e last_write_checksum: sha1:7fab33b70188999705352543f52b41c8284cdecf pristine_git_object: 66c0c8acf386fc0a24e02871ce1c34b4bf8d7072 src/clerk_backend_api/models/blocklistidentifier.py: id: 2bc53a82c186 - last_write_checksum: sha1:428d366e3a81a79fd41d69105fd8b4b409cbf4d7 - pristine_git_object: 7aa44f07ff596e59b59c726dbb03e4903aead2b3 + last_write_checksum: sha1:fe4bdb300b9b42f312e513d24fe49f044704725f + pristine_git_object: 2fa3a59fd159a1f8638b51e09da43719e6ce2d9e src/clerk_backend_api/models/blocklistidentifiers.py: id: d6356af0312a last_write_checksum: sha1:eaef16b87ad090dcf7a4342e81d112e391c0d545 pristine_git_object: 5984df112340fd0819a9c16e46f592de30402d58 src/clerk_backend_api/models/cancelcommercesubscriptionitemop.py: id: bfd0c484da6a - last_write_checksum: sha1:10afc857654983c04645314324f6917081dfced9 - pristine_git_object: c52733ee47661dccc2bbbe0b8cd2650958937e8b + last_write_checksum: sha1:d75c28821ce5330d6db3fdb0233bf2f5276ca44e + pristine_git_object: 2a1c98fa14852a9f85024ff2042b8a901c37ad37 src/clerk_backend_api/models/changeproductioninstancedomainop.py: id: 60f1daeb920e - last_write_checksum: sha1:721a46a4939cf81efc237fd82dedf5c5f03b9185 - pristine_git_object: e36ada3a727f43776ba46f17ed7d2098fa1f640f + last_write_checksum: sha1:0b683e7cab39ac6ec5748641047867b5b90924a0 + pristine_git_object: cbf28f56793ba140de46ea028ed4c0c16502bf23 src/clerk_backend_api/models/clerkbaseerror.py: id: 0d8b15575e58 last_write_checksum: sha1:3146b0399d0c193e5bd3921292cf003e7ca5b346 pristine_git_object: 39f2e030f980f78c5c0f2ecd8030ce4d493f9ca5 src/clerk_backend_api/models/clerkerror.py: id: 2ccb21dde563 - last_write_checksum: sha1:7d61d396979276e150f35e897e09bc7f2f3ed5ee - pristine_git_object: 9e04464d8aa9b2be93c999a525a4a9700623dc3b + last_write_checksum: sha1:10c9399458d04820fd944a2d90733ee0512803e2 + pristine_git_object: 064eb40559c037f35296218343a2a5a8d11c00ce src/clerk_backend_api/models/clerkerrors.py: id: 6d281fef4fc7 - last_write_checksum: sha1:ebe4207bf109382056c58ed573c8c30222a19211 - pristine_git_object: f5b008f249481c8ce4198ac4e01db0522a4ed8a0 + last_write_checksum: sha1:5aae5b16a119642aa3fef28537f02dc47959e3d8 + pristine_git_object: 7658c12b00359d59a39263571e84cf3f2cc18f9b src/clerk_backend_api/models/client.py: id: e9612d07140a - last_write_checksum: sha1:4309f6e79aeee77cd55f8c21e80a09bb4dfb4b31 - pristine_git_object: 32ba07afb8a6f9eb7b95beac1d394a40121f7df6 + last_write_checksum: sha1:0ee064aa14c1492e2022beacb0c34987763fb5e8 + pristine_git_object: 6b8c03da981b2af854c9ed53aacb0f42060015e1 src/clerk_backend_api/models/cnametarget.py: id: 19d1a5bcba1e last_write_checksum: sha1:d4857924ba9f8d310369885dfb6ea46ed7625c68 @@ -3086,28 +3266,40 @@ trackedFiles: pristine_git_object: 0d7410fe43617ba2a0bf8d9c73efc9fe01aa97e7 src/clerk_backend_api/models/commercepayerresponse.py: id: ea12e5a3d074 - last_write_checksum: sha1:b2f01c0c77bcab5ef48c25dc33c54ef164c98103 - pristine_git_object: 840330a548ade4290c693dc72f97d726d88c4945 + last_write_checksum: sha1:f5caaa8ee584b11d2c25656eb0a9f57335137917 + pristine_git_object: ccc15f2fe5453882521a8ba80c474837c83ef320 src/clerk_backend_api/models/commercepaymentmethodresponse.py: id: cd3467d47354 - last_write_checksum: sha1:bc242c673b2a2249f77544b16f4fbb0390a02397 - pristine_git_object: e94d487ed27b4a4959090b8d0ca84494a2715704 + last_write_checksum: sha1:0984454db2ef9d48548fc086ef125a309f6c06e2 + pristine_git_object: 0137de4dd0736e452d5e55d7aaca4e851be63048 src/clerk_backend_api/models/commerceplan.py: id: 865974d0de5a - last_write_checksum: sha1:9ba34abd7bc6f3c5f428c777d07ef9e3fbd15a98 - pristine_git_object: f3f500470f998cab547926406d689b78fe4cc80b + last_write_checksum: sha1:e55ed99a6363865f50abd0ddd074e8af28a0f0d6 + pristine_git_object: f294f1aa9f5b50eabdf5d9e39a743e6d7ec93743 + src/clerk_backend_api/models/commercepriceresponse.py: + id: 18d4d4e28c51 + last_write_checksum: sha1:9930aac65565dc0a81f3f273676af37ffaa8dbd0 + pristine_git_object: 4f6dec3db350c55571deee0f230f936a2336a5c1 + src/clerk_backend_api/models/commercepricetransitiondetails.py: + id: d28d493401ba + last_write_checksum: sha1:008720e564ee064dbf859fd075c9b9a71cf507c5 + pristine_git_object: 9e4c93042526aa8f204d44d787a45114e82aa947 + src/clerk_backend_api/models/commercepricetransitionresponse.py: + id: 1b9a6445ff3e + last_write_checksum: sha1:49392cfefbfcf845361689fde2d526738b25e744 + pristine_git_object: 1d732f5d551c2939c1695550ce3a3fb39141c4c8 src/clerk_backend_api/models/commercesubscription.py: id: 4be9b36998a4 - last_write_checksum: sha1:ea628aec01161a882f4e6ca1413b1aa4a628dce3 - pristine_git_object: 8d76294024ec496851ab35a8619eed7eb31d2839 + last_write_checksum: sha1:d726ae49c6c57815765f8d6d3213da8433e4b41b + pristine_git_object: 56bba50a8bbda8a9df8586d86350feada95fb827 src/clerk_backend_api/models/commercesubscriptioncreditresponse.py: id: 69454e300fab - last_write_checksum: sha1:e82d4aff26b8cdfa91b2ce762393d207cde4ad84 - pristine_git_object: 5caf520693c27663e7af38f62dcc52c81fc88ead + last_write_checksum: sha1:e7aa59eacd54727bb8cbd5a96e0b2a1128359c85 + pristine_git_object: 24678d63ef162246f6cc124a15469a26bc8dfb62 src/clerk_backend_api/models/commercesubscriptionitem.py: id: 85ab9baf8dde - last_write_checksum: sha1:7fda299f6889abac6873976d2c315cbdff6c98d6 - pristine_git_object: 77a1a6ff7ef9f1f6724a006af24d84f05e46a02b + last_write_checksum: sha1:48a19982074e650f366cdd4515a131e41a7403df + pristine_git_object: 1d3787317814e152389ea53de9bad7487a65dea8 src/clerk_backend_api/models/commercesubscriptionnextpayment.py: id: 3f0bb47b0862 last_write_checksum: sha1:af763695a2d2bf267a20b9d64e039403f8ae9559 @@ -3118,116 +3310,124 @@ trackedFiles: pristine_git_object: ba81bc349ab406c3dec241bc3a65de30cfb8a9ff src/clerk_backend_api/models/createactortokenop.py: id: 3671156c7bd7 - last_write_checksum: sha1:ba11b91a302205951be8520f19e3396a7642a6b3 - pristine_git_object: 3cf2dd496a38028750bbbe8c3883ef5e1acd2c07 + last_write_checksum: sha1:38111b4266e127a867fc29e2fd9e759429bc9cb5 + pristine_git_object: 48e296f6785280868ddf584fb43a46c65e67105e src/clerk_backend_api/models/createallowlistidentifierop.py: id: 85c46051e941 - last_write_checksum: sha1:5189a78bda7e8e67718fb72979ef6243cbee7e31 - pristine_git_object: bc48a4c6d04914e216de73873759bed82449f51b + last_write_checksum: sha1:89e82b6490094d87d5fdcc04d1806efd7d22d353 + pristine_git_object: 6e45fe429166910fb446a80e5af584bc2091386a src/clerk_backend_api/models/createapikeyop.py: id: e8b0987d0c64 - last_write_checksum: sha1:f5dfb86d7dba974c8d27ff7069bd853e2a056e3f - pristine_git_object: 4e84949134430f0908166e6851b92eb85ba967e2 + last_write_checksum: sha1:c586fcbe60320365b2b8367acf272637c941cb3e + pristine_git_object: b252ed0d87eb93c5043cd38d11d19a0234a43098 + src/clerk_backend_api/models/createbillingpricetransitionop.py: + id: b2b936b90df7 + last_write_checksum: sha1:6a158d92eb5164cb73cf31b223d2d1a68f0a715f + pristine_git_object: f4513f7adbda8013ba02d171dd16e661869a7376 src/clerk_backend_api/models/createblocklistidentifierop.py: id: 7e662469a7a9 last_write_checksum: sha1:a8814e5e5d89cb2d777a3bd4ea1908643dd45656 pristine_git_object: a44d1bc0b579e81a57a65220f5af144ffdc3d94d src/clerk_backend_api/models/createbulkinvitationsop.py: id: 8df99ebd7202 - last_write_checksum: sha1:ec6fba44490c545cb78bb6d9c546143c8fc6d1df - pristine_git_object: 576fe4d52696ae26d675f37bde00ff6220d0f71f + last_write_checksum: sha1:922b48a042bbae0ba453268a67999aee973eaa03 + pristine_git_object: f75b6d2aab2a3183f94fd70cbd1a8d73eeef3252 src/clerk_backend_api/models/createemailaddressop.py: id: 02f3665954c0 - last_write_checksum: sha1:6f9b02e84612287636d72d5d519cb62db70635a4 - pristine_git_object: 780f3946acf2806c3ff815e45328d6a8bbcb4b35 + last_write_checksum: sha1:3594f421e0a1bed8e3f3bf8ff8815304cdf50a64 + pristine_git_object: 406b8ac4b1d25b3ca6a4bfb060c396ecd8071f50 src/clerk_backend_api/models/createinvitationop.py: id: 479deaac075b - last_write_checksum: sha1:943ac7ed0ba874468a3a7eff53ac85294625bea1 - pristine_git_object: 0a1af705b767edfd1a7c1554d32fe85c347701e1 + last_write_checksum: sha1:d885e45557975ac000b87e68d8bbdfc228dba9cf + pristine_git_object: 21113731c6746ad57892383bdd43e4b75f8942e1 src/clerk_backend_api/models/createjwttemplateop.py: id: 4f4d803f2f76 - last_write_checksum: sha1:c2ef0725920569638b8c9350bdba19d14625ebee - pristine_git_object: a4a2009392a0c9cb64adca40b04e94e3e5777ce9 + last_write_checksum: sha1:d9715e77fe6ecd29d13959864ca5450be305862e + pristine_git_object: 52c65fa838a1144d66655408392d48070b27ebef src/clerk_backend_api/models/createm2mtokenop.py: id: bf590edaf51a - last_write_checksum: sha1:66aeebb51fba13e98d50550cd837913d12a87ca2 - pristine_git_object: ab1d8a88648773fd311fc330efed5428455f7b0d + last_write_checksum: sha1:8957868fccb328afe9d671ce762fb5b5abced592 + pristine_git_object: 56c5f2845fa29280db036b0b27834aad6fbe6c0a src/clerk_backend_api/models/createmachineop.py: id: e9e4c3a0de8b - last_write_checksum: sha1:301525670e5a5e1b7041b414eca8e7edb8ec0dd3 - pristine_git_object: 3f598e0083a73bda3b227402db79926fd5fd27c9 + last_write_checksum: sha1:fb83e570ca829619733a69cd3ed1a7795ea4bbd2 + pristine_git_object: 3b4d5887b0108b94e38ebcb5ef4b3ee77020342f src/clerk_backend_api/models/createmachinescopeop.py: id: e3ab996637b6 - last_write_checksum: sha1:39dcafd28750a4c40c1132a2b611c2d82c221cdc - pristine_git_object: 74e14ec37264743106d187f8d86f4c3dfbbf5db5 + last_write_checksum: sha1:8d58f48a1bfd0d0a5e74b6436949e36158762f02 + pristine_git_object: 037fddfe790154334edd567a2ca635646175656c src/clerk_backend_api/models/createoauthapplicationop.py: id: 7793e4c722dc - last_write_checksum: sha1:316f8d667656d5c69b1e89eb0451eebf74c79fa1 - pristine_git_object: 41b67c5df5b624b6d51bf0483283801929c16e6c + last_write_checksum: sha1:ba29f776ec1347b592c2aa3e75e8ab17c2ce9b47 + pristine_git_object: a1be54e0bb748be0cf03df2d423831514fa813d2 src/clerk_backend_api/models/createorganizationdomainop.py: id: 5a6ae0dba9f8 - last_write_checksum: sha1:cae3710967bb3f183e027dfcc689f62b4c1b2824 - pristine_git_object: b8db4e9f3ea970abd15adf3c6facfa12b59d96c8 + last_write_checksum: sha1:fc53fb776682124acc5f5eb072568f0907a33f5d + pristine_git_object: a31ae200991f8bc9422ec27c2af7536486ae2c82 src/clerk_backend_api/models/createorganizationinvitationbulkop.py: id: ac16d568c0ae - last_write_checksum: sha1:b6a6c6e13b5f9504c9e67944cd97218270d179f7 - pristine_git_object: 9994d43b5ed0e9b36b275cc2ef48cf40e4058e86 + last_write_checksum: sha1:a525428f2e9273a5917a6c9c501c201248f4e0c7 + pristine_git_object: 2c9e5224fec5f84a3f4071d4cc4f893e71508df8 src/clerk_backend_api/models/createorganizationinvitationop.py: id: dd0c39ef272b - last_write_checksum: sha1:d0c9309d2afdf09257bbc669837488a0d32e4150 - pristine_git_object: 5c1e55e34d62ca7061bc4a07b72e884ab3937ef8 + last_write_checksum: sha1:28a413ca67ba3adaa7290740eaaef8c0551fd232 + pristine_git_object: 2df11af4b820620b79fa48cc985c5cf02a52fd69 src/clerk_backend_api/models/createorganizationmembershipop.py: id: 9317fd55a7f5 - last_write_checksum: sha1:9becf0cf8cf8bbb75f3e416dae5c27258d119925 - pristine_git_object: f4a76f231e027dd6abd27a246cc9d8f797dadea0 + last_write_checksum: sha1:e959a2f8318937c2c2ec82f2239499ff78eaabd7 + pristine_git_object: 166ea01e6abdbb9d0bb1ba5272f6e8e501283d76 src/clerk_backend_api/models/createorganizationop.py: id: 89ac4d7f3bc7 - last_write_checksum: sha1:fe564b6f4b2911a6121cab7ac73fd91586e7e1fe - pristine_git_object: 8ec880ed4932c73cf6ebfff1a33ea9be7bb37ab3 + last_write_checksum: sha1:b4e22edb82b6fe755fbd8ea7a60bfdecae3f87ec + pristine_git_object: e26bbf438d835091c22e26b7f1affcef2e19c7b8 src/clerk_backend_api/models/createorganizationpermissionop.py: id: d0fb937e2919 - last_write_checksum: sha1:6362b5fe400d5dc6fa26c7fb4227d24839b2f8ed - pristine_git_object: 9108182864804d5a7b2a4ae1f43e0ad265dd2614 + last_write_checksum: sha1:972e1f34290e02c5d12adc703797ccaabf84c056 + pristine_git_object: 06af93cc8f98623ba75fadd853583c04f4766651 src/clerk_backend_api/models/createorganizationroleop.py: id: ccc477e150c5 - last_write_checksum: sha1:2cfa94ae0e1f492c8564393a6b67a73348ff53e3 - pristine_git_object: 58d509effdca5f9c96fc14472322fcef4f269ad9 + last_write_checksum: sha1:e59e66c37fe5e711649eecda17f7a688dfdc71fc + pristine_git_object: 2af8899a17c7994d77ac137d9e1a11abb87675d0 src/clerk_backend_api/models/createphonenumberop.py: id: 68d1b792d95f - last_write_checksum: sha1:34e7275e70e443c746868a8858af55194287c18a - pristine_git_object: 9e5bbf876c2984e574ea9e419e3983acb6d6236e + last_write_checksum: sha1:b4aa4446482e89962128861584c85c1a68a42367 + pristine_git_object: 296b1e547f6750a6c5b05ee058efaa9c4f89ab6c src/clerk_backend_api/models/createredirecturlop.py: id: 400a59edf754 last_write_checksum: sha1:b3cdf8c65fa446e852c6ef4a07077e2bdb331473 pristine_git_object: 843efb887f6ef1fdc69197b58e5a8df022eae78e + src/clerk_backend_api/models/createrolesetop.py: + id: e2449a1faf79 + last_write_checksum: sha1:76d04d1d9fd5c6f504fce950dee1cba7c532ea3e + pristine_git_object: 8ceabfc2d3b1490c07f6af7db2362f85d6ad2280 src/clerk_backend_api/models/createsamlconnectionop.py: id: 5e58a895eb84 - last_write_checksum: sha1:38e0540f7f23a23734077d37eafded7ac46371c6 - pristine_git_object: 7fb3bcd7a95c91cc429c594dc262478501572d7a + last_write_checksum: sha1:7b9131cf50d3f546fe91585d440de288a760353c + pristine_git_object: ba9400896431662b0b2f36daa443add9f8d77480 src/clerk_backend_api/models/createsessionop.py: id: 0e1e77977e4a - last_write_checksum: sha1:5b952af5753d719aca2bc2d16fcaa46a62cb8e3b - pristine_git_object: a626c15f9748d039565ed937d96adc03c0836c5e + last_write_checksum: sha1:2a2ee6afdbf518656ebe96e46194c3db40168f0e + pristine_git_object: f89e69a5d51ebab9973c8c01ce9c23d19fedd1b9 src/clerk_backend_api/models/createsessiontokenfromtemplateop.py: id: 89dc4d320b91 - last_write_checksum: sha1:07bbf1c08bf337ae01def6c95c1a19c5e22ed456 - pristine_git_object: 756cb9eb187693e1200e4f34ab1857cdbb42c81e + last_write_checksum: sha1:150ce79fe3c5a7afab3d6a2ae0710e45899d5e6c + pristine_git_object: 7f5a807ded2e0700e42e2cf6f13d3f35d722421f src/clerk_backend_api/models/createsessiontokenop.py: id: 7c6bb6912d1f - last_write_checksum: sha1:80f732bbe740020760121eb011e03625315b9e89 - pristine_git_object: 01c5b0edd9d86bef1ab017c88cab38f3204c01d4 + last_write_checksum: sha1:23be6f9d45c620dcfd0acf0c8ca1e86c98a45ff3 + pristine_git_object: 20e94f2db8fd21f31d5ec833d6fe614114e52c39 src/clerk_backend_api/models/createsignintokenop.py: id: 1cf7c182ff64 - last_write_checksum: sha1:8eede7d9bd83598360727ef0ab9f634c4890956e - pristine_git_object: 4b45ca7ae8e373cf7444571e7b03add659f28c46 + last_write_checksum: sha1:1385aa3a66d610ae814ba87bcc6202a547050358 + pristine_git_object: b665cfde30aa80a9649e894b82fb3b3c2049fadc src/clerk_backend_api/models/createuserop.py: id: bacf02afe019 - last_write_checksum: sha1:7bc1300514cb795d45b04c232504cfb33b2362b0 - pristine_git_object: b2a17314ffd34f529dc1217f1c72c64685c17a2a + last_write_checksum: sha1:bb161ad610780e39e4712de8fd433ae830494464 + pristine_git_object: f205ba78a289c9b81169f372c5f4df06dc4a8bae src/clerk_backend_api/models/createwaitlistentryop.py: id: 5fc8451ee608 - last_write_checksum: sha1:3dde15df04f61cbc37d7fc5980bedaeb9195feef - pristine_git_object: 37bc8f3464058b056e2f9c93e52a12d59c8a0dfd + last_write_checksum: sha1:75fc9969e85ec9e764cac4818196a21add634290 + pristine_git_object: e84a44eccd40273d15f5637524053d39e520982c src/clerk_backend_api/models/deleteallowlistidentifierop.py: id: 73ba7ed9b357 last_write_checksum: sha1:bbcca230c62f1ad361a9cdcc82c6279a39f6702c @@ -3238,16 +3438,16 @@ trackedFiles: pristine_git_object: 32c9f2f493ad058a93da27c349568c9347ff9ab1 src/clerk_backend_api/models/deletebackupcodeop.py: id: 115b2a3888c7 - last_write_checksum: sha1:529e91015eec40198024465bb9c91426fc3f0d72 - pristine_git_object: 777650fa917130e3cc65ec03971259d200598f89 + last_write_checksum: sha1:e9f81f6b74cbf0cb61d37b39061f7ff3638e2173 + pristine_git_object: 2565eb343b9e5a8617ba1d1cb836461b145a0cc7 src/clerk_backend_api/models/deleteblocklistidentifierop.py: id: 39d8cc22dddb last_write_checksum: sha1:c8a30974fd0eab88e1b41cbbeae972ff79d90fb1 pristine_git_object: 2138876235da0f11f37c715ecfbd64cb7896da61 src/clerk_backend_api/models/deletedobject.py: id: 90b1fa37a045 - last_write_checksum: sha1:b14c74f483c0117001da33b37cc9474acaefbe4d - pristine_git_object: 12336a6da6f8b5c1f87003b6f22527f4ee64b256 + last_write_checksum: sha1:8e481510e264ca2b420046d970c6b12989315938 + pristine_git_object: b877d03ba91fa7730004ba7c6ffc9e50208ea565 src/clerk_backend_api/models/deletedomainop.py: id: 951c91a9dcfa last_write_checksum: sha1:9f99b2361f1026123e56ebe080728469b418af0b @@ -3314,8 +3514,8 @@ trackedFiles: pristine_git_object: 3e5cfb25e270dde4e82a59ac4f98b8abfd6de94c src/clerk_backend_api/models/deletetotpop.py: id: 92ed611f8ded - last_write_checksum: sha1:ed652ae334f8dd0dc307e6b2ef297791ef81378c - pristine_git_object: 183cbef04d73373c6a77d12a64aa211ad2fe5cab + last_write_checksum: sha1:d4f0149835ec24d1c146c45fc23ba78a05eab28e + pristine_git_object: 0115c3e786173455e83c368706a537e6913c2326 src/clerk_backend_api/models/deleteuserop.py: id: 7eb66fa68c36 last_write_checksum: sha1:d461b69b3595938a40328108b3fbdb4922cdefe3 @@ -3330,24 +3530,24 @@ trackedFiles: pristine_git_object: cbf0b3e45f9332bcdad6632d947355dea7601bf0 src/clerk_backend_api/models/disablemfaop.py: id: ed94d0f68953 - last_write_checksum: sha1:1e467b51bb066cb301cac89c7b5068b02f5ea31b - pristine_git_object: 0a4a54d4962f7b05628483af8a6be3fb71a2540d + last_write_checksum: sha1:d41d39c061c5f039b85782ad4a3d93a6e006975a + pristine_git_object: fdbf22133149d5739efb3cb2e76de54e868057bc src/clerk_backend_api/models/domain.py: id: 733ede72ac6c - last_write_checksum: sha1:2da2402475c05865709cf6ffe4520f00be10f8b2 - pristine_git_object: a6cf35f3565a4c5227f7374310ae4290f8aa11a8 + last_write_checksum: sha1:d9c53ef781470a067e37e941c2f7b176005b590c + pristine_git_object: 45080d0ce570a5cebf72c50d0e8fd2dfb5884d8a src/clerk_backend_api/models/domains.py: id: 795c60265a74 last_write_checksum: sha1:119a83d8f328e5f686682f78705aedbd001e3973 pristine_git_object: 7c2cb9ffb835a0b7605b399091244417ff938c8f src/clerk_backend_api/models/emailaddress.py: id: 29df9abd37d1 - last_write_checksum: sha1:863679f019e5bce00d2d44e6235fb7a7ebfa4713 - pristine_git_object: db627c66a0ec8fc592e549b341cc82141a18d066 + last_write_checksum: sha1:edd1db7ed164152f0c574b2eeb25172faf2dddb9 + pristine_git_object: ebc2650584feb32ce1d12439a8f02fa328185bf4 src/clerk_backend_api/models/enterpriseaccount.py: id: 76fc27f00649 - last_write_checksum: sha1:ec56ae850af8d6d6290846dc9188b0973f726556 - pristine_git_object: 0a4dbad259ef2c5dc55310958a9bca6386494834 + last_write_checksum: sha1:035ba999375b4727207012f1dac2cd8ba0ad633f + pristine_git_object: 2582c3c2b803544d1ce220f2ae4e8331a9cea7f1 src/clerk_backend_api/models/extendbillingsubscriptionitemfreetrialop.py: id: 5237ca04a999 last_write_checksum: sha1:e2d1bcf81ee76913824f63d6cc8339f734d0ee77 @@ -3358,52 +3558,52 @@ trackedFiles: pristine_git_object: e2bb51e244cd1a26f729b8224cdcd11164a507d1 src/clerk_backend_api/models/externalaccountwithverification.py: id: 79931be73b92 - last_write_checksum: sha1:13256b8002732315028455972757c7c29741af73 - pristine_git_object: 3ebecff50585eb2ebde4a24782e1ed63791a5ecd + last_write_checksum: sha1:f677879a4afbef49d30fef467c31946de7e6f2ce + pristine_git_object: dcf3d3eb11dc8f80a782017f6e805c37719b7800 src/clerk_backend_api/models/featureresponse.py: id: 40a15826a18c - last_write_checksum: sha1:675ee25d2b011eb6d0e0e241e62ce0d4622d35cf - pristine_git_object: 15df0bb3eb87f6cf83d2d130a13688948d2966f4 + last_write_checksum: sha1:ff6de9741c8bdf627203780d9dd4a105df44b21d + pristine_git_object: 0843f3e3020df249f7e7f059787502ff0509cbf8 src/clerk_backend_api/models/getapikeyop.py: id: f596ae838d7a - last_write_checksum: sha1:bf7adf5d5e6da91b7d8b8ceceb8ad9b3158e93b2 - pristine_git_object: 05b6abd41ca378ca39d09eb00e3495d4cbe9817a + last_write_checksum: sha1:22805f2c0ba6bdfaac98f76ddc740370d648cc6a + pristine_git_object: 25db1110a66628a31eed00614f4b44e210092b65 src/clerk_backend_api/models/getapikeysecretop.py: id: 242e8a4bec54 last_write_checksum: sha1:aad8b46b7d592758b278b50b15a1b5c2c3d53e18 pristine_git_object: 8ebaa17b22d4e6addbfed84d8f721e3745ec214c src/clerk_backend_api/models/getapikeysop.py: id: fd43908c92e8 - last_write_checksum: sha1:a34456a8cb1bd1ac7263c098e0c9a7850e9ed69d - pristine_git_object: fedc29008011721428c51513f69b4b0b9024ceca + last_write_checksum: sha1:2254b4bb132869c58dac33ac5dcd3d5f448028fd + pristine_git_object: e96843c722036e4d86228fdd3ac897f8ab6b1f0d src/clerk_backend_api/models/getbillingstatementlistop.py: id: 4516da6ba76a - last_write_checksum: sha1:40d7a84da8b8cb68470f25f11c6cfa2015cefeca - pristine_git_object: 208bbbbd583b11dfd0419ce6bd3a245fa52b45c9 + last_write_checksum: sha1:bd0b202bd6e42c9d8a6d6d89ecf3b48067d2abb5 + pristine_git_object: 00de5ed178efae34d84646a3f6c2ea25c7dbedd0 src/clerk_backend_api/models/getbillingstatementop.py: id: bdafa2761db5 last_write_checksum: sha1:e60c8a1382ba806e386e3b642f11f26bd544c080 pristine_git_object: c9a72d95aca03c210c6fe9ed503dd528eea6cc34 src/clerk_backend_api/models/getbillingstatementpaymentattemptsop.py: id: d81889dd5fea - last_write_checksum: sha1:16d7e538f9f22b5b1d33aa6d696ceb635fb81cc0 - pristine_git_object: 85394ee202b14f8d10fe8fbfccabb752988f35d3 + last_write_checksum: sha1:023e72443dd12fb2074baa1fd32296fe5a3ca682 + pristine_git_object: 030342fce198fbe01a12232a44a2df1bf4a76605 src/clerk_backend_api/models/getclientlistop.py: id: 145d0beed4e0 - last_write_checksum: sha1:0565b96cbe8bbe732a0b59d6f12719a51c6fb076 - pristine_git_object: 9ac6487604253d8fb96dac98e514cde4ff76460b + last_write_checksum: sha1:2eaa0572e7eb0c71125534e6abac8191265062f3 + pristine_git_object: dccb9264c3f460d1b2376e9070f355b79584e568 src/clerk_backend_api/models/getclientop.py: id: afa544cc607c last_write_checksum: sha1:d0ce16a26eba8ac938ea86da0c69a32613ff2f86 pristine_git_object: 240db31a7cbd0d9df5577d22cbf778b29b409914 src/clerk_backend_api/models/getcommerceplanlistop.py: id: b6e17d45eb11 - last_write_checksum: sha1:c0ab2e5251148e2b379a64911f3243a4f223499d - pristine_git_object: b50d2357b8fe17f4eefd2a22736c1603c486c78e + last_write_checksum: sha1:bb6349630569ca053c5e78ed2fe705e514d6ca29 + pristine_git_object: 26ca109621ab6f158274794598f0c3b12b60a2ff src/clerk_backend_api/models/getcommercesubscriptionitemlistop.py: id: 1c815aafbef4 - last_write_checksum: sha1:3ce394aaf1caa1823b725afbd9e1846d5ac321b4 - pristine_git_object: 35354d99cea6e26408d208af5db9f7a92bb93f1d + last_write_checksum: sha1:ee2b324aad382a99c1508962b6ba5e1b12a0f424 + pristine_git_object: fa30888efc628c454774a4fc5f45db4a70b14bb6 src/clerk_backend_api/models/getemailaddressop.py: id: 5643cd0c77d6 last_write_checksum: sha1:0142c1c61e447ed1ed80cc5ac5c818ff054e563f @@ -3414,8 +3614,8 @@ trackedFiles: pristine_git_object: 750a3bb04d477022abe913513c1a29e2c913c31f src/clerk_backend_api/models/getm2mtokensop.py: id: dc3c52a4d58a - last_write_checksum: sha1:5ce7226025b72f9f228bcee67e799f08da4b67d6 - pristine_git_object: da9614fec01574369cabfae97fd3abf9c63d51fe + last_write_checksum: sha1:0bd3fd07eb97a7a0cba85c90e7037581bb42496e + pristine_git_object: b8f3d7c89fa4f8c45985cc783ff86044283aa9ec src/clerk_backend_api/models/getmachineop.py: id: ad1202eb5323 last_write_checksum: sha1:47ae0d0164103633888a9a090a4cc517e6b9664b @@ -3426,8 +3626,8 @@ trackedFiles: pristine_git_object: 3487ba5842e7a0f5081c1a4bfe03146e11d43211 src/clerk_backend_api/models/getoauthaccesstokenop.py: id: b582eb4aff9c - last_write_checksum: sha1:a78d84688a0eda1684e477e7d8df24b1f3bc493c - pristine_git_object: 714025ba878f8eec187927a4ee3b5ac4a06676b3 + last_write_checksum: sha1:4741c79db0ca5c3b5ae79812d482d884d55b14bd + pristine_git_object: 7d841693ece87b829effb2d30cc5a45bbb4d2785 src/clerk_backend_api/models/getoauthapplicationop.py: id: 522d6b0c6049 last_write_checksum: sha1:77ff0eda412b8837b3423eea2d6d5c60a79f7264 @@ -3442,8 +3642,8 @@ trackedFiles: pristine_git_object: 49417ec6ce49f18d3d6752284f3aff0cef7d326a src/clerk_backend_api/models/getorganizationop.py: id: 8c9ddef7aa88 - last_write_checksum: sha1:f518a8693a247f592ab629beb0c37f036fb8042d - pristine_git_object: c6db0f2b9941c31fdc90648bcf575e7956da2381 + last_write_checksum: sha1:00ad1fd7de4fce0501b1a4aa9797591f48ef6749 + pristine_git_object: 89708f86ac94ae7a244f0704f65cf78b3ecb2a13 src/clerk_backend_api/models/getorganizationpermissionop.py: id: 8811fdd05b05 last_write_checksum: sha1:086c21817fff0219db9e60f0a33e7759c82c9c3e @@ -3458,20 +3658,24 @@ trackedFiles: pristine_git_object: 464557c4143ca3790f432caa725396ddd40be5a8 src/clerk_backend_api/models/getpublicinterstitialop.py: id: 8416966f0b0e - last_write_checksum: sha1:7994d90c6dff91f24ac734085373374107d6f749 - pristine_git_object: eab660699a36ef725b22909a527774f363af1103 + last_write_checksum: sha1:b88bf40e2bc8d710c9c8cd7343a7dd25c33a28e3 + pristine_git_object: bbe1fc0101efaec6a3ac5963fadafe6c5245fa8b src/clerk_backend_api/models/getredirecturlop.py: id: 6057b648df2e last_write_checksum: sha1:d41a1018d05871e7454d474efd95f8190bac67ff pristine_git_object: 64abc2895213100033a462782d11ceb88205d963 + src/clerk_backend_api/models/getrolesetop.py: + id: 97ee4ba9e66f + last_write_checksum: sha1:9ab2ea3460542a7d1605c238ee859d556692c82e + pristine_git_object: 4e1f452bce0e74d24fd0be481ff7b6d75ac450e1 src/clerk_backend_api/models/getsamlconnectionop.py: id: 19fba59390ff last_write_checksum: sha1:b7ce708cf204e93bb53ff7a215c03e305ebb588f pristine_git_object: 6453dd527a582d4511dac931af76cae1ceb52b83 src/clerk_backend_api/models/getsessionlistop.py: id: a8e161eebd23 - last_write_checksum: sha1:6edc58e3ad9f1ec39a547864d24670db894d9a02 - pristine_git_object: 5b8d025585dd1b47c3e2ea3d2694f9edd271c35c + last_write_checksum: sha1:b886e2805fd79d02ba7494b2d91c2e31ae26a11d + pristine_git_object: 7c072fed7465f95bf3fc59e8425f40b6fba5f786 src/clerk_backend_api/models/getsessionop.py: id: 7ff3010b061f last_write_checksum: sha1:534bedf0798c4936bbb3d8e90927a5a888e0242f @@ -3482,8 +3686,8 @@ trackedFiles: pristine_git_object: 87010a40937328e66717d8e4e42e9cec4e4c743f src/clerk_backend_api/models/gettemplatelistop.py: id: c70ee7db9ccf - last_write_checksum: sha1:feb3e2d7ab6efd8c588843a5e74e66c77bae4c36 - pristine_git_object: e8d77fcb36598d979b0f8c19d9ad959d8964ca1f + last_write_checksum: sha1:92be86d2328c20f5d7c03093f0bcd3750b3f3ada + pristine_git_object: 22b0b5262a3928b2d9ce2def81ed8d829655949b src/clerk_backend_api/models/gettemplateop.py: id: 9bf7d1b9f2ed last_write_checksum: sha1:e3f8fc7b3bc6c3f587c8c4db4507b98c7962b68d @@ -3494,136 +3698,144 @@ trackedFiles: pristine_git_object: 638943c11b73d6256eb3d68156c656b13f3cf9e4 src/clerk_backend_api/models/getuserlistop.py: id: af0fef8affd9 - last_write_checksum: sha1:15f0f41a1c43832e78e0614e08d627bb759c9aa9 - pristine_git_object: 9d8e72dec7a76fcd68c2e3d33f754a96d75a65ae + last_write_checksum: sha1:330703df2ef936263c6feaafb9bd1a6c84926e79 + pristine_git_object: acc21a93668071680727dfd77353c52a5e849c52 src/clerk_backend_api/models/getuserop.py: id: 1c2e85a07888 last_write_checksum: sha1:1b2e0ea568ee02fb2d04e9c53cbf6f1134b11737 pristine_git_object: 1ed5820e08575f16eb7a5272998e28b3f737777a src/clerk_backend_api/models/getuserscountop.py: id: 5c7fad7c1bda - last_write_checksum: sha1:4ecf9ffe1d795bf8031e54fea34790db2bfe94cf - pristine_git_object: a44be9321acf779c3e1891cd1f55cb2771a4c53f + last_write_checksum: sha1:27bb7b2b5ffd606688e9a5ee3e26f69b886bc56a + pristine_git_object: af71e4d3fbbd121817a9e11aae5be86f2ec98947 src/clerk_backend_api/models/identificationlink.py: id: 16fdc79490bf last_write_checksum: sha1:cf723c84102db05ab1cd4cc1ff89eec9c131ffb4 pristine_git_object: 97b8c1cf2914963db67be95732598224a89fc170 src/clerk_backend_api/models/instance.py: id: 05a213628ace - last_write_checksum: sha1:8b759cffb9004821bdfdcb682e7c3752ed1e541b - pristine_git_object: b2228de539e977eee2caf03a40db7d6a94f69455 + last_write_checksum: sha1:a88b66af8dc89634a47328eccd2585e7e2a9935e + pristine_git_object: ca9f477638c63df68ceb9991005b43abbcaf05bf src/clerk_backend_api/models/instancegetorganizationmembershipsop.py: id: 952034840b81 - last_write_checksum: sha1:805c4a3ac55e912d2ac67a3d9d77433c522ca0ce - pristine_git_object: 8c1c3a2fd40f08d029208da708f35dccbd95c791 + last_write_checksum: sha1:a4e459078553ee8e1194198720b3bcad8eb8246d + pristine_git_object: 348c617efbd855d5dfc77894884b10711622774d + src/clerk_backend_api/models/instanceprotect.py: + id: 64baaf6e2fd8 + last_write_checksum: sha1:20b717eada7161c3c894f1ef42f030fe28603f4c + pristine_git_object: 42e583b382640746d3ed0a6f6d35857f52db59ae src/clerk_backend_api/models/instancerestrictions.py: id: 80b29b304a9b last_write_checksum: sha1:8f787fbfb1aabac1eed513c134ac8fbc05befba3 pristine_git_object: ddd0ac692efc93c02a2a8832223f67d66c341721 src/clerk_backend_api/models/instancesettings.py: id: 813025971cc0 - last_write_checksum: sha1:bb23bf981809e2016749f570cf67674a360b52a4 - pristine_git_object: de9302e118a9bded91db66494506696d127aef51 + last_write_checksum: sha1:a6d6e461cc12092b1822b150642525301bad2421 + pristine_git_object: 17df4caff99765c44ba0d108c501bf0a42078c0d src/clerk_backend_api/models/invitation.py: id: b1c4904661ef - last_write_checksum: sha1:e14d1f12b4459ab9ea05fab6b49a48c9c51a1e31 - pristine_git_object: f7e91dcae609a750398a298d3763dfdf97f669dd + last_write_checksum: sha1:ec881fd93089e3d5b8c955d4eeb6e5d4ac183c95 + pristine_git_object: fce619856838b33e2a574c7cdf84749e69488be3 src/clerk_backend_api/models/invitation_revoked.py: id: 0b42ed7d21d7 - last_write_checksum: sha1:489193aed693ed859b9b57c95f9e7d7b23027045 - pristine_git_object: 2f86b96a7549cfa342c19d0ce5d8830cdc2bf876 + last_write_checksum: sha1:395506a4ec1a78d6f7c0c8ec6d6e229ed17bd698 + pristine_git_object: de7e1b09a13006f790151c680404db57907a979d src/clerk_backend_api/models/invitewaitlistentryop.py: id: 4202a11988ad - last_write_checksum: sha1:f51d3eac05b096664f01c74e8777adcee18b9305 - pristine_git_object: e28aea111f893464012c0eb272eccd0f14a30889 + last_write_checksum: sha1:ade722ffc1852f6540520ecb129c0b7ed890aae2 + pristine_git_object: 3fe14c1c6e115ff8951620200734c4f84f5afe42 src/clerk_backend_api/models/jwks.py: id: 40438f9ab22a - last_write_checksum: sha1:bf662a9230ecbe24fccad365a84e4ba736e01bce - pristine_git_object: 75ef182a564a756835f160211376a74f415d9f33 + last_write_checksum: sha1:c16ff243cf885bdfbc56919617d6e5e4ea52f182 + pristine_git_object: 6e5a40710dcc446aea50220475d5c50dfd83fa4e src/clerk_backend_api/models/jwttemplate.py: id: d44b9c6fbfd4 last_write_checksum: sha1:63c2e76368c5c414929da2da1ef3cc38b5e3a33f pristine_git_object: 2e30edd845289e450f5278f71491b5a890080aa1 src/clerk_backend_api/models/listallorganizationdomainsop.py: id: "199866500078" - last_write_checksum: sha1:fb235ff34316d8fd299563e543d6d8f8ae679853 - pristine_git_object: da5228abf5a87181f65dab386df5b1e249e72288 + last_write_checksum: sha1:962c294bcac20d26c1c53e8d89d6afc81424cf80 + pristine_git_object: c6651dcac1a5c92dbf4f456a775f36a46869eff8 src/clerk_backend_api/models/listallowlistidentifiersop.py: id: 44ca21651421 - last_write_checksum: sha1:550af203fd87a57c548d3ebf04da80bd8fd7802c - pristine_git_object: 10f12243e85ef1d32ee82ad7ccd140a57acf08a3 + last_write_checksum: sha1:c56f58469ab0175b300e8397211fc41426fc0150 + pristine_git_object: ee8bb68171d4a1e20f28d82ab91f979a969c9db8 src/clerk_backend_api/models/listinstanceorganizationinvitationsop.py: id: 2e259aad6454 - last_write_checksum: sha1:bdf8b3e0801701ad2e9477de8796468d34b313ef - pristine_git_object: d2c1448827b29d7fc3bf455fe9278243b340bb30 + last_write_checksum: sha1:dce99b820bc5eed5f2bd135a64c1d40c1c8f0cb9 + pristine_git_object: 921c92e822cd4bbf362d7cbfe4b0893faf42c0a0 src/clerk_backend_api/models/listinvitationsop.py: id: 1fc58cd23dcb - last_write_checksum: sha1:782b94b2ec834611cf7587eba93cae5082ebfce2 - pristine_git_object: a688edaca0db533ee5cbbff0653da6488443c5f3 + last_write_checksum: sha1:00dbe9139fc09c734d83203f2383506d4c4b26d4 + pristine_git_object: c4e6786de5361185fa4b9440cd3aa02cf9202234 src/clerk_backend_api/models/listjwttemplatesop.py: id: 12b88b42285c - last_write_checksum: sha1:57e6e7e15b41467616ac859588501b2894dd5b38 - pristine_git_object: c4d098fb05de1f6734b78a955b0abf8ff2d594fe + last_write_checksum: sha1:8bf86a7aff2098a80ceb41e6b29ec9f6394c4ea7 + pristine_git_object: 71c57a803418b696dd505371a205e2eb05f849d0 src/clerk_backend_api/models/listmachinesop.py: id: 70e1f6b4fa6e - last_write_checksum: sha1:e3fa864ae1fcb9e9c65423cc428620b8eb462fc1 - pristine_git_object: 8376e8432b7ea9c7ea75ea352ce1a05fe19555a1 + last_write_checksum: sha1:6b2c7d151e99bcf87488c9f71f4718e9805dd85c + pristine_git_object: ce0a318925251bdf2e0752277b5b24b0350fe641 src/clerk_backend_api/models/listoauthapplicationsop.py: id: aed7918b5db5 - last_write_checksum: sha1:6a8dcda5dbf9019aee1fd069655ff52f2d862a72 - pristine_git_object: e79aafe8c2bfbcab77a9e6ada49c38b8752b6842 + last_write_checksum: sha1:bb2f5842047b3872d660478ff1ca2e74eb0f2334 + pristine_git_object: 86ab8f49a16913c93da890b79841f70aff01aca3 src/clerk_backend_api/models/listorganizationdomainsop.py: id: 189f8d296b8c - last_write_checksum: sha1:aa456711bc62cb09f1373f9ade23d595ba1a6169 - pristine_git_object: 6c631f5e87dbd154036bc11aa006effee98b2c89 + last_write_checksum: sha1:8396e366ad2d570217ebd661f94065593f2a578a + pristine_git_object: 74aec04d3967e32dc8c146d851ff7407bbf3527e src/clerk_backend_api/models/listorganizationinvitationsop.py: id: d7dfd455485d - last_write_checksum: sha1:34a240de13fc81a8ae886d153a7de87dad098c73 - pristine_git_object: 360a78c114f858decd4b69afa073c6558f2c1938 + last_write_checksum: sha1:a4b799b50c7311ff56b90523dfa5a77dc1cff955 + pristine_git_object: 2ac1a0f9ea3914d98523eafa31515952e4946d63 src/clerk_backend_api/models/listorganizationmembershipsop.py: id: 8b694753dd8b - last_write_checksum: sha1:1ef11309058a1a41399ec7c467f91140882bb661 - pristine_git_object: 2e4eb2f5edaa88ece3d4f68398051e63b09eb2d9 + last_write_checksum: sha1:48798abc710647ba7e9f4e20c0387b391df6b92c + pristine_git_object: 216a09f9b55785c7db7122cddf5688315e1e66d8 src/clerk_backend_api/models/listorganizationpermissionsop.py: id: 401995a88711 - last_write_checksum: sha1:cdb5d1579a4d269bdbce07aaea87d25ca4f4c9a3 - pristine_git_object: a8db981baeba317aefcb67e987f52bac865c4604 + last_write_checksum: sha1:b7351c5f9be6c467a8f799672aad022dafc6204c + pristine_git_object: 8dc919ec2f3f4cfbe4086b0c003c02df00994baa src/clerk_backend_api/models/listorganizationrolesop.py: id: a049157a4389 - last_write_checksum: sha1:402536c286759c89f15f08109818fcc933b63885 - pristine_git_object: c44d28ed907d8c6229476685f3b80bb804179056 + last_write_checksum: sha1:e79571af44636e4d866f48f991d2abf2adfd428e + pristine_git_object: 73d809622993901035bf9772a8dea76a79bf2b39 src/clerk_backend_api/models/listorganizationsop.py: id: 3c53ef5bf61f - last_write_checksum: sha1:8e9b1db0a1eed7e77c9c28ce5f3a70c636cc58c1 - pristine_git_object: 4e841d911497129490f80ab23d299d844938bbfa + last_write_checksum: sha1:9ff0650afa08c2f41ab945c07000b894d867aa64 + pristine_git_object: 2d5518a4ee630a1968eaa009fdba89da1a3aa145 src/clerk_backend_api/models/listpendingorganizationinvitationsop.py: id: 759ef8eeceb9 - last_write_checksum: sha1:5adb3abcdec653bf4e4caab257b413cac46fc505 - pristine_git_object: e64d8461eb6e87081a8d91ee19750ba5e924270d + last_write_checksum: sha1:c0d25d2e313c516e40442426f07eea0dc2afdc65 + pristine_git_object: e72d6b5b27d2ee6017abbe639e4113387d5d6b54 src/clerk_backend_api/models/listredirecturlsop.py: id: 6ff93cfdd690 - last_write_checksum: sha1:cb324bc13f9fc2fd93e1533c04a64ca084358989 - pristine_git_object: 8d6508ad7599fef45eb0981a271a7a4528f90479 + last_write_checksum: sha1:b685642702a9e9d20a05df31ddad695aa3e51156 + pristine_git_object: feff60694665654d88958d8815610fd687926e85 + src/clerk_backend_api/models/listrolesetsop.py: + id: db80404b0d44 + last_write_checksum: sha1:c166973d20a9f8e6e3651b7a2d6f3c29dbe18246 + pristine_git_object: 2911be6bd9e78f081218cf1fb9add8b18ce46124 src/clerk_backend_api/models/listsamlconnectionsop.py: id: cb529afb3c4e - last_write_checksum: sha1:6461bbcde02eb34af4b3b3251cea6b37cd76e836 - pristine_git_object: 898c34c32f4ad1ad6c70f2705ea14d6267de15d9 + last_write_checksum: sha1:0a99470f7a8de68525e129126ce59e4f06d753ef + pristine_git_object: efdbc3c1b9a4763500875fe8bcb93aee6bd6f3e1 src/clerk_backend_api/models/listwaitlistentriesop.py: id: a84012b7b658 - last_write_checksum: sha1:5c943687a0a2e5fdca3dbab4338e49b901d2c983 - pristine_git_object: 5c88d4552cb25c71d7d9e1b0231ebe92f8b1a13d + last_write_checksum: sha1:bb4ff2ab8990bfc305907b3ff4df837ecf7f30ba + pristine_git_object: 9f338f947282bccef11a3f0a4d2fdfe11d061eb6 src/clerk_backend_api/models/lockuserop.py: id: a2aaab662eeb last_write_checksum: sha1:8e2fd47f6e56303b47ef32bada41e374dba4a5b6 pristine_git_object: 9b84cd23c29874bf893c1242581e9253ba7f09b9 src/clerk_backend_api/models/machine.py: id: b38df0834767 - last_write_checksum: sha1:a79a713e8f9477278bd5de0181f2c10b9bf71afd - pristine_git_object: 127d3436963962b04172ee89d861e400549670fa + last_write_checksum: sha1:6a89760dd9bdcf54540718289c991352efb9740d + pristine_git_object: ecc64c8f8ecd93e0c2df4fa351a4cb81ed524d36 src/clerk_backend_api/models/machine_created.py: id: 770dcb816aff - last_write_checksum: sha1:2653ea7960e0271f415bf7eb2a1d2ea483977c73 - pristine_git_object: 65fb363df4a851be6ef00814100f84e790d68ba1 + last_write_checksum: sha1:ff31b8b02db60da7064303839f9219867d66a6eb + pristine_git_object: c0c0ad8ea993cd6e4758299eabcb5bc8338ce8c9 src/clerk_backend_api/models/machine_deleted.py: id: 5717496f5852 last_write_checksum: sha1:cdf7524dbe0c0ac7b2d747100c7ba2104690298e @@ -3646,56 +3858,56 @@ trackedFiles: pristine_git_object: 9efdec72b33c0e63ecc11f5b3ea256c8d199dc01 src/clerk_backend_api/models/machinewithoutscopedmachines.py: id: 56fc43b97b95 - last_write_checksum: sha1:372959d8147184134ff960de9c39e48f79f94acf - pristine_git_object: e681edbe35ad918ab416e274eb4d51e0199efd57 + last_write_checksum: sha1:f5af6eed80590dfea1829719f79561ad722ccbfc + pristine_git_object: d409a13d4d5f9817e54285bc598c7733172594dd src/clerk_backend_api/models/mergeorganizationmetadataop.py: id: 49e007a2b6c6 - last_write_checksum: sha1:05d7d717582e02cec6bc3c311153c3a0750e9020 - pristine_git_object: e6a889de720a7f574c01a27787eb9f6cf4be46f7 + last_write_checksum: sha1:1aa95372f7e530cadf46060e6f3792fc3ee4f5f5 + pristine_git_object: 23d3fef429e9a5a2fec2cbe50fe3d3463ffe4d99 src/clerk_backend_api/models/no_response_error.py: id: 52f74a771f94 last_write_checksum: sha1:7f326424a7d5ae1bcd5c89a0d6b3dbda9138942f pristine_git_object: 1deab64bc43e1e65bf3c412d326a4032ce342366 src/clerk_backend_api/models/oauthaccesstoken.py: id: 11577b03d7c8 - last_write_checksum: sha1:1b64b727bddcf85fd84f24f7bcfc417bb43369d2 - pristine_git_object: 50e8bf2fc2e62802c8ca3ffe6d7ad14bba93bc04 + last_write_checksum: sha1:dc61c1e7ac272c2dcdb278c3a742b737dcd78fe2 + pristine_git_object: 69d3f958585721ff08c9b1702487f0b192706289 src/clerk_backend_api/models/oauthapplication.py: id: b6e3060aaf0e - last_write_checksum: sha1:b6289d528323b5ab000101567147cf895ca3dd7b - pristine_git_object: acb94149503f1034e84fcfdb6da7b1e31e0c5143 + last_write_checksum: sha1:7a61306fb19fc5ca1c17922ce26f2091924f4c68 + pristine_git_object: 99d09327de7e07bb329390e2f5bfe1a52234df23 src/clerk_backend_api/models/oauthapplications.py: id: 4c7ac174fede last_write_checksum: sha1:01c2a0f4dd55cf4f559906d17c750ca4dccd61e8 pristine_git_object: 879adb3b3327e233c4d252e3f0e8650bd55e4f45 src/clerk_backend_api/models/oauthapplicationwithsecret.py: id: 924cea7b78d6 - last_write_checksum: sha1:7eaa17a3246b54e32f9c52915db9fd21f4c2110a - pristine_git_object: dac5cd10646fd82835efd50dbaf3bee51d40d0d3 + last_write_checksum: sha1:5c8d99ec4c7ec21b7ea964f1fc74ebd8865be54f + pristine_git_object: 6b9d38ceb7d7a531c14e05c9476b649dbb21b1b0 src/clerk_backend_api/models/organization.py: id: 80ef72d7e4bf - last_write_checksum: sha1:8f8bea831ac0104facefc0581c70d178a2c7be09 - pristine_git_object: 64a04cf561739c8f0ab6921e016aeae1314d8914 + last_write_checksum: sha1:0562673e22c97bbb0c7b8757fde3e20a292e5bbc + pristine_git_object: 50eafb8f658b86f34eb0fc1b9f39852817110c3e src/clerk_backend_api/models/organizationdomain.py: id: 627b7a1a5e5a - last_write_checksum: sha1:a55a6a493563da18329b65dbb1eb6ab38fdc44a6 - pristine_git_object: bf1765db7790df795ee9d518e1e7719d4d5e0abd + last_write_checksum: sha1:4f5c7789fc1b498591f40710eed93ca79932b0c5 + pristine_git_object: e5a85b2380efaa22d4f84ab6dd5e56bf0e4a7d44 src/clerk_backend_api/models/organizationdomains.py: id: 7bd99087d029 last_write_checksum: sha1:d3fed2db47a386709a3f89e37707a5ece87fe3d6 pristine_git_object: 6bdba7209e291b318c8af19a6c705ced62991266 src/clerk_backend_api/models/organizationinvitation.py: id: dd8ca48e7d12 - last_write_checksum: sha1:25c9f3ecc9596d868e134726fd72ba183db24b87 - pristine_git_object: d09d25b805e1c9b06b39ace637e83dcb32952a86 + last_write_checksum: sha1:cd4376804ddb7a548d36a5d5df4f8c2dbd036499 + pristine_git_object: bb5627875daa621e49b5fd174270cfa49e9f3ef1 src/clerk_backend_api/models/organizationinvitationpublicorganizationdata.py: id: 575b3f8fcbd6 - last_write_checksum: sha1:ff64ed7077998ba94b6b917be81d4620ab8fdb1e - pristine_git_object: 749798974575969069cee84dbf64af6a6c2120b1 + last_write_checksum: sha1:f5115e7096f86f616371003e4196cbca0a6d104d + pristine_git_object: 14174a92cbc2eba449828ba1ded4a8831887c13c src/clerk_backend_api/models/organizationinvitationpublicuserdata.py: id: 13a77231f2e6 - last_write_checksum: sha1:7246a6cd0ba50d87c153883bd2c485337459f9c7 - pristine_git_object: c67130b9dd5ffd8d9395527138c8268b529d1fee + last_write_checksum: sha1:6404c48d39c96f6255d4d4d1ce32c4d5f075e1e9 + pristine_git_object: 1bcc9a7ab9b215498d0ac5a8d7e7992921f27f33 src/clerk_backend_api/models/organizationinvitations.py: id: c547efe783c4 last_write_checksum: sha1:4efd36f333c9697be79cc99670863525232b2b83 @@ -3706,16 +3918,16 @@ trackedFiles: pristine_git_object: 4ba639d78645a3b75549d17b335f69f0dfed370d src/clerk_backend_api/models/organizationinvitationwithpublicorganizationdata.py: id: a6078d964aa7 - last_write_checksum: sha1:d83c1328d90c87121c8c1622363380d0ff6664fd - pristine_git_object: b34be584be90babc8b859db73826bac6c83296d4 + last_write_checksum: sha1:ff52a9df044b57b84c90861e87650d16717b9a15 + pristine_git_object: 8b5b670b99eb218d6c57f5b27aa78f648d0778b2 src/clerk_backend_api/models/organizationmembership.py: id: b88b3dca6da2 - last_write_checksum: sha1:d3ff0e9f8432742bb42c8a4b5622f135d3cb23dc - pristine_git_object: 72d3e3f48996963d4c98d3379fb751cac78a5b7d + last_write_checksum: sha1:61099c84373c45cf8fb244e1ef87faef64b037c0 + pristine_git_object: 8ab12af9d238ca63752768408f12e133684f5142 src/clerk_backend_api/models/organizationmembershippublicuserdata.py: id: f5370bc52443 - last_write_checksum: sha1:51c7789f2ed5dec0ac36b3a2745eef897a4b2ee4 - pristine_git_object: 9997b14791f1082aeeecba8c4ad9fdcf3ad12dee + last_write_checksum: sha1:f17f725e2b3d8ce4606025cc98c8471a66dd91a3 + pristine_git_object: 61ec55d04a963ba31400149b5c6cf75046f4f2cf src/clerk_backend_api/models/organizationmemberships.py: id: 258d894e5b88 last_write_checksum: sha1:be0b4c77a757e43d7d16d45c3290815e1fd8f9bd @@ -3726,12 +3938,12 @@ trackedFiles: pristine_git_object: 6715514c1723f36103d08b0515b2a72181d88f22 src/clerk_backend_api/models/organizationsettings.py: id: 29f31551cc85 - last_write_checksum: sha1:d1635205bf3756042e14442a712dc07b4b2e028b - pristine_git_object: 6d6462e9d41c4509590ef1d9fe0c9485d96a8d53 + last_write_checksum: sha1:33dabb244d447b5752e54c5c8a4d69c0b81ac860 + pristine_git_object: fcc57344aa335ac7246c139f32e329bde1b5eb1e src/clerk_backend_api/models/organizationwithlogo.py: id: 39e7afc96dd0 - last_write_checksum: sha1:b63b00a4463d7f27d0a3da5b32fc25af3cf27eec - pristine_git_object: 26ef758cbe8ef543c948eac838d125430a952799 + last_write_checksum: sha1:09e99574036570ac9fcb3f430354494fbe8717f0 + pristine_git_object: 3610c3fd65769cd87407fec39a8e49868fc8aecd src/clerk_backend_api/models/paginatedbillingpaymentattemptresponse.py: id: a30c95e05339 last_write_checksum: sha1:7b50424f68eb4beeabe7b551697b53ab1e60c51b @@ -3750,8 +3962,8 @@ trackedFiles: pristine_git_object: 63845298687bec15116841e4390c6d0d1d830e14 src/clerk_backend_api/models/passkey.py: id: 09aea0b132a6 - last_write_checksum: sha1:e6de3d89b35b5d9036cf44361ef753e564b7c62a - pristine_git_object: 0cd3ee9f0cd355047fd2fb6c6fddd848a471b243 + last_write_checksum: sha1:4e49b27d032093650e622270836466e328371cbf + pristine_git_object: e5e379fceff9e495e27e5b35e40260bca15032eb src/clerk_backend_api/models/permission.py: id: 725c343a939e last_write_checksum: sha1:9f550259f144b54884328ed3d3beda0132f54a36 @@ -3762,24 +3974,28 @@ trackedFiles: pristine_git_object: 1f26ccef3cb6e58c4f011937021f5edc48784408 src/clerk_backend_api/models/phonenumber.py: id: 482915240b97 - last_write_checksum: sha1:d43b1e35d5e6b99b50823ab9114ab264be9074bb - pristine_git_object: 12f5fc735c5c10be4bfe27d55d30c30cd4b4839f + last_write_checksum: sha1:5c6cae9afdcd12dc6be936f62e785f2e5f3cf37e + pristine_git_object: 775ecbba912d4d70b3608878d9b930c984c15f05 src/clerk_backend_api/models/previewtemplateop.py: id: b2a71f626359 - last_write_checksum: sha1:7851d0068956f65fa77e6765e8babdebbf8a64c9 - pristine_git_object: c1c2e4c75fc74f89f6280a23b5bdea38f5c60f4b + last_write_checksum: sha1:2d4e84f002a185188d6e379a7dfe38ae116dcad3 + pristine_git_object: 1b3908814ae29a18c602312e2d1d0f4985103a87 + src/clerk_backend_api/models/pricetransitionrequest.py: + id: 02b3d317f840 + last_write_checksum: sha1:261efa52088f3481dd7db7991b2624b081eb3271 + pristine_git_object: 7561e53814ca457dad0c6df8f3baadcc8c39650f src/clerk_backend_api/models/proxycheck.py: id: 304c1a2b3b12 - last_write_checksum: sha1:4efb01e18241027a2de76c4cb74f1559e815bb9a - pristine_git_object: 428941dcef7284b59d1bf83bb4fec827afd47c82 + last_write_checksum: sha1:21c85773efb93448f5c7939e612c18cd0514b61d + pristine_git_object: 22d2634a62e6a56c056e2c5099f5627452c99c8d src/clerk_backend_api/models/redirecturl.py: id: df2e19f4a63e last_write_checksum: sha1:5c94340c32ec2ad8925c6841ad5268866fd922c7 pristine_git_object: 2e7218642c637f6a6c5ba1635c5ab513669e9d05 src/clerk_backend_api/models/refreshsessionop.py: id: 4cdf74c6f9e7 - last_write_checksum: sha1:349bef69a1dc64ae1269557b6f03186ffb11c43e - pristine_git_object: 3a966e5d1d49bb0151352f3771b26a5ce7a8740c + last_write_checksum: sha1:54534206c84b5c8dce3dced80f4b34ba1e986dc2 + pristine_git_object: afc04703eabcbc1ae440691fabaf74815fb0121c src/clerk_backend_api/models/rejectwaitlistentryop.py: id: 5125249f4a11 last_write_checksum: sha1:9ca38e7bfbd5fdf4b007becd426268cdee883444 @@ -3788,6 +4004,14 @@ trackedFiles: id: 6c86531412ec last_write_checksum: sha1:45a237fde48c0c313429957aa8e23c3eb9735356 pristine_git_object: 9814addf0188df615ba44a53201a42dbe837e32d + src/clerk_backend_api/models/replaceroleinrolesetop.py: + id: dcb3bf74ab86 + last_write_checksum: sha1:c62e023b6a2cdff19486ada3264c93a57d8669a2 + pristine_git_object: 939bea74e35ac1d028cc279373e5f457fe0e7561 + src/clerk_backend_api/models/replacerolesetop.py: + id: 8172861fba24 + last_write_checksum: sha1:bd7574ff01ef66d4ae10b3e8125c46871d54a586 + pristine_git_object: d114cc0f7eead8cb07b32538820a8a68bd7b15da src/clerk_backend_api/models/responsevalidationerror.py: id: f06daf48a102 last_write_checksum: sha1:cf6ce06c477c6c994e86d95a55ac52b87c2218a7 @@ -3802,20 +4026,20 @@ trackedFiles: pristine_git_object: feaa89ce377c88c40b737aa878db85dca8983d6b src/clerk_backend_api/models/revokeapikeyop.py: id: ccd54fbb5b1e - last_write_checksum: sha1:b8c88b55b3adcfb25a8c08c2fe006a46e3e7bfaa - pristine_git_object: b21166ed3a05497f507f57553392b31918b83bca + last_write_checksum: sha1:6901c1f330e9ce0f3fb6ff37d60fce85ff5de5ae + pristine_git_object: 5dbb10df8944721c0668344703b4a7c6ab5f340e src/clerk_backend_api/models/revokeinvitationop.py: id: c2c551aa3fb1 last_write_checksum: sha1:b5a7ea1c95744298893ec7033c6f861dab778509 pristine_git_object: 2f4e1cd62a176c40fb58baa0ced5c80744ec5e0a src/clerk_backend_api/models/revokem2mtokenop.py: id: d9c1d604d521 - last_write_checksum: sha1:c43307b7024972fd3bc6b1dc53330796279d07b4 - pristine_git_object: 3dbe737dbd4be3402a8a005014671043f9df0506 + last_write_checksum: sha1:727c4c702f687b8e80774be98919cd70ef8307f8 + pristine_git_object: 8cfbf58cfe53bc899aae5bc55b6223a1f26eddb5 src/clerk_backend_api/models/revokeorganizationinvitationop.py: id: 55fa03fa4268 - last_write_checksum: sha1:60cf46b8e243e24b0761cacc5098e705d5ca8348 - pristine_git_object: bc340c7a87cc8a0b546daa10bc1f51b8b1f26151 + last_write_checksum: sha1:0137e1f62d1ce2a2a95b6c419c30481e198f524a + pristine_git_object: 64d6c11ad999796bc88e9f25d959fcf55a6a1d83 src/clerk_backend_api/models/revokesessionop.py: id: a53d54983847 last_write_checksum: sha1:d407fe690e99b45d91bc16d960a0cb7f6b237da2 @@ -3826,12 +4050,24 @@ trackedFiles: pristine_git_object: 4aeb54aa92e9facc7689e9d18bf03f054ecf2728 src/clerk_backend_api/models/role.py: id: 24a2f2f91439 - last_write_checksum: sha1:dbe2f2aa6db229b3544d70bdf84cc6257c7b225d - pristine_git_object: 006083103a01abb550b25f21b9558b8f8ec1ff2c + last_write_checksum: sha1:91fe768f4e0e45126195e6538816c7ab30684619 + pristine_git_object: 254cab2c8e2aa8d9c4be241d2fc645e6cef3030b src/clerk_backend_api/models/roles.py: id: 6a21f4fdd123 last_write_checksum: sha1:d9ee432233d99b901b0f7d32db3f00068582b6f6 pristine_git_object: b05c11b5a81fcf4db9e3cb3cef2dfa044e6aa634 + src/clerk_backend_api/models/roleset.py: + id: 8786c2b04e26 + last_write_checksum: sha1:070486f3c0e3397d3dc1d2bc0fba4191e5b862bc + pristine_git_object: 49dbde0371c305bedb1957ce9a934d1f00136012 + src/clerk_backend_api/models/rolesetitem.py: + id: 42f901635064 + last_write_checksum: sha1:b2745779a7ea6bfff33c80b31541d230ad337899 + pristine_git_object: 7f3e8754c18ec89127e1fd0d1b2e99cf67c175de + src/clerk_backend_api/models/rolesets.py: + id: c04be7307e3c + last_write_checksum: sha1:d26438ef019c6e4645e088ffdd2ccb7120aecfa8 + pristine_git_object: dfaba990eb269fcfce8eb24415813135b6d3ab26 src/clerk_backend_api/models/rotatemachinesecretkeyop.py: id: f8150a148010 last_write_checksum: sha1:6c9612fc62d222f91318d900de3e3cada555c848 @@ -3842,8 +4078,8 @@ trackedFiles: pristine_git_object: 4c0586ea03498ce190ecc66ae7e25405f4878633 src/clerk_backend_api/models/samlaccount.py: id: 49087d16fc62 - last_write_checksum: sha1:88f71b4b6ca16cf1afa3597df5053f0392d16c8d - pristine_git_object: 54565c2001c9cb7b74867682ed2e7d48403658dc + last_write_checksum: sha1:926d6b86bcf7dfadf1e6795242a76de6285b079d + pristine_git_object: bd590c3d71cb3a2617dc5483aa87f7fb7b71d464 src/clerk_backend_api/models/samlconnectionattributemapping.py: id: dd9563c2bade last_write_checksum: sha1:d15a2875f032ec073d28ec1b98820799a8266cf1 @@ -3852,34 +4088,38 @@ trackedFiles: id: 327b5218696a last_write_checksum: sha1:581aed7e97c24a47c4417dbb1db7150dd28cd3f8 pristine_git_object: 2d04651214b1105ef337d000ffe6a3e4d531ba99 + src/clerk_backend_api/models/schemas_commerceplan.py: + id: 67304214fcb9 + last_write_checksum: sha1:65a49137701b6944763ad0104fe1752625fc16d0 + pristine_git_object: 153423e2e70cca88db8ba4bb2b9c5835902eb924 src/clerk_backend_api/models/schemas_commercesubscriptionitem.py: id: 3913a47cc4e2 - last_write_checksum: sha1:b831257b82d27f9c12dcab6250b4240fc0c84386 - pristine_git_object: a94dbd5e69ce23685090503ad0121649ec89aa9e + last_write_checksum: sha1:1728b50e9b6c4543317af5d211bca8548bd75878 + pristine_git_object: c226cf0fcac85b1f77d95a8f36c7be079eeb5e8e src/clerk_backend_api/models/schemas_featureresponse.py: id: 6defa699c0c2 last_write_checksum: sha1:8b7e9a93a74d40a89005b77bceced6c95575cc8e pristine_git_object: badd84478b828f4ea140fb3c8805247992af0557 src/clerk_backend_api/models/schemas_samlconnection.py: id: a3bc0ed49651 - last_write_checksum: sha1:34117601c0415085a0e4e62e9359943183332a90 - pristine_git_object: 19bf7cdc98ae7d21ee5386e8d75aaa59c8645bf9 + last_write_checksum: sha1:90b64eceb819618e3d281ea3625901a3800eed76 + pristine_git_object: 9c4e1b3fee9bb70193d3cec442ab2232c564c645 src/clerk_backend_api/models/sdkerror.py: id: b9a19e5580e3 last_write_checksum: sha1:5e2c978b6a359bdc765a5e52987604be9ac3dba3 pristine_git_object: 2eb5461df773c2b299f8e49fddb77c3184b76980 src/clerk_backend_api/models/security.py: id: c6c7d036b1c0 - last_write_checksum: sha1:ff79955757263470a5bca715e388d0ad7f70df04 - pristine_git_object: cdcd78ce6204b13a8533f4d8fd991bf0ed6bbacf + last_write_checksum: sha1:f28fda09fb522d44a0b03210c2c9e69303fea6ab + pristine_git_object: fc2d014c6409d1fd6c1b02b3ba4c097e089ec141 src/clerk_backend_api/models/session.py: id: 55446ac797d7 - last_write_checksum: sha1:073736f96bb83679075420f82901bc48ec57c1da - pristine_git_object: 66ecc7e77d9ba20eb4be9a711875d983eab2d20f + last_write_checksum: sha1:3ffe2b0cda1aa5c2e608f9f1914cb489b2e5ab09 + pristine_git_object: 3f6cc39afba06a294845e752d0768e3455fcc111 src/clerk_backend_api/models/sessionactivityresponse.py: id: 33fa48685355 - last_write_checksum: sha1:03798a351fa363cc56e7c78a38b5347dcfdf1c99 - pristine_git_object: 0352399e812d20829648f1c3b9422357ab87a376 + last_write_checksum: sha1:800bb55b1a8bd627eb947b132cc95bfe0445bcb4 + pristine_git_object: 46833ff7344a638c120c1db8933cb057ce93e9de src/clerk_backend_api/models/sessionrefresh.py: id: 081c4c551da3 last_write_checksum: sha1:7f3e3c9c8540873d78f51e53708e28f14336fdd5 @@ -3888,42 +4128,46 @@ trackedFiles: id: 84c53d4922c8 last_write_checksum: sha1:3f073254a343a5df91f30c0582503dd62b90e155 pristine_git_object: 02b2bc723d1da733b7a6118fbd9ac446f567934e + src/clerk_backend_api/models/setuserpasswordcompromisedop.py: + id: ed189a5410f0 + last_write_checksum: sha1:a546de4e70b9ca1a87fd7e6708654f503031952d + pristine_git_object: 3eb632d44b7c8ce5819671d8067d52971d3fd3e4 src/clerk_backend_api/models/setuserprofileimageop.py: id: 03a938d0a33c - last_write_checksum: sha1:c99d5614b971570eb52a86417f74091375006384 - pristine_git_object: a38de6b27ba14f4be6477157db8dfd97027a7a96 + last_write_checksum: sha1:d4bab1a376653569bb3e61bce06a922cffd808c3 + pristine_git_object: 30e02493b9fecdcfeda0eb4710dc140e98f3f68b src/clerk_backend_api/models/signintoken.py: id: 0de4cbb3f8d4 - last_write_checksum: sha1:0249a7428a14801b876f84c067aaf6b18062baf1 - pristine_git_object: b03c5f60a84d7be75eecd65e8a7fd7b0323cecda + last_write_checksum: sha1:9173f5d6e00270be40487e3e704a8e927976f04b + pristine_git_object: 657cb69cb372657c08f588de313de9bf995d8390 src/clerk_backend_api/models/signup.py: id: a5a71c74fb54 - last_write_checksum: sha1:35b4c3d1b54fd3a2155f77c5a6d4bd1940360ad3 - pristine_git_object: a61345ec50714f91af7f20df35367ab4c9a714fb + last_write_checksum: sha1:f939cdc71d84cc6bbe356c9223498bbfbc1b2c2f + pristine_git_object: e5e3485c5b645e30a8dd1c34c3fcf16ac3184ce5 src/clerk_backend_api/models/signupverification.py: id: d01b54c7f836 - last_write_checksum: sha1:0cab0a9e94faf1e8d65ec3e85e065726a9ffcf0a - pristine_git_object: 8d8e7743f39177913b8087743d50c06039887f3b + last_write_checksum: sha1:eda9f775585507f937b17743df93ca7f3e24a364 + pristine_git_object: 31c36a8ef2b3dcf1e1db3cf2474937731a9d74e6 src/clerk_backend_api/models/signupverifications.py: id: 2ca59d04bd48 - last_write_checksum: sha1:e94da1c65a64b57cd92c0a20820c8d42c832d249 - pristine_git_object: d0e6d99dfe49f8bceddf160891209414343251c5 + last_write_checksum: sha1:b224743186ef88299194542f01e61bb7bae64b49 + pristine_git_object: fa578bf2f9843b5b19798622e9b49ac6b5769314 src/clerk_backend_api/models/svixurl.py: id: 24275c02407e last_write_checksum: sha1:8b91f5f5e4b00a150c39759a6aba0b52aa43f866 pristine_git_object: 359d58b3dfb84c672f28a3058eba3808c87731af src/clerk_backend_api/models/template.py: id: 2fd0f341c193 - last_write_checksum: sha1:21fa3c49e3157ce3cac34af96bcc404b28f9d846 - pristine_git_object: a7da76213ac502afc43ae44fa36b7c1c0e328402 + last_write_checksum: sha1:ea8fa25c6a58bb364906d028665ecf3c21f99647 + pristine_git_object: e31a293d6712adf0e4c369aca6383194c6c31750 src/clerk_backend_api/models/testingtoken.py: id: e296da75f056 last_write_checksum: sha1:b4ac51693a6c611b3d65a095ef381f989889d64e pristine_git_object: 241f5e47a1d6fcf93a32fec4e49fa892ed1d1db8 src/clerk_backend_api/models/toggletemplatedeliveryop.py: id: dffab61ac7ac - last_write_checksum: sha1:334fdc231827bf6bb234ddca3b62099da7f4ae79 - pristine_git_object: a9b7d156df67af8565e985d389d68642de717da6 + last_write_checksum: sha1:198b5cd7a01d1b9481bdf234246e43e266196926 + pristine_git_object: 46b71769284b0b45c54464a962e5cba7299e2d01 src/clerk_backend_api/models/token.py: id: 25bbd03c6ed2 last_write_checksum: sha1:bb1d75de51e1712431bf7ac54b045738a87b7ad4 @@ -3940,106 +4184,118 @@ trackedFiles: id: 29766bf9e1bc last_write_checksum: sha1:3ec3d8aa2d4b0fc8449202228ed0e1ecce1ed4dd pristine_git_object: 1bc3c8e0002e1b2166dbaecd6fe28bc354c18cde + src/clerk_backend_api/models/unsetuserpasswordcompromisedop.py: + id: b80c308d4ecd + last_write_checksum: sha1:b606c49ab46c69eadb976357628e5ba6f4226089 + pristine_git_object: 17ebdc0558cb4a95b8c8920585e18c6fb7b69f5d src/clerk_backend_api/models/updateapikeyop.py: id: 0806fcaf3c52 - last_write_checksum: sha1:49cb9927f482aa42a5d248245196c6fcc5b7f676 - pristine_git_object: c2f0e49bef23c94f20e393e5ca475e42825b8d91 + last_write_checksum: sha1:b13e0b097e59e84dd2748f20aecdd04264de10e5 + pristine_git_object: 36d8c05c483f930fd17d507e55a070187de0c596 src/clerk_backend_api/models/updatedomainop.py: id: e48432b285d4 - last_write_checksum: sha1:6b83cd7630a24eed9b94271bd0f9559a4838ecf0 - pristine_git_object: 30b04c19e12ebcd999bd3edd49e48fabdb305e34 + last_write_checksum: sha1:ca0c9029b8ceaab07f0635127b24f63b6881d7b2 + pristine_git_object: 5461eff31870a8e3fe192bd16d731613acb64fbe src/clerk_backend_api/models/updateemailaddressop.py: id: 745bda839938 - last_write_checksum: sha1:7539f511171e6706ce33ff8aab064682bb25889e - pristine_git_object: baaf8d16bb0b49a544d598b34eaf3ec31bc55b29 + last_write_checksum: sha1:80d5cd0fa56504ea9d5a2098ed255acbfcf155f2 + pristine_git_object: 72b76f23693076baead95c246e385a12358cd376 src/clerk_backend_api/models/updateinstanceauthconfigop.py: id: e4d1c554c8a8 - last_write_checksum: sha1:fa956745cdf2e3c33f0678b562d1d028029d739a - pristine_git_object: 8ec758c3a7544a106f99b6c5ab822c49e9ea066c + last_write_checksum: sha1:ec20a9b9de3ee638d780e058c0c06c63036bfaf4 + pristine_git_object: f249e8e839297df50b70aaffe3a3e7c1bbf70b46 src/clerk_backend_api/models/updateinstanceop.py: id: 40af0297ff55 - last_write_checksum: sha1:fe9546a4ad54c4fc5cf23e91ec5c74a747906441 - pristine_git_object: b8bf6a3b605485738bc55739d45e8cb30b40ffa4 + last_write_checksum: sha1:076f0a64b7f9b8687e488bab327052a577739152 + pristine_git_object: 81a9dbe0a8a4ca4f8ba3c41d5d0ea331120971bb src/clerk_backend_api/models/updateinstanceorganizationsettingsop.py: id: cfc65d736c99 - last_write_checksum: sha1:4759048dee51726b160a3b430a731eea6f4fc2e9 - pristine_git_object: 72fc23f8069d90c3c6298c8669a3b6472dee75f7 + last_write_checksum: sha1:0e364e786e2a3d2e76ceea84fcc31ba7ffbabb8c + pristine_git_object: 6a838b785ab8fc7472a66cd8dd7258057a9623ae + src/clerk_backend_api/models/updateinstanceprotectop.py: + id: 7e1b719af3db + last_write_checksum: sha1:5b3cc78e0fc9275c597c3abb398ffb89ffef1f86 + pristine_git_object: fbef838669593768d979096c3447ab0b85aa68e8 src/clerk_backend_api/models/updateinstancerestrictionsop.py: id: d8dfacb6c7ac - last_write_checksum: sha1:51d948d172833e6ce80aa61b8515264c33165b61 - pristine_git_object: d64886519316f1cd2560c678a8540eb159f40092 + last_write_checksum: sha1:aba80207999884cd4c95ff72d5ad6c49e3174cf5 + pristine_git_object: 656ee66b5bb58c8e8aefc13ca8b25518c83f5411 src/clerk_backend_api/models/updatejwttemplateop.py: id: 5269c6339a2e - last_write_checksum: sha1:b31e2d69700427621373d6ec51e6433a5f7e3887 - pristine_git_object: cadc0d1fe78fa46583dac157d7b7ba749671e053 + last_write_checksum: sha1:90b51ee493e6745634a076058270d687f2c97217 + pristine_git_object: 0d91d0c578a40b67d642f7c1f06f421f78418c82 src/clerk_backend_api/models/updatemachineop.py: id: e8fcb3f28d02 - last_write_checksum: sha1:da6ee63842506cfb8e3523dd5b292bb180922aea - pristine_git_object: 072efd10647618ce6c18b56a3603691584c43533 + last_write_checksum: sha1:ce87748430e01405eeba63cbe05b09103893ec1c + pristine_git_object: a92c575b02e88f349be37480447bbd88159e36bd src/clerk_backend_api/models/updateoauthapplicationop.py: id: 51fa6041548d - last_write_checksum: sha1:149de9f264a6d861180bb8d457620677cd80290a - pristine_git_object: d586255e594baf8e3f2f9d7d3c5b5379fad53351 + last_write_checksum: sha1:a9725bf3c064a90ec3f4bec8e15e23d711ef16d3 + pristine_git_object: 0419fb4acd7e4ce0e0d8e3775399281ecaab1f63 src/clerk_backend_api/models/updateorganizationdomainop.py: id: f821cc2481cf - last_write_checksum: sha1:94b33d2366e839643bf39c32ee45c56029150110 - pristine_git_object: f4aeab65df155bf74461842f776b08314cb134ff + last_write_checksum: sha1:811cd28ae7737cff845375f31b4426ff722e0d97 + pristine_git_object: 8ba026e9d60f99afd1f2e742ee081929d5a9dd4f src/clerk_backend_api/models/updateorganizationmembershipmetadataop.py: id: 20595ae3f1a1 - last_write_checksum: sha1:c65ce3dc1bae39af02dd4e057c70de52f145dee7 - pristine_git_object: 0589ca82f46a626c45ad4dc9ca80cf185bec81ef + last_write_checksum: sha1:539b94431d6d02817fabb551f5245be468cc91fa + pristine_git_object: 488a09501eb0a76f119dfe5b984dcdf6d9e67d09 src/clerk_backend_api/models/updateorganizationmembershipop.py: id: e5c2460f0700 last_write_checksum: sha1:da102ae18a0761ba0e643a0e5f51afc5e881579b pristine_git_object: 2ee3ab0f79d6cae0f1e1a6d5f42abc63c78bc82d src/clerk_backend_api/models/updateorganizationop.py: id: 2512f0951ecb - last_write_checksum: sha1:7b5ccc57e1b5bc2903b849979a275dae5fb16ab8 - pristine_git_object: a4498bd18d44ab4f19e48eb33f4ea5d1a2d3406f + last_write_checksum: sha1:dff0ae8dc5bfbdd91beb45bd8284ef58aa811863 + pristine_git_object: 1b78aa115110adfa855bd58396e901bb2131dcfd src/clerk_backend_api/models/updateorganizationpermissionop.py: id: 20032baa3021 - last_write_checksum: sha1:73c56ffa7001d2fd989fc669c91c38c4e13df7b2 - pristine_git_object: c74c4f2ef1b2dba826d6f5a5424502f774accebe + last_write_checksum: sha1:f8b7e53916541455ae5b3087c05b824ec983a532 + pristine_git_object: 21e47878375d76c7cb2de161dd0ceb74a25c31ef src/clerk_backend_api/models/updateorganizationroleop.py: id: 2961ad02e30e - last_write_checksum: sha1:864c347cc16dbee59bdc05e020209b49f377a6d9 - pristine_git_object: 59fea8d57cddc16705af234a5a27c92d92095b22 + last_write_checksum: sha1:08065f3849ff3d03fb8fba9b8ae07f22908f0b22 + pristine_git_object: cfabaa08adddc2a088bb702f3d6cf28f1760b8e4 src/clerk_backend_api/models/updatephonenumberop.py: id: fc9ed623b486 - last_write_checksum: sha1:2210a2310c9aa4ad3ef28fe9cf507dd7036fd6a0 - pristine_git_object: 9b094b16735239b848e35e6d2c69cc17462b316a + last_write_checksum: sha1:75b46de5e9a14989b70704cb0cd34a4cd776672b + pristine_git_object: 89ba0eaa3f1eb3729faf73c702323ba3ec07ac37 src/clerk_backend_api/models/updateproductioninstancedomainop.py: id: 9c8bb4bbf70a - last_write_checksum: sha1:7da887e30c431b309e9719d2e0abf3b2f8bd5d1b - pristine_git_object: d56c9fa1d05e3ebec24ecfd9ad24d3b4f2076455 + last_write_checksum: sha1:cab9de14b728f35acee7bf9d85b526baa3d09da5 + pristine_git_object: ca60067e3117b45eb036b7b0cccf696397d411f4 + src/clerk_backend_api/models/updaterolesetop.py: + id: 821eadef95cb + last_write_checksum: sha1:8c53d78989fe44292d2bc20e2cc1350bc0c625e4 + pristine_git_object: 3c5638403e3d1fc2f1a2513f0404f6ef47eae4e5 src/clerk_backend_api/models/updatesamlconnectionop.py: id: 144ab8498bec - last_write_checksum: sha1:2907476689f31716aefe581f1c15295531518fa6 - pristine_git_object: 0378a5b5a7ca30e04545fa84420d76d0205e3467 + last_write_checksum: sha1:d9dd420419588cb07a7027e9c4178d8fab303bea + pristine_git_object: f9177bcf64e62f728a188d937f604fce7fdb462b src/clerk_backend_api/models/updatesignupop.py: id: 8d2a3b3dc83c - last_write_checksum: sha1:2def16540f4349496112bacbad3e811c6b5f21c2 - pristine_git_object: a6907aea376c16b74c00166ecbb4c4eaed646b7a + last_write_checksum: sha1:4d49588c32efe90651a2b858ae9ff52fa6ee6627 + pristine_git_object: 957d5aa63630edbe22f93d2a3faa3cad38921f29 src/clerk_backend_api/models/updateusermetadataop.py: id: 3157339ad9c0 - last_write_checksum: sha1:6793d42e997429bfa8cc7aae6052b2816b63efc3 - pristine_git_object: 189fc1339a9e16e84b19e1317597ff102c2f54bf + last_write_checksum: sha1:8ad64c4c38b273a01397145e77cab69ed7750657 + pristine_git_object: 789a90a8b6dbd04efb64bde677d70bdeb6927ee5 src/clerk_backend_api/models/updateuserop.py: id: ef223ada8638 - last_write_checksum: sha1:8af6d70de173eceaea8c34fdcdcf3639e68aea74 - pristine_git_object: 37cc810b6df1548a1232f0d47fcb073744434047 + last_write_checksum: sha1:80eb9c49524ca3dba1067c1fef0d2cbe67eec382 + pristine_git_object: e6e96fb7c91abe4dbf1eb09702317756ef623d98 src/clerk_backend_api/models/uploadorganizationlogoop.py: id: b1d30098ca9c - last_write_checksum: sha1:7cb97fd09cd11ca398adb9d0192e6ec4330a013e - pristine_git_object: 55688ddc371e4fe6718f1d6d68510ee5e2d0d6b6 + last_write_checksum: sha1:8ba0a1b8799a7ca15216d0e58319e2cc6b6c380f + pristine_git_object: 48415c8d4873e5ffc0e2c6e50715aa3052afb797 src/clerk_backend_api/models/upserttemplateop.py: id: 01e18aa27ef2 - last_write_checksum: sha1:40ec3216635137b69b31c7465350ac4e1ab2a9ad - pristine_git_object: 1c2663f71b5c08cf9c35f1c4871ab8287f32b10a + last_write_checksum: sha1:1427e88ccf9200ce8a127d355a12a5c2f5e42060 + pristine_git_object: f4497c78214a0816070c0b740cccc4b4b5a4efbb src/clerk_backend_api/models/user.py: id: 670e52d1fa4e - last_write_checksum: sha1:2dceb4006b37ac68f2aee99cf40f16e5df21b13a - pristine_git_object: e6794943ea38ac408dca1110e89c933272883f65 + last_write_checksum: sha1:7cf4d59bd5c2c2d191347c6e2cca95eb93efea2a + pristine_git_object: 55f468b801f3c0c56efca78923292efd2cd9c225 src/clerk_backend_api/models/userpasskeydeleteop.py: id: 28b3f343b764 last_write_checksum: sha1:e25d07c5167b6afad3bb5f48d4d35c85759d349b @@ -4050,12 +4306,12 @@ trackedFiles: pristine_git_object: fd348fab96310f54a5af5c025e8543e137c8bfae src/clerk_backend_api/models/usersgetorganizationinvitationsop.py: id: 876182abfd66 - last_write_checksum: sha1:5835ee20355192dbf051d710055259ec511faf27 - pristine_git_object: ef29b2fc724f1337aaff42884e6f4c86573a9964 + last_write_checksum: sha1:354f1e9d14b2536c3f284a1bd7331956e29f2295 + pristine_git_object: ecdf9979f2384fdca8a82195e67fdc0485219469 src/clerk_backend_api/models/usersgetorganizationmembershipsop.py: id: c8dcefebf5e6 - last_write_checksum: sha1:c9052939e48706e9c0f6c3ef86afd13d6561fbfd - pristine_git_object: e7a6d51e577e567e3d6e4a470f8802522b4c9624 + last_write_checksum: sha1:91c83561cd3fe4a8b7c83adda8da1d33f59f5e0c + pristine_git_object: 38d4f67e9850d8168b9490eb14e4893642793b94 src/clerk_backend_api/models/usersunbanop.py: id: 07a1904d2b87 last_write_checksum: sha1:4480169a8c20ed7c206ced48554925a478179bb8 @@ -4066,44 +4322,44 @@ trackedFiles: pristine_git_object: 2e9f3a450b613a21e47fab445c7fc5176d59c76e src/clerk_backend_api/models/verifyapikeyop.py: id: 7150cd708098 - last_write_checksum: sha1:9b87e2264bbcbd36e085d198bba836cc0307167f - pristine_git_object: 9728e761dba7d9c168986eae74bb30b4b98602b3 + last_write_checksum: sha1:9e5d7ac4d088bb09f74b2e069222bdb5221cd5e8 + pristine_git_object: 191652627edcd0f77a116c1894b9ac81f1d12c1e src/clerk_backend_api/models/verifyclientop.py: id: adeeb384f0dd last_write_checksum: sha1:2104e8cfd6bf9e0aea42e200cc105642dbb00a51 pristine_git_object: da78ccc40021d0e5cf12d7f80489634648bdec73 src/clerk_backend_api/models/verifydomainproxyop.py: id: 522e9634b8d1 - last_write_checksum: sha1:a3a33efbdbdcb73f19fc14ca1e4d330127ff5c62 - pristine_git_object: 019f7b9d056eb95df5ff84cec4c9624c68e9a8ed + last_write_checksum: sha1:ad6451aed376fa86322e25064c80cfab29312e78 + pristine_git_object: 374a18d63d0dd08758bb4d5bfa9eb7b3b0c62a4c src/clerk_backend_api/models/verifym2mtokenop.py: id: d05996640ead - last_write_checksum: sha1:8341a62aa3da5b9db0e6fe559ec2d1760caf7531 - pristine_git_object: e2ca3c327660a2b9c14bf853940dcb1fd4093a03 + last_write_checksum: sha1:7ec926fb3963b58a2d521419902f7ceda92eab40 + pristine_git_object: 63b2318c5bd9a23c9809d52096e599dbaa501a99 src/clerk_backend_api/models/verifyoauthaccesstokenop.py: id: 6a9c59621174 - last_write_checksum: sha1:49a8d0ce474fa0ff90ef8ca256382bdfa664dcb4 - pristine_git_object: 162f5a07a32e7b25937755404c79023ff668a6e5 + last_write_checksum: sha1:5d954c025fcf582b78f161acaf25155569c7844a + pristine_git_object: 09c6059cca4583941d26f77edcbd4ae7ca8f0c82 src/clerk_backend_api/models/verifypasswordop.py: id: a40982f96e90 - last_write_checksum: sha1:d61059adfd2469f70b680831e3680c33c2e12160 - pristine_git_object: 1e13d00f5fbbbbb93d2ec2b4a0205079ad6c2552 + last_write_checksum: sha1:a0ea93a4ceac4d33d27e058e2d8c6d68cfd9da69 + pristine_git_object: 1254eac55935e64ce75fc56b45af30d23f936fc8 src/clerk_backend_api/models/verifytotpop.py: id: 08100c4346b1 - last_write_checksum: sha1:adfa75d5e359c9c863e22f76a260fdfec47c383a - pristine_git_object: 8532d8bd82b6d15539ab91453e24dd1a5ab14f60 + last_write_checksum: sha1:c3bbd08654498867518968ed664b0acfd6529d46 + pristine_git_object: 1fb852b61837c5b8e4204dbbc0cc37738348aa2d src/clerk_backend_api/models/waitlistentries.py: id: aeb3f4b8f415 last_write_checksum: sha1:82d606c5dc762c24fdc3099ee54b624ad1a04aa3 pristine_git_object: de1e11be98c4f56cb45cc1b485a66e4e24265c92 src/clerk_backend_api/models/waitlistentry.py: id: da9e10c97ea8 - last_write_checksum: sha1:fb49276797a86b6d61fd59819b2c33cf3cf7af3e - pristine_git_object: 81dbf1b56a2f8682c627d9ba9a2e3729f8f0f307 + last_write_checksum: sha1:1cd5062213f3f167657511ef616c1419ec43caa7 + pristine_git_object: 5f807a927c4e2a7a40cbb7e27bd8ab345710c423 src/clerk_backend_api/models/web3wallet.py: id: 66e5ce51fc85 - last_write_checksum: sha1:1c8b02ba5a844fc60177ae49cb0179b9da71aee3 - pristine_git_object: d998f4f9c17fc16a4c3b683485d0af777a7683ad + last_write_checksum: sha1:ff8b6b53fa5edee51319779f6ad7b9c72ebe6bb4 + pristine_git_object: 4df0fc3d4c1a6c1d37ebec016a546adb5114a68f src/clerk_backend_api/oauthaccesstokens.py: id: 93363bda547c last_write_checksum: sha1:b8744c98d17bec32be435a02c966a095add8587f @@ -4118,8 +4374,8 @@ trackedFiles: pristine_git_object: 7bfee84779b0403e0a1851bb101c3cec59f0ee27 src/clerk_backend_api/organizationinvitations_sdk.py: id: 4ff208f271e3 - last_write_checksum: sha1:27fca9feb8887d475ebd9411545dcf5a32348eaa - pristine_git_object: b5abd0ca59a48806876e027d8b8458a487fd89ab + last_write_checksum: sha1:280239cc450448d2dc5c0bd468bb7641a9fe5d93 + pristine_git_object: 8d0311437232f31dd3291406fe5e77ab6d410ac9 src/clerk_backend_api/organizationmemberships_sdk.py: id: 1a0c6c4eb892 last_write_checksum: sha1:472c5988ccfc4ee586f3b1c10f0254a423e501ea @@ -4134,8 +4390,8 @@ trackedFiles: pristine_git_object: 5d1274bae389462d4245e4cf7bb738187f4a6953 src/clerk_backend_api/organizations_sdk.py: id: bab9dfd5e53d - last_write_checksum: sha1:3b6e0997b1d3214e2231595c3f9a25761e312609 - pristine_git_object: a46062dda7407d0f3aaade63840f545c121cccff + last_write_checksum: sha1:1510ced03ab4c913a0534334fc099f769bf06735 + pristine_git_object: 1066f6a82d06a8fd8c820aae39fba11885b047c2 src/clerk_backend_api/phonenumbers.py: id: 33263264377c last_write_checksum: sha1:ebe8b084f0fa1285c3ef54ef20f72169b8a3abf4 @@ -4152,14 +4408,18 @@ trackedFiles: id: 35d58de70180 last_write_checksum: sha1:da9a7b7d1c975dde78f89fe851e7fd95ed5ea116 pristine_git_object: 9a710a27166f6373fb1e416606df5643a0e9711a + src/clerk_backend_api/rolesets_sdk.py: + id: 2520b5ee1f4f + last_write_checksum: sha1:cf2d31de7b864ccb1233588244f8cf5689523d79 + pristine_git_object: 7bbdda4d8768dd235d35fed08de4c0252244477f src/clerk_backend_api/samlconnections_sdk.py: id: 2e33ed64f642 last_write_checksum: sha1:1d32b6b39fdc3dec9b342d1fa26bbb1b84636581 pristine_git_object: 9e59834c63bda5706928f03cb9530a75bf8a4079 src/clerk_backend_api/sdk.py: id: a4df06d800b5 - last_write_checksum: sha1:47816f6af06a6c5f8804cce38ff0104abee70a27 - pristine_git_object: d713311e12e93e79da62fb61426b2bfd29167a83 + last_write_checksum: sha1:114957d514d1abf841c70b3f3f5744d442df0b3b + pristine_git_object: 74ea24fad38a83e28216d5d7ad2e1497578eb569 src/clerk_backend_api/sdkconfiguration.py: id: 7e4c691f3b9b last_write_checksum: sha1:da2b3b79da1f6d4669245a6bdd11b20657da25da @@ -4190,16 +4450,16 @@ trackedFiles: pristine_git_object: fc76fe0c5505e29859b5d2bb707d48fd27661b8c src/clerk_backend_api/types/basemodel.py: id: c78de8390613 - last_write_checksum: sha1:615d0b364fa924b0fef719958df34596cc7c1ae2 - pristine_git_object: 231c2e37283a76082f1a064c7aae47f8ee4ee694 + last_write_checksum: sha1:10d84aedeb9d35edfdadf2c3020caa1d24d8b584 + pristine_git_object: a9a640a1a7048736383f96c67c6290c86bf536ee src/clerk_backend_api/users.py: id: 6f835640685a - last_write_checksum: sha1:674a66a98f02bd4c7800ee9c7f20994728c4e91b - pristine_git_object: 5e0954137e49aecf81038e9cb3a294ead39fbbfb + last_write_checksum: sha1:12954904b28309599e9b0024bfd2aa47fe732278 + pristine_git_object: 7b99715c040f88477990495d53fbf8941e160994 src/clerk_backend_api/utils/__init__.py: id: a8b67e49e50a - last_write_checksum: sha1:81e0385b93362e0f3f6911b65bd4cc601ebc11e1 - pristine_git_object: 56164cf3a86399ee7a8e1a68d19fb494689d77c3 + last_write_checksum: sha1:398211d49b762a067ec6d10197a4b11dfd258ff5 + pristine_git_object: c906e1e0192e9017fc13851eb23fc0c2753429c8 src/clerk_backend_api/utils/annotations.py: id: aa59da404faf last_write_checksum: sha1:a4824ad65f730303e4e1e3ec1febf87b4eb46dbc @@ -4210,8 +4470,8 @@ trackedFiles: pristine_git_object: a6c52cd61bbe2d459046c940ce5e8c469f2f0664 src/clerk_backend_api/utils/enums.py: id: a08797f53dfe - last_write_checksum: sha1:786ba597f79dca6fbc0d87c591752bb8d775ecb7 - pristine_git_object: c3bc13cfc48794c143a64667f02e7949a8ce3fcc + last_write_checksum: sha1:bc8c3c1285ae09ba8a094ee5c3d9c7f41fa1284d + pristine_git_object: 3324e1bc2668c54c4d5f5a1a845675319757a828 src/clerk_backend_api/utils/eventstreaming.py: id: f5882f2ad74b last_write_checksum: sha1:bababae5d54b7efc360db701daa49e18a92c2f3b @@ -4238,8 +4498,8 @@ trackedFiles: pristine_git_object: c04e0db82b68eca041f2cb2614d748fbac80fd41 src/clerk_backend_api/utils/requestbodies.py: id: 47f0cccde5ce - last_write_checksum: sha1:e0a3a78158eba39880475d62d61be906625676b8 - pristine_git_object: d5240dd5f5efffabbd9aefa2f4a349511a9c75b4 + last_write_checksum: sha1:41e2d2d2d3ecc394c8122ca4d4b85e1c3e03f054 + pristine_git_object: 1de32b6d26f46590232f398fdba6ce0072f1659c src/clerk_backend_api/utils/retries.py: id: c8a5b5c54d76 last_write_checksum: sha1:5b97ac4f59357d70c2529975d50364c88bcad607 @@ -4250,8 +4510,8 @@ trackedFiles: pristine_git_object: 295a3f40031dbb40073ad227fd4a355660f97ab2 src/clerk_backend_api/utils/serializers.py: id: 50ff4899a574 - last_write_checksum: sha1:a0d184ace7371a14a7d005cca7f358a03e3d4b07 - pristine_git_object: 378a14c0f86a867ca7b0eb7e620da82234c0ccc4 + last_write_checksum: sha1:ce1d8d7f500a9ccba0aeca5057cee9c271f4dfd7 + pristine_git_object: 14321eb479de81d0d9580ec8291e0ff91bf29e57 src/clerk_backend_api/utils/unmarshal_json_response.py: id: a09f548ad43c last_write_checksum: sha1:8f1bde967f44fc394e5922d0da5e9b1bbfc6ab2a @@ -4643,7 +4903,7 @@ examples: CreateUser: speakeasy-default-create-user: requestBody: - application/json: {"external_id": "ext-id-001", "first_name": "John", "last_name": "Doe", "locale": "en", "email_address": ["john.doe@example.com"], "phone_number": ["+12345678901"], "web3_wallet": ["0x123456789abcdef0x123456789abcdef"], "username": "johndoe123", "password": "Secure*Pass4", "password_digest": "$argon2i$v=19$m=4096,t=3,p=1$4t6CL3P7YiHBtwESXawI8Hm20zJj4cs7/4/G3c187e0$m7RQFczcKr5bIR0IIxbpO2P0tyrLjf3eUW3M3QSwnLc", "password_hasher": "", "skip_password_checks": false, "skip_password_requirement": false, "totp_secret": "base32totpsecretkey", "backup_codes": ["123456", "654321"], "public_metadata": {"role": "user"}, "private_metadata": {"internal_id": "789"}, "unsafe_metadata": {"preferences": {"theme": "dark"}}, "delete_self_enabled": true, "legal_accepted_at": "", "skip_legal_checks": false, "create_organization_enabled": null, "create_organizations_limit": 81560, "created_at": "2023-03-15T07:15:20.902Z", "bypass_client_trust": true} + application/json: {"external_id": "ext-id-001", "first_name": "John", "last_name": "Doe", "locale": "en", "email_address": ["john.doe@example.com"], "phone_number": ["+12345678901"], "web3_wallet": ["0x123456789abcdef0x123456789abcdef"], "username": "johndoe123", "password": "Secure*Pass4", "password_digest": "$argon2i$v=19$m=4096,t=3,p=1$4t6CL3P7YiHBtwESXawI8Hm20zJj4cs7/4/G3c187e0$m7RQFczcKr5bIR0IIxbpO2P0tyrLjf3eUW3M3QSwnLc", "password_hasher": "", "skip_password_checks": false, "skip_password_requirement": false, "totp_secret": "base32totpsecretkey", "backup_codes": ["123456", "654321"], "public_metadata": {"role": "user"}, "private_metadata": {"internal_id": "789"}, "unsafe_metadata": {"preferences": {"theme": "dark"}}, "delete_self_enabled": true, "legal_accepted_at": "", "skip_legal_checks": false, "skip_user_requirement": true, "create_organization_enabled": null, "create_organizations_limit": 81560, "created_at": "2023-03-15T07:15:20.902Z", "bypass_client_trust": true} responses: "200": application/json: {"id": "user_id_123", "object": "user", "external_id": "external_user_id_123", "primary_email_address_id": "email_id_123", "primary_phone_number_id": "phone_id_123", "primary_web3_wallet_id": "wallet_id_123", "username": "john_doe", "first_name": "John", "last_name": "Doe", "locale": "nl", "image_url": "https://example.com/new-profile.jpg", "has_image": true, "public_metadata": {"role": "admin"}, "private_metadata": {"ssn": "123-45-6789"}, "unsafe_metadata": {"theme": "dark"}, "email_addresses": [{"id": "email_id_123", "object": "email_address", "email_address": "john.doe@example.com", "reserved": false, "verification": {"object": "verification_ticket", "status": "verified", "strategy": "ticket", "attempts": null, "expire_at": null, "verified_at_client": ""}, "linked_to": [{"type": "oauth_google", "id": "link_12345"}], "matches_sso_connection": true, "created_at": 1609459200, "updated_at": 1609459200}], "phone_numbers": [{"id": "phone_id_123", "object": "phone_number", "phone_number": "+12345678901", "reserved_for_second_factor": false, "default_second_factor": true, "reserved": false, "verification": {"object": "verification_otp", "status": "verified", "strategy": "phone_code", "attempts": 2, "expire_at": 1622852400, "verified_at_client": ""}, "linked_to": [{"type": "oauth_google", "id": "link_id_123"}], "backup_codes": ["code1", "code2", "code3"], "created_at": 1609459200, "updated_at": 1609459200}], "web3_wallets": [{"id": "wallet_id_123", "object": "web3_wallet", "web3_wallet": "0x123456789abcdef", "verification": {"object": "verification_admin", "status": "verified", "strategy": "admin", "attempts": 0, "expire_at": 1620000000, "verified_at_client": ""}, "created_at": 1609459200, "updated_at": 1609459200}], "passkeys": [{"id": "passkey_id_123", "object": "passkey", "name": "My Passkey", "last_used_at": 1615852800, "verification": {"object": "verification_passkey", "status": "verified", "strategy": "passkey", "nonce": "nonce", "message": "", "attempts": null, "expire_at": null, "verified_at_client": ""}}], "password_enabled": true, "two_factor_enabled": true, "totp_enabled": true, "backup_code_enabled": true, "mfa_enabled_at": 1615852800, "mfa_disabled_at": null, "password_last_updated_at": 15137, "external_accounts": [{"object": "facebook_account", "id": "ext_account_id_123", "provider": "Facebook", "identification_id": "", "provider_user_id": "", "approved_scopes": "", "email_address": "Jordi_Considine@hotmail.com", "first_name": "Nova", "last_name": "Barrows", "image_url": null, "username": "Peggie1", "phone_number": "(240) 834-3897 x5758", "public_metadata": {"key": "", "key1": ""}, "label": null, "created_at": 149561, "updated_at": 182730, "verification": {"object": "verification_google_one_tap", "status": "unverified", "strategy": "google_one_tap", "expire_at": 432680, "attempts": 818362, "verified_at_client": "", "error": {"message": "Error message", "long_message": "Longer error message with more details", "code": "error_code", "meta": {}}}, "user_id": "user_id_at_provider"}], "saml_accounts": [{"id": "saml_account_id_123", "object": "saml_account", "provider": "SAML Provider", "active": true, "email_address": "user@example.com", "first_name": "John", "last_name": "Doe", "provider_user_id": "prov_user_id_123", "last_authenticated_at": 35779, "public_metadata": {"department": "IT"}, "verification": {"object": "verification_ticket", "status": "verified", "strategy": "ticket", "attempts": null, "expire_at": 1622852400, "verified_at_client": ""}, "saml_connection": {"id": "sc_1234567890", "name": "My Company SAML Config", "domain": "mycompany.com", "domains": [""], "active": true, "provider": "saml_custom", "sync_user_attributes": true, "allow_subdomains": false, "allow_idp_initiated": true, "disable_additional_identifications": true, "created_at": 1614768000, "updated_at": 1622540800}}], "enterprise_accounts": [{"id": "", "object": "enterprise_account", "protocol": "saml", "provider": "", "active": false, "email_address": "Jay.Schmitt@gmail.com", "first_name": "Vincenza", "last_name": "Rosenbaum", "provider_user_id": "", "enterprise_connection_id": "", "public_metadata": {"key": "", "key1": ""}, "verification": {"object": "verification_ticket", "status": "expired", "strategy": "ticket", "attempts": 485856, "expire_at": 538593, "verified_at_client": null}, "enterprise_connection": null, "last_authenticated_at": 793877}], "organization_memberships": [{"id": "org_mem_123", "object": "organization_membership", "role": "member", "role_name": "", "permissions": ["read", "write"], "public_metadata": {}, "private_metadata": {}, "organization": {"object": "organization", "id": "org_123", "name": "Acme Corp", "slug": "acme-corp", "image_url": "https://any-pension.com", "has_image": false, "members_count": 150, "missing_member_with_elevated_permissions": false, "pending_invitations_count": 8333, "max_allowed_memberships": 300, "admin_delete_enabled": true, "public_metadata": {"public_info": "Info visible to everyone"}, "private_metadata": {"internal_use_only": "Sensitive data"}, "created_by": "user_123456", "created_at": 1625078400, "updated_at": 1625164800, "last_active_at": 149561}, "public_user_data": {"user_id": "", "first_name": "Susana", "last_name": "Kling", "profile_image_url": "https://suburban-doing.name/", "image_url": "https://faraway-onset.info/", "has_image": false, "identifier": "", "username": "Savannah83"}, "created_at": 1625078400, "updated_at": 1625164800}], "last_sign_in_at": 1622852400, "banned": false, "locked": false, "lockout_expires_in_seconds": null, "verification_attempts_remaining": 5, "updated_at": 1622852400, "created_at": 1609459200, "delete_self_enabled": true, "create_organization_enabled": true, "create_organizations_limit": 476222, "last_active_at": 1700690400000, "legal_accepted_at": 1700690400000, "bypass_client_trust": false} @@ -4819,7 +5079,7 @@ examples: offset: 10 responses: "200": - application/json: [{"object": "oauth_access_token", "external_account_id": "", "provider_user_id": "", "token": "", "expires_at": 568719, "provider": "", "public_metadata": {"key": "", "key1": ""}, "label": null, "scopes": [""], "token_secret": ""}, {"object": "oauth_access_token", "external_account_id": "", "provider_user_id": "", "token": "", "expires_at": 568719, "provider": "", "public_metadata": {"key": "", "key1": ""}, "label": null, "scopes": [""], "token_secret": ""}, {"object": "oauth_access_token", "external_account_id": "", "provider_user_id": "", "token": "", "expires_at": 568719, "provider": "", "public_metadata": {"key": "", "key1": ""}, "label": null, "scopes": [""], "token_secret": ""}] + application/json: [{"object": "oauth_access_token", "external_account_id": "", "provider_user_id": "", "token": "", "expires_at": 568719, "provider": "", "public_metadata": {"key": "", "key1": ""}, "label": null, "scopes": [""], "id_token": "", "token_secret": ""}, {"object": "oauth_access_token", "external_account_id": "", "provider_user_id": "", "token": "", "expires_at": 568719, "provider": "", "public_metadata": {"key": "", "key1": ""}, "label": null, "scopes": [""], "id_token": "", "token_secret": ""}, {"object": "oauth_access_token", "external_account_id": "", "provider_user_id": "", "token": "", "expires_at": 568719, "provider": "", "public_metadata": {"key": "", "key1": ""}, "label": null, "scopes": [""], "id_token": "", "token_secret": ""}] "400": application/json: {"errors": [{"message": "Invalid input", "long_message": "The input provided does not meet the requirements.", "code": "400_bad_request", "meta": {}}], "meta": {}} UsersGetOrganizationMemberships: @@ -5025,7 +5285,7 @@ examples: path: organization_id: "org_12345" requestBody: - application/json: {"email_address": "user@example.com", "inviter_user_id": "user_67890", "role": "admin", "public_metadata": {"key": "value"}, "private_metadata": {"private_key": "secret_value"}, "redirect_url": "https://example.com/welcome", "expires_in_days": 785754} + application/json: {"email_address": "user@example.com", "inviter_user_id": "user_67890", "role": "admin", "public_metadata": {"key": "value"}, "private_metadata": {"private_key": "secret_value"}, "redirect_url": "https://example.com/welcome", "expires_in_days": 785754, "notify": true} responses: "200": application/json: {"object": "organization_invitation", "id": "inv_12345", "email_address": "user@example.com", "role": "admin", "role_name": "", "organization_id": "org_12345", "inviter_id": "", "public_inviter_data": {"user_id": "", "first_name": "Stevie", "last_name": "Kuvalis", "image_url": "https://prime-babushka.net", "has_image": true, "identifier": ""}, "status": "pending", "public_metadata": {"key": "value"}, "private_metadata": {"private_key": "secret_value"}, "url": "https://watery-knitting.name", "expires_at": 56370, "created_at": 1622547600, "updated_at": 1622551200} @@ -5053,7 +5313,7 @@ examples: path: organization_id: "org_12345" requestBody: - application/json: [{"email_address": "newmember@example.com", "inviter_user_id": "user_67890", "role": "admin", "public_metadata": {}, "private_metadata": {}, "redirect_url": "https://example.com/welcome", "expires_in_days": 488764}, {"email_address": "newmember@example.com", "inviter_user_id": "user_67890", "role": "admin", "public_metadata": {}, "private_metadata": {}, "redirect_url": "https://example.com/welcome", "expires_in_days": 488764}] + application/json: [{"email_address": "newmember@example.com", "inviter_user_id": "user_67890", "role": "admin", "public_metadata": {}, "private_metadata": {}, "redirect_url": "https://example.com/welcome", "expires_in_days": 488764, "notify": true}, {"email_address": "newmember@example.com", "inviter_user_id": "user_67890", "role": "admin", "public_metadata": {}, "private_metadata": {}, "redirect_url": "https://example.com/welcome", "expires_in_days": 488764, "notify": true}] responses: "200": application/json: {"data": [{"object": "organization_invitation", "id": "inv_12345", "email_address": "user@example.com", "role": "member", "role_name": "", "organization_id": "org_12345", "inviter_id": "", "public_inviter_data": {"user_id": "", "first_name": "Jeffrey", "last_name": "Connelly", "image_url": "https://downright-papa.net/", "has_image": true, "identifier": ""}, "status": "pending", "public_metadata": {"key": "value"}, "private_metadata": {"private_key": "secret_value"}, "url": "https://cooperative-dress.biz", "expires_at": 715454, "created_at": 1617981379, "updated_at": 1625581379}], "total_count": 10} @@ -6142,7 +6402,7 @@ examples: organization_id: "" responses: "200": - application/json: {"data": [{"object": "commerce_subscription_item", "id": "", "instance_id": "", "status": "upcoming", "credit": {"amount": {"amount": 115692, "amount_formatted": "", "currency": "Denar", "currency_symbol": "K"}, "cycle_remaining_percent": 5890.09}, "plan_id": "", "plan": {"object": "commerce_plan", "id": "", "name": "", "fee": {"amount": 349721, "amount_formatted": "", "currency": "Iceland Krona", "currency_symbol": "₪"}, "annual_monthly_fee": {"amount": 500878, "amount_formatted": "", "currency": "Pakistan Rupee", "currency_symbol": "$"}, "annual_fee": {"amount": 13059, "amount_formatted": "", "currency": "Uzbekistan Sum", "currency_symbol": "$"}, "description": "tennis husband meanwhile duh uh-huh chap provided stained wry uncomfortable", "product_id": "", "is_default": false, "is_recurring": true, "publicly_visible": true, "has_base_fee": true, "for_payer_type": "", "slug": "", "avatar_url": "https://monthly-lace.org", "features": [], "free_trial_enabled": true, "free_trial_days": 520556}, "plan_period": "month", "payment_method": {"object": "commerce_payment_method", "id": "", "payer_id": "", "payment_type": "link", "is_default": false, "gateway": "", "gateway_external_id": "", "gateway_external_account_id": "", "last4": "", "status": "disconnected", "wallet_type": "", "card_type": "", "expiry_year": 542201, "expiry_month": 589009, "created_at": 348814, "updated_at": 349721, "is_removable": true}, "lifetime_paid": {"amount": 42923, "amount_formatted": "", "currency": "Swiss Franc", "currency_symbol": "лв"}, "next_payment": null, "payer_id": "", "payer": {"object": "commerce_payer", "id": "", "instance_id": "", "user_id": "", "first_name": "Mathew", "last_name": "McLaughlin", "email": "Zetta_Wilderman39@gmail.com", "organization_id": "", "organization_name": "", "image_url": "https://queasy-charlatan.net/", "created_at": 905937, "updated_at": 777337}, "is_free_trial": false, "period_start": 543438, "period_end": 271235, "proration_date": "", "canceled_at": 232920, "past_due_at": null, "ended_at": 743580, "created_at": 762052, "updated_at": 856930}], "total_count": 699308} + application/json: {"data": [{"object": "commerce_subscription_item", "id": "", "instance_id": "", "status": "upcoming", "credit": {"amount": {"amount": 115692, "amount_formatted": "", "currency": "Denar", "currency_symbol": "K"}, "cycle_remaining_percent": 5890.09}, "plan_id": "", "price_id": "", "plan": {"object": "commerce_plan", "id": "", "name": "", "fee": {"amount": 349721, "amount_formatted": "", "currency": "Iceland Krona", "currency_symbol": "₪"}, "annual_monthly_fee": {"amount": 500878, "amount_formatted": "", "currency": "Pakistan Rupee", "currency_symbol": "$"}, "annual_fee": {"amount": 13059, "amount_formatted": "", "currency": "Uzbekistan Sum", "currency_symbol": "$"}, "description": "tennis husband meanwhile duh uh-huh chap provided stained wry uncomfortable", "product_id": "", "is_default": false, "is_recurring": true, "publicly_visible": true, "has_base_fee": true, "for_payer_type": "", "slug": "", "avatar_url": "https://monthly-lace.org", "features": [], "free_trial_enabled": true, "free_trial_days": 520556}, "plan_period": "month", "payment_method": {"object": "commerce_payment_method", "id": "", "payer_id": "", "payment_type": "link", "is_default": false, "gateway": "", "gateway_external_id": "", "gateway_external_account_id": "", "last4": "", "status": "disconnected", "wallet_type": "", "card_type": "", "expiry_year": 542201, "expiry_month": 589009, "created_at": 348814, "updated_at": 349721, "is_removable": true}, "lifetime_paid": {"amount": 42923, "amount_formatted": "", "currency": "Swiss Franc", "currency_symbol": "лв"}, "next_payment": null, "payer_id": "", "payer": {"object": "commerce_payer", "id": "", "instance_id": "", "user_id": "", "first_name": "Mathew", "last_name": "McLaughlin", "email": "Zetta_Wilderman39@gmail.com", "organization_id": "", "organization_name": "", "image_url": "https://queasy-charlatan.net/", "created_at": 905937, "updated_at": 777337}, "is_free_trial": false, "period_start": 543438, "period_end": 271235, "proration_date": "", "canceled_at": 232920, "past_due_at": null, "ended_at": 743580, "created_at": 762052, "updated_at": 856930}], "total_count": 699308} "400": application/json: {"errors": [{"message": "Invalid input", "long_message": "The input provided does not meet the requirements.", "code": "400_bad_request", "meta": {}}], "meta": {}} "500": @@ -6166,7 +6426,7 @@ examples: organization_id: "" responses: "200": - application/json: {"object": "commerce_subscription", "id": "", "instance_id": "", "status": "abandoned", "payer_id": "", "created_at": 867059, "updated_at": 35040, "active_at": 916886, "past_due_at": 317090, "subscription_items": [{"object": "commerce_subscription_item", "id": "", "instance_id": "", "status": "past_due", "credit": {"amount": {"amount": 24678, "amount_formatted": "", "currency": "Balboa", "currency_symbol": "ман"}, "cycle_remaining_percent": 8943.6}, "plan_id": "", "plan": {"object": "commerce_plan", "id": "", "name": "", "fee": {"amount": 628116, "amount_formatted": "", "currency": "Djibouti Franc", "currency_symbol": "лв"}, "annual_monthly_fee": {"amount": 152879, "amount_formatted": "", "currency": "Bhutanese Ngultrum", "currency_symbol": "₫"}, "annual_fee": {"amount": 475807, "amount_formatted": "", "currency": "Kip", "currency_symbol": "BZ$"}, "description": "whoever geez whoever sparse tabletop versus", "product_id": "", "is_default": false, "is_recurring": false, "publicly_visible": true, "has_base_fee": true, "for_payer_type": "", "slug": "", "avatar_url": "https://sour-trick.com", "features": [], "free_trial_enabled": false, "free_trial_days": 780011}, "plan_period": "annual", "payment_method": {"object": "commerce_payment_method", "id": "", "payer_id": "", "payment_type": "link", "is_default": false, "gateway": "", "gateway_external_id": "", "gateway_external_account_id": null, "last4": "", "status": "disconnected", "wallet_type": "", "card_type": "", "expiry_year": 360368, "expiry_month": 313834, "created_at": 24678, "updated_at": 651973, "is_removable": true}, "lifetime_paid": {"amount": 770015, "amount_formatted": "", "currency": "Mauritius Rupee", "currency_symbol": "ƒ"}, "next_payment": {"amount": null, "date": 312699}, "payer_id": "", "payer": {"object": "commerce_payer", "id": "", "instance_id": "", "user_id": "", "first_name": "Tabitha", "last_name": "Welch", "email": "Maxie.Cremin95@yahoo.com", "organization_id": "", "organization_name": "", "image_url": "https://shameful-newsstand.name/", "created_at": 787220, "updated_at": 724781}, "is_free_trial": true, "period_start": 856116, "period_end": 857283, "proration_date": "", "canceled_at": 151137, "past_due_at": 503945, "ended_at": 94519, "created_at": 484361, "updated_at": 191350}], "next_payment": {"date": 223172, "amount": {"amount": 254347, "amount_formatted": "", "currency": "Bermudian Dollar (customarily known as Bermuda Dollar)", "currency_symbol": "Bs"}}, "eligible_for_free_trial": false} + application/json: {"object": "commerce_subscription", "id": "", "instance_id": "", "status": "abandoned", "payer_id": "", "created_at": 867059, "updated_at": 35040, "active_at": 916886, "past_due_at": 317090, "subscription_items": [{"object": "commerce_subscription_item", "id": "", "instance_id": "", "status": "past_due", "credit": {"amount": {"amount": 24678, "amount_formatted": "", "currency": "Balboa", "currency_symbol": "ман"}, "cycle_remaining_percent": 8943.6}, "plan_id": "", "price_id": "", "plan": {"object": "commerce_plan", "id": "", "name": "", "fee": {"amount": 628116, "amount_formatted": "", "currency": "Djibouti Franc", "currency_symbol": "лв"}, "annual_monthly_fee": {"amount": 152879, "amount_formatted": "", "currency": "Bhutanese Ngultrum", "currency_symbol": "₫"}, "annual_fee": {"amount": 475807, "amount_formatted": "", "currency": "Kip", "currency_symbol": "BZ$"}, "description": "whoever geez whoever sparse tabletop versus", "product_id": "", "is_default": false, "is_recurring": false, "publicly_visible": true, "has_base_fee": true, "for_payer_type": "", "slug": "", "avatar_url": "https://sour-trick.com", "features": [], "free_trial_enabled": false, "free_trial_days": 780011}, "plan_period": "annual", "payment_method": {"object": "commerce_payment_method", "id": "", "payer_id": "", "payment_type": "link", "is_default": false, "gateway": "", "gateway_external_id": "", "gateway_external_account_id": null, "last4": "", "status": "disconnected", "wallet_type": "", "card_type": "", "expiry_year": 360368, "expiry_month": 313834, "created_at": 24678, "updated_at": 651973, "is_removable": true}, "lifetime_paid": {"amount": 770015, "amount_formatted": "", "currency": "Mauritius Rupee", "currency_symbol": "ƒ"}, "next_payment": {"amount": null, "date": 312699}, "payer_id": "", "payer": {"object": "commerce_payer", "id": "", "instance_id": "", "user_id": "", "first_name": "Tabitha", "last_name": "Welch", "email": "Maxie.Cremin95@yahoo.com", "organization_id": "", "organization_name": "", "image_url": "https://shameful-newsstand.name/", "created_at": 787220, "updated_at": 724781}, "is_free_trial": true, "period_start": 856116, "period_end": 857283, "proration_date": "", "canceled_at": 151137, "past_due_at": 503945, "ended_at": 94519, "created_at": 484361, "updated_at": 191350}], "next_payment": {"date": 223172, "amount": {"amount": 254347, "amount_formatted": "", "currency": "Bermudian Dollar (customarily known as Bermuda Dollar)", "currency_symbol": "Bs"}}, "eligible_for_free_trial": false} "400": application/json: {"errors": [{"message": "Invalid input", "long_message": "The input provided does not meet the requirements.", "code": "400_bad_request", "meta": {}}], "meta": {}} "500": @@ -6202,7 +6462,7 @@ examples: end_now: false responses: "200": - application/json: {"object": "commerce_subscription_item", "id": "", "instance_id": "", "status": "abandoned", "credit": {"amount": {"amount": 595314, "amount_formatted": "", "currency": "Balboa", "currency_symbol": "C$"}, "cycle_remaining_percent": 4623.13}, "plan_id": "", "plan": null, "plan_period": "annual", "payment_method": {"object": "commerce_payment_method", "id": "", "payer_id": "", "payment_type": "link", "is_default": false, "gateway": "", "gateway_external_id": "", "gateway_external_account_id": "", "last4": "", "status": "disconnected", "wallet_type": "", "card_type": "", "expiry_year": 16342, "expiry_month": 842294, "created_at": 526434, "updated_at": 344897, "is_removable": false}, "lifetime_paid": {"amount": 333252, "amount_formatted": "", "currency": "New Israeli Sheqel", "currency_symbol": "₨"}, "next_payment": {"amount": {"amount": 967195, "amount_formatted": "", "currency": "Lilangeni", "currency_symbol": "kr"}, "date": 191144}, "payer_id": "", "payer": {"object": "commerce_payer", "id": "", "instance_id": "", "user_id": "", "first_name": "Valentina", "last_name": null, "email": "Vickie.Wolf@gmail.com", "organization_id": "", "organization_name": "", "image_url": "https://bad-grandpa.name/", "created_at": 163690, "updated_at": 892368}, "is_free_trial": true, "period_start": 307393, "period_end": 617624, "proration_date": "", "canceled_at": 479144, "past_due_at": 889815, "ended_at": 879881, "created_at": 858429, "updated_at": 224059} + application/json: {"object": "commerce_subscription_item", "id": "", "instance_id": "", "status": "abandoned", "credit": {"amount": {"amount": 595314, "amount_formatted": "", "currency": "Balboa", "currency_symbol": "C$"}, "cycle_remaining_percent": 4623.13}, "plan_id": "", "price_id": "", "plan": null, "plan_period": "annual", "payment_method": {"object": "commerce_payment_method", "id": "", "payer_id": "", "payment_type": "link", "is_default": false, "gateway": "", "gateway_external_id": "", "gateway_external_account_id": "", "last4": "", "status": "disconnected", "wallet_type": "", "card_type": "", "expiry_year": 16342, "expiry_month": 842294, "created_at": 526434, "updated_at": 344897, "is_removable": false}, "lifetime_paid": {"amount": 333252, "amount_formatted": "", "currency": "New Israeli Sheqel", "currency_symbol": "₨"}, "next_payment": {"amount": {"amount": 967195, "amount_formatted": "", "currency": "Lilangeni", "currency_symbol": "kr"}, "date": 191144}, "payer_id": "", "payer": {"object": "commerce_payer", "id": "", "instance_id": "", "user_id": "", "first_name": "Valentina", "last_name": null, "email": "Vickie.Wolf@gmail.com", "organization_id": "", "organization_name": "", "image_url": "https://bad-grandpa.name/", "created_at": 163690, "updated_at": 892368}, "is_free_trial": true, "period_start": 307393, "period_end": 617624, "proration_date": "", "canceled_at": 479144, "past_due_at": 889815, "ended_at": 879881, "created_at": 858429, "updated_at": 224059} "400": application/json: {"errors": [{"message": "Invalid input", "long_message": "The input provided does not meet the requirements.", "code": "400_bad_request", "meta": {}}], "meta": {}} "500": @@ -6252,7 +6512,7 @@ examples: application/json: {"extend_to": "2026-01-08T00:00:00Z"} responses: "200": - application/json: {"object": "commerce_subscription_item", "id": "", "instance_id": "", "status": "abandoned", "credit": {"amount": {"amount": 238229, "amount_formatted": "", "currency": "Bermudian Dollar (customarily known as Bermuda Dollar)", "currency_symbol": "Php"}, "cycle_remaining_percent": 3422.31}, "plan_id": "", "plan": {"object": "commerce_plan", "id": "", "name": "", "fee": {"amount": 396106, "amount_formatted": "", "currency": "Dominican Peso", "currency_symbol": "zł"}, "annual_monthly_fee": {"amount": 514259, "amount_formatted": "", "currency": "Swiss Franc", "currency_symbol": "ман"}, "annual_fee": {"amount": 280866, "amount_formatted": "", "currency": "North Korean Won", "currency_symbol": "₨"}, "amount": 694464, "amount_formatted": "", "annual_monthly_amount": 44402, "annual_monthly_amount_formatted": "", "annual_amount": 447978, "annual_amount_formatted": "", "currency_symbol": "$U", "currency": "Serbian Dinar", "description": "premise because yippee", "product_id": "", "is_default": false, "is_recurring": false, "publicly_visible": false, "has_base_fee": true, "payer_type": ["", "", ""], "for_payer_type": "", "slug": "", "avatar_url": "https://imaginary-perp.name", "period": "", "interval": 708600, "features": [], "free_trial_enabled": true, "free_trial_days": 99902}, "plan_period": "annual", "payment_source_id": "", "payment_source": {"object": "commerce_source", "id": "", "payer_id": "", "payment_method": "card", "is_default": false, "gateway": "", "gateway_external_id": "", "gateway_external_account_id": "", "last4": "", "status": "active", "wallet_type": "", "card_type": "", "expiry_year": 631366, "expiry_month": 537761, "created_at": 223728, "updated_at": 706378, "is_removable": true}, "lifetime_paid": {"amount": 125424, "amount_formatted": "", "currency": "Leone", "currency_symbol": "RD$"}, "amount": {"amount": 260960, "amount_formatted": "", "currency": "Lebanese Pound", "currency_symbol": "₦"}, "next_invoice": {"amount": {"amount": 716553, "amount_formatted": "", "currency": "Denar", "currency_symbol": "€"}, "date": 690708}, "next_payment": {"amount": {"amount": 194234, "amount_formatted": "", "currency": "Vatu", "currency_symbol": "$"}, "date": 243347}, "payer_id": "", "payer": {"object": "commerce_payer", "id": "", "instance_id": "", "user_id": "", "first_name": "Laverna", "last_name": "Dach", "email": "Gladys_Swift@yahoo.com", "organization_id": "", "organization_name": "", "image_url": "https://stingy-kinase.info", "created_at": 684263, "updated_at": 198448}, "is_free_trial": true, "period_start": 216512, "period_end": 423234, "proration_date": "", "canceled_at": 316150, "past_due_at": 738084, "ended_at": 611712, "created_at": 74592, "updated_at": 571351} + application/json: {"object": "commerce_subscription_item", "id": "", "instance_id": "", "status": "abandoned", "credit": {"amount": {"amount": 238229, "amount_formatted": "", "currency": "Bermudian Dollar (customarily known as Bermuda Dollar)", "currency_symbol": "Php"}, "cycle_remaining_percent": 3422.31}, "plan_id": "", "price_id": "", "plan": {"object": "commerce_plan", "id": "", "name": "", "fee": {"amount": 396106, "amount_formatted": "", "currency": "Dominican Peso", "currency_symbol": "zł"}, "annual_monthly_fee": {"amount": 514259, "amount_formatted": "", "currency": "Swiss Franc", "currency_symbol": "ман"}, "annual_fee": {"amount": 280866, "amount_formatted": "", "currency": "North Korean Won", "currency_symbol": "₨"}, "amount": 694464, "amount_formatted": "", "annual_monthly_amount": 44402, "annual_monthly_amount_formatted": "", "annual_amount": 447978, "annual_amount_formatted": "", "currency_symbol": "$U", "currency": "Serbian Dinar", "description": "premise because yippee", "product_id": "", "is_default": false, "is_recurring": false, "publicly_visible": false, "has_base_fee": true, "payer_type": ["", "", ""], "for_payer_type": "", "slug": "", "avatar_url": "https://imaginary-perp.name", "period": "", "interval": 708600, "features": [], "free_trial_enabled": true, "free_trial_days": 99902}, "plan_period": "annual", "payment_source_id": "", "payment_source": {"object": "commerce_source", "id": "", "payer_id": "", "payment_method": "card", "is_default": false, "gateway": "", "gateway_external_id": "", "gateway_external_account_id": "", "last4": "", "status": "active", "wallet_type": "", "card_type": "", "expiry_year": 631366, "expiry_month": 537761, "created_at": 223728, "updated_at": 706378, "is_removable": true}, "lifetime_paid": {"amount": 125424, "amount_formatted": "", "currency": "Leone", "currency_symbol": "RD$"}, "amount": {"amount": 260960, "amount_formatted": "", "currency": "Lebanese Pound", "currency_symbol": "₦"}, "next_invoice": {"amount": {"amount": 716553, "amount_formatted": "", "currency": "Denar", "currency_symbol": "€"}, "date": 690708}, "next_payment": {"amount": {"amount": 194234, "amount_formatted": "", "currency": "Vatu", "currency_symbol": "$"}, "date": 243347}, "payer_id": "", "payer": {"object": "commerce_payer", "id": "", "instance_id": "", "user_id": "", "first_name": "Laverna", "last_name": "Dach", "email": "Gladys_Swift@yahoo.com", "organization_id": "", "organization_name": "", "image_url": "https://stingy-kinase.info", "created_at": 684263, "updated_at": 198448}, "is_free_trial": true, "period_start": 216512, "period_end": 423234, "proration_date": "", "canceled_at": 316150, "past_due_at": 738084, "ended_at": 611712, "created_at": 74592, "updated_at": 571351} "400": application/json: {"errors": [{"message": "Invalid input", "long_message": "The input provided does not meet the requirements.", "code": "400_bad_request", "meta": {}}], "meta": {}} "500": @@ -6532,9 +6792,139 @@ examples: application/json: {"errors": [{"message": "Bad Request", "long_message": "Invalid 'url_parameter.example': Failed regex check", "code": "bad_request"}]} "404": application/json: {"errors": [{"message": "some details about the error", "long_message": "some details about the error", "code": "some_error_code"}]} + SetUserPasswordCompromised: + speakeasy-default-set-user-password-compromised: + parameters: + path: + user_id: "" + requestBody: + application/json: {"revoke_all_sessions": false} + responses: + "200": + application/json: {"id": "user_id_123", "object": "user", "external_id": "external_user_id_123", "primary_email_address_id": "email_id_123", "primary_phone_number_id": "phone_id_123", "primary_web3_wallet_id": "wallet_id_123", "username": "john_doe", "first_name": "John", "last_name": "Doe", "locale": "nl", "image_url": "https://example.com/new-profile.jpg", "has_image": true, "public_metadata": {"role": "admin"}, "private_metadata": {"ssn": "123-45-6789"}, "unsafe_metadata": {"theme": "dark"}, "email_addresses": [{"id": "email_id_123", "object": "email_address", "email_address": "john.doe@example.com", "reserved": false, "verification": {"object": "verification_saml", "status": "unverified", "strategy": "saml", "external_verification_redirect_url": "https://international-republican.name", "error": {"message": "Error message", "long_message": "Longer error message with more details", "code": "error_code", "meta": {}}, "expire_at": 937194, "attempts": null, "verified_at_client": ""}, "linked_to": [{"type": "oauth_google", "id": "link_12345"}], "matches_sso_connection": true, "created_at": 1609459200, "updated_at": 1609459200}], "phone_numbers": [{"id": "phone_id_123", "object": "phone_number", "phone_number": "+12345678901", "reserved_for_second_factor": false, "default_second_factor": true, "reserved": false, "verification": {"object": "verification_otp", "status": "expired", "strategy": "email_code", "attempts": 849046, "expire_at": 731894, "verified_at_client": ""}, "linked_to": [{"type": "oauth_google", "id": "link_id_123"}], "backup_codes": ["code1", "code2", "code3"], "created_at": 1609459200, "updated_at": 1609459200}], "web3_wallets": [{"id": "wallet_id_123", "object": "web3_wallet", "web3_wallet": "0x123456789abcdef", "verification": {"object": "verification_web3", "status": "unverified", "strategy": "web3_coinbase_wallet_signature", "nonce": "", "message": "", "attempts": 322502, "expire_at": 189149, "verified_at_client": ""}, "created_at": 1609459200, "updated_at": 1609459200}], "passkeys": [{"id": "passkey_id_123", "object": "passkey", "name": "My Passkey", "last_used_at": 1615852800, "verification": {"object": "verification_passkey", "status": "verified", "strategy": "passkey", "nonce": "nonce", "message": "", "attempts": 879644, "expire_at": 428803, "verified_at_client": ""}}], "password_enabled": true, "two_factor_enabled": true, "totp_enabled": true, "backup_code_enabled": true, "mfa_enabled_at": 1615852800, "mfa_disabled_at": null, "password_last_updated_at": 524831, "external_accounts": [{"object": "external_account", "id": "ext_account_id_123", "provider": "Facebook", "identification_id": "", "provider_user_id": "", "approved_scopes": "", "email_address": "Estevan77@gmail.com", "first_name": "Greg", "last_name": "Wiza", "image_url": "https://charming-trench.name/", "username": "Cory.Jast69", "phone_number": "347.361.0889 x9863", "public_metadata": {"key": ""}, "label": "", "created_at": 236452, "updated_at": 585351, "verification": null, "user_id": "user_id_at_provider"}], "saml_accounts": [{"id": "saml_account_id_123", "object": "saml_account", "provider": "SAML Provider", "active": true, "email_address": "user@example.com", "first_name": "John", "last_name": "Doe", "provider_user_id": "prov_user_id_123", "last_authenticated_at": 740197, "public_metadata": {"department": "IT"}, "verification": {"object": "verification_ticket", "status": "unverified", "strategy": "ticket", "attempts": 533554, "expire_at": 331420, "verified_at_client": ""}, "saml_connection": {"id": "sc_1234567890", "name": "My Company SAML Config", "domains": [""], "active": true, "provider": "saml_custom", "sync_user_attributes": true, "allow_subdomains": false, "allow_idp_initiated": true, "disable_additional_identifications": true, "created_at": 1614768000, "updated_at": 1622540800}}], "enterprise_accounts": [{"id": "", "object": "enterprise_account", "protocol": "saml", "provider": "", "active": true, "email_address": "Elizabeth_Denesik59@gmail.com", "first_name": "Curt", "last_name": "Auer", "provider_user_id": "", "enterprise_connection_id": "", "public_metadata": {"key": ""}, "verification": {"object": "verification_oauth", "status": "failed", "strategy": "", "external_verification_redirect_url": "https://yellowish-fort.info", "error": {"message": "Error message", "long_message": "Longer error message with more details", "code": "error_code", "meta": {}}, "expire_at": 57431, "attempts": 955547, "verified_at_client": ""}, "enterprise_connection": {"id": "", "protocol": "", "provider": "", "name": "", "logo_public_url": "https://neighboring-instructor.info", "domains": ["", "", ""], "active": true, "sync_user_attributes": false, "allow_subdomains": false, "allow_idp_initiated": true, "disable_additional_identifications": false, "created_at": 773770, "updated_at": 712917}, "last_authenticated_at": 942812}], "organization_memberships": [{"id": "org_mem_123", "object": "organization_membership", "role": "member", "role_name": "", "permissions": ["read", "write"], "public_metadata": {}, "private_metadata": {}, "organization": {"object": "organization", "id": "org_123", "name": "Acme Corp", "slug": "acme-corp", "image_url": "https://formal-slime.name/", "has_image": false, "members_count": 150, "missing_member_with_elevated_permissions": false, "pending_invitations_count": 661865, "max_allowed_memberships": 300, "admin_delete_enabled": true, "public_metadata": {"public_info": "Info visible to everyone"}, "private_metadata": {"internal_use_only": "Sensitive data"}, "created_by": "user_123456", "created_at": 1625078400, "updated_at": 1625164800, "last_active_at": 605372}, "public_user_data": {"user_id": "", "first_name": "Percival", "last_name": "Effertz", "profile_image_url": "https://gorgeous-sprinkles.biz/", "image_url": "https://unfit-longboat.info/", "has_image": true, "identifier": "", "username": "Jamie_Jerde17"}, "created_at": 1625078400, "updated_at": 1625164800}], "last_sign_in_at": 1622852400, "banned": false, "locked": false, "lockout_expires_in_seconds": null, "verification_attempts_remaining": 5, "updated_at": 1622852400, "created_at": 1609459200, "delete_self_enabled": true, "create_organization_enabled": true, "create_organizations_limit": 420039, "last_active_at": 1700690400000, "legal_accepted_at": 1700690400000, "bypass_client_trust": false} + "400": + application/json: {"errors": [{"message": "Invalid input", "long_message": "The input provided does not meet the requirements.", "code": "400_bad_request", "meta": {}}], "meta": {}} + UnsetUserPasswordCompromised: + speakeasy-default-unset-user-password-compromised: + parameters: + path: + user_id: "" + responses: + "200": + application/json: {"id": "user_id_123", "object": "user", "external_id": "external_user_id_123", "primary_email_address_id": "email_id_123", "primary_phone_number_id": "phone_id_123", "primary_web3_wallet_id": "wallet_id_123", "username": "john_doe", "first_name": "John", "last_name": "Doe", "locale": "fr", "image_url": "https://example.com/new-profile.jpg", "has_image": true, "public_metadata": {"role": "admin"}, "private_metadata": {"ssn": "123-45-6789"}, "unsafe_metadata": {"theme": "dark"}, "email_addresses": [{"id": "email_id_123", "object": "email_address", "email_address": "john.doe@example.com", "reserved": false, "verification": {"object": "verification_from_oauth", "status": "verified", "strategy": "", "error": {"message": "Error message", "long_message": "Longer error message with more details", "code": "error_code", "meta": {}}, "expire_at": 321346, "attempts": 766720, "verified_at_client": ""}, "linked_to": [{"type": "oauth_google", "id": "link_12345"}], "matches_sso_connection": false, "created_at": 1609459200, "updated_at": 1609459200}], "phone_numbers": [{"id": "phone_id_123", "object": "phone_number", "phone_number": "+12345678901", "reserved_for_second_factor": false, "default_second_factor": true, "reserved": false, "verification": {"object": "verification_otp", "status": "verified", "strategy": "phone_code", "attempts": 742457, "expire_at": 679575, "verified_at_client": ""}, "linked_to": [{"type": "oauth_google", "id": "link_id_123"}], "backup_codes": ["code1", "code2", "code3"], "created_at": 1609459200, "updated_at": 1609459200}], "web3_wallets": [{"id": "wallet_id_123", "object": "web3_wallet", "web3_wallet": "0x123456789abcdef", "verification": {"object": "verification_admin", "status": "verified", "strategy": "admin", "attempts": 534833, "expire_at": null, "verified_at_client": ""}, "created_at": 1609459200, "updated_at": 1609459200}], "passkeys": [{"id": "passkey_id_123", "object": "passkey", "name": "My Passkey", "last_used_at": 1615852800, "verification": {"object": "verification_passkey", "status": "verified", "strategy": "passkey", "nonce": "nonce", "message": null, "attempts": 167210, "expire_at": null, "verified_at_client": ""}}], "password_enabled": true, "two_factor_enabled": true, "totp_enabled": true, "backup_code_enabled": true, "mfa_enabled_at": 1615852800, "mfa_disabled_at": null, "password_last_updated_at": 595629, "external_accounts": [{"object": "google_account", "id": "ext_account_id_123", "provider": "Facebook", "identification_id": "", "provider_user_id": "", "approved_scopes": "", "email_address": "Cheyanne2@hotmail.com", "first_name": "Wilfredo", "last_name": "Quitzon", "image_url": "https://low-e-mail.name/", "username": "Noah.Schmeler54", "phone_number": "(836) 270-8483", "public_metadata": {"key": "", "key1": ""}, "label": "", "created_at": 80007, "updated_at": 741411, "verification": {"object": "verification_google_one_tap", "status": "unverified", "strategy": "google_one_tap", "expire_at": 369447, "attempts": 408237, "verified_at_client": "", "error": {"message": "Error message", "long_message": "Longer error message with more details", "code": "error_code", "meta": {}}}, "user_id": "user_id_at_provider"}], "saml_accounts": [{"id": "saml_account_id_123", "object": "saml_account", "provider": "SAML Provider", "active": true, "email_address": "user@example.com", "first_name": "John", "last_name": "Doe", "provider_user_id": "prov_user_id_123", "last_authenticated_at": 756809, "public_metadata": {"department": "IT"}, "verification": {"object": "verification_saml", "status": "unverified", "strategy": "saml", "external_verification_redirect_url": "https://known-cycle.info", "error": {"message": "Error message", "long_message": "Longer error message with more details", "code": "error_code", "meta": {}}, "expire_at": 759500, "attempts": 298981, "verified_at_client": ""}, "saml_connection": {"id": "sc_1234567890", "name": "My Company SAML Config", "domain": "mycompany.com", "domains": ["", ""], "active": true, "provider": "saml_custom", "sync_user_attributes": true, "allow_subdomains": false, "allow_idp_initiated": true, "disable_additional_identifications": false, "created_at": 1614768000, "updated_at": 1622540800}}], "enterprise_accounts": [], "organization_memberships": [{"id": "org_mem_123", "object": "organization_membership", "role": "member", "role_name": "", "permissions": ["read", "write"], "public_metadata": {}, "private_metadata": {}, "organization": {"object": "organization", "id": "org_123", "name": "Acme Corp", "slug": "acme-corp", "image_url": "https://wavy-electronics.info/", "has_image": false, "members_count": 150, "missing_member_with_elevated_permissions": false, "pending_invitations_count": 501722, "max_allowed_memberships": 300, "admin_delete_enabled": true, "public_metadata": {"public_info": "Info visible to everyone"}, "private_metadata": {"internal_use_only": "Sensitive data"}, "created_by": "user_123456", "created_at": 1625078400, "updated_at": 1625164800, "last_active_at": 981111}, "public_user_data": {"user_id": "", "first_name": "Cordell", "last_name": "Ondricka", "profile_image_url": "https://big-cook.org/", "image_url": "https://tidy-hovel.net", "has_image": false, "identifier": "", "username": "Ramiro_Littel77"}, "created_at": 1625078400, "updated_at": 1625164800}], "last_sign_in_at": 1622852400, "banned": false, "locked": false, "lockout_expires_in_seconds": null, "verification_attempts_remaining": 5, "updated_at": 1622852400, "created_at": 1609459200, "delete_self_enabled": true, "create_organization_enabled": true, "create_organizations_limit": 10875, "last_active_at": 1700690400000, "legal_accepted_at": 1700690400000, "bypass_client_trust": false} + "400": + application/json: {"errors": [{"message": "Invalid input", "long_message": "The input provided does not meet the requirements.", "code": "400_bad_request", "meta": {}}], "meta": {}} + GetInstanceProtect: + speakeasy-default-get-instance-protect: + responses: + "200": + application/json: {"object": "instance_protect", "rules_enabled": true, "specter_enabled": true} + UpdateInstanceProtect: + speakeasy-default-update-instance-protect: + requestBody: + application/json: {"rules_enabled": true, "specter_enabled": true} + responses: + "200": + application/json: {"object": "instance_protect", "rules_enabled": false, "specter_enabled": false} + "422": + application/json: {"errors": [{"message": "Invalid input", "long_message": "The input provided does not meet the requirements.", "code": "400_bad_request", "meta": {}}], "meta": {}} + CreateBillingPriceTransition: + speakeasy-default-create-billing-price-transition: + parameters: + path: + subscription_item_id: "" + requestBody: + application/json: {"from_price_id": "", "to_price_id": ""} + responses: + "200": + application/json: {"object": "commerce_price_transition", "subscription_item": {"object": "commerce_subscription_item", "id": "", "instance_id": "", "status": "past_due", "credit": {"amount": {"amount": 510709, "amount_formatted": "", "currency": "Cayman Islands Dollar", "currency_symbol": "$"}, "cycle_remaining_percent": 2872.34}, "plan_id": "", "price_id": "", "plan": {"object": "commerce_plan", "id": "", "name": "", "fee": {"amount": 798728, "amount_formatted": "", "currency": "Egyptian Pound", "currency_symbol": "Nu"}, "annual_monthly_fee": {"amount": 290472, "amount_formatted": "", "currency": "Burundi Franc", "currency_symbol": "₨"}, "annual_fee": {"amount": 93690, "amount_formatted": "", "currency": "Cordoba Oro", "currency_symbol": "kr"}, "amount": 21711, "amount_formatted": "", "annual_monthly_amount": 759359, "annual_monthly_amount_formatted": "", "annual_amount": 288916, "annual_amount_formatted": "", "currency_symbol": "₨", "currency": "Tugrik", "description": "strictly if uncommon somber round on ferociously fraudster", "product_id": "", "is_default": true, "is_recurring": false, "publicly_visible": true, "has_base_fee": true, "payer_type": ["", ""], "for_payer_type": "", "slug": "", "avatar_url": "https://classic-cannon.biz/", "period": "", "interval": 536229, "features": [], "free_trial_enabled": true, "free_trial_days": 595614}, "plan_period": "month", "payment_source_id": "", "payment_source": {"object": "commerce_source", "id": "", "payer_id": "", "payment_method": "google_pay", "is_default": null, "gateway": "", "gateway_external_id": "", "gateway_external_account_id": "", "last4": "", "status": "active", "wallet_type": "", "card_type": "", "expiry_year": 464942, "expiry_month": 125425, "created_at": 70243, "updated_at": 164594, "is_removable": false}, "lifetime_paid": {"amount": 441095, "amount_formatted": "", "currency": "Venezuelan bolívar", "currency_symbol": "CHF"}, "amount": {"amount": 689174, "amount_formatted": "", "currency": "Iranian Rial", "currency_symbol": "S"}, "next_invoice": {"amount": {"amount": 487368, "amount_formatted": "", "currency": "Boliviano boliviano", "currency_symbol": "zł"}, "date": 759284}, "next_payment": {"amount": {"amount": 978224, "amount_formatted": "", "currency": "Gourde", "currency_symbol": "£"}, "date": 473256}, "payer_id": "", "payer": {"object": "commerce_payer", "id": "", "instance_id": "", "user_id": "", "first_name": "Ismael", "last_name": "Medhurst", "email": "Ova.Mraz67@hotmail.com", "organization_id": "", "organization_name": "", "image_url": "https://utter-fowl.biz/", "created_at": 671201, "updated_at": 567156}, "is_free_trial": true, "period_start": 659204, "period_end": 575036, "proration_date": "", "canceled_at": 820502, "past_due_at": 293989, "ended_at": 189628, "created_at": 804154, "updated_at": 821030}, "transition": {"previous_plan": {"object": "commerce_plan", "id": "", "name": "", "fee": {"amount": 798728, "amount_formatted": "", "currency": "Egyptian Pound", "currency_symbol": "Nu"}, "annual_monthly_fee": {"amount": 290472, "amount_formatted": "", "currency": "Burundi Franc", "currency_symbol": "₨"}, "annual_fee": {"amount": 93690, "amount_formatted": "", "currency": "Cordoba Oro", "currency_symbol": "kr"}, "amount": 183032, "amount_formatted": "", "annual_monthly_amount": 162899, "annual_monthly_amount_formatted": "", "annual_amount": 855406, "annual_amount_formatted": "", "currency_symbol": "kr", "currency": "Zimbabwe Dollar", "description": "piglet carpool ha unaccountably rich carelessly meh voluntarily", "product_id": "", "is_default": false, "is_recurring": false, "publicly_visible": true, "has_base_fee": true, "payer_type": [""], "for_payer_type": "", "slug": "", "avatar_url": "https://torn-yin.net/", "period": "", "interval": 111904, "features": [{"object": "feature", "id": "", "name": "", "description": "qua progress times alongside pliers", "slug": "", "avatar_url": "https://frizzy-decongestant.com/"}], "free_trial_enabled": true, "free_trial_days": 448853}, "previous_price": {"object": "commerce_price", "id": "", "plan_id": "", "instance_id": "", "currency": "Ouguiya", "currency_symbol": "£", "amount": 186921, "annual_monthly_amount": 178047, "fee": {"amount": 798728, "amount_formatted": "", "currency": "Egyptian Pound", "currency_symbol": "Nu"}, "annual_monthly_fee": {"amount": 290472, "amount_formatted": "", "currency": "Burundi Franc", "currency_symbol": "₨"}, "description": "boldly yearly trouser", "created_at": 750571}, "effective_at": 750041, "effective_mode": "immediate", "next_billing_date": 198923, "charged_immediately": true, "immediate_charge": {"amount": 70077, "amount_formatted": "", "currency": "CFP Franc", "currency_symbol": "TT$"}, "previous_subscription_item_status": "abandoned", "previous_subscription_item_id": ""}} + "400": + application/json: {"errors": [{"message": "Invalid input", "long_message": "The input provided does not meet the requirements.", "code": "400_bad_request", "meta": {}}], "meta": {}} + "500": + application/json: {"errors": [{"message": "Invalid input", "long_message": "The input provided does not meet the requirements.", "code": "400_bad_request", "meta": {}}], "meta": {}} + ListRoleSets: + speakeasy-default-list-role-sets: + parameters: + query: + query: "" + order_by: "-created_at" + limit: 20 + offset: 10 + responses: + "200": + application/json: {"data": [], "total_count": 475317} + "400": + application/json: {"errors": [{"message": "Invalid input", "long_message": "The input provided does not meet the requirements.", "code": "400_bad_request", "meta": {}}], "meta": {}} + CreateRoleSet: + speakeasy-default-create-role-set: + requestBody: + application/json: {"name": "", "key": "", "description": "coarse minor like whopping jazz concerning questioningly loose", "default_role_key": "", "creator_role_key": "", "type": "custom", "roles": [""]} + responses: + "200": + application/json: {"object": "role_set", "id": "", "name": "", "key": "", "description": "bookcase annually iridescence expatiate plus", "roles": [], "default_role": {"object": "role_set_item", "id": "", "name": "", "key": "", "description": "luck zowie fruitful till versus tentacle mob positively", "members_count": 514252, "has_members": false, "created_at": 561463, "updated_at": 598143}, "creator_role": {"object": "role_set_item", "id": "", "name": "", "key": "", "description": "outside scoff dissemble extension however toothbrush but alongside boastfully", "members_count": 764390, "has_members": null, "created_at": 932655, "updated_at": 832652}, "type": "custom", "role_set_migration": {"object": "role_set_migration", "id": "", "organization_id": "", "instance_id": "", "source_role_set_id": "", "dest_role_set_id": "", "trigger_type": "", "status": "", "migrated_members": 45242, "mappings": {"key": "", "key1": ""}, "started_at": 705208, "completed_at": 76016, "created_at": 830005, "updated_at": 519004}, "created_at": 583794, "updated_at": 846698} + "400": + application/json: {"errors": [{"message": "Invalid input", "long_message": "The input provided does not meet the requirements.", "code": "400_bad_request", "meta": {}}], "meta": {}} + GetRoleSet: + speakeasy-default-get-role-set: + parameters: + path: + role_set_key_or_id: "" + responses: + "200": + application/json: {"object": "role_set", "id": "", "name": "", "key": "", "description": "oddly decent across ha bashfully hmph hm fashion", "roles": [], "default_role": {"object": "role_set_item", "id": "", "name": "", "key": "", "description": "before wherever uh-huh indeed", "members_count": 601965, "has_members": true, "created_at": 694697, "updated_at": 645864}, "creator_role": {"object": "role_set_item", "id": "", "name": "", "key": "", "description": "topsail jagged yesterday wound supposing contradict ick tenderly", "members_count": 924131, "has_members": true, "created_at": 343434, "updated_at": 277117}, "type": "initial", "role_set_migration": {"object": "role_set_migration", "id": "", "organization_id": "", "instance_id": "", "source_role_set_id": "", "dest_role_set_id": "", "trigger_type": "", "status": "", "migrated_members": 681841, "mappings": {"key": ""}, "started_at": 539865, "completed_at": 548684, "created_at": 633736, "updated_at": 991191}, "created_at": 263691, "updated_at": 720902} + "401": + application/json: {"errors": [{"message": "Invalid input", "long_message": "The input provided does not meet the requirements.", "code": "400_bad_request", "meta": {}}], "meta": {}} + UpdateRoleSet: + speakeasy-default-update-role-set: + parameters: + path: + role_set_key_or_id: "" + requestBody: + application/json: {"name": "", "key": null, "description": "airbus atop ouch gadzooks anti talkative mould", "type": "initial", "default_role_key": "", "creator_role_key": ""} + responses: + "200": + application/json: {"object": "role_set", "id": "", "name": "", "key": "", "description": "even afore short-term traduce", "roles": [{"object": "role_set_item", "id": "", "name": "", "key": "", "description": "openly afraid until reproachfully bright bug shyly blah though mockingly", "members_count": 880249, "has_members": true, "created_at": 511601, "updated_at": 66439}], "default_role": {"object": "role_set_item", "id": "", "name": "", "key": "", "description": "for drat oblong yuck providence questioningly profane supposing desecrate fatal", "members_count": 964233, "has_members": false, "created_at": 945549, "updated_at": 616421}, "creator_role": {"object": "role_set_item", "id": "", "name": "", "key": "", "description": "definite lazily gently flickering truthfully aw valentine warlike unfurl", "members_count": 398925, "has_members": true, "created_at": 910179, "updated_at": 931474}, "type": "initial", "role_set_migration": {"object": "role_set_migration", "id": "", "organization_id": "", "instance_id": "", "source_role_set_id": "", "dest_role_set_id": "", "trigger_type": "", "status": "", "migrated_members": 799476, "mappings": {"key": ""}, "started_at": 29629, "completed_at": 377440, "created_at": 335821, "updated_at": 649972}, "created_at": 851209, "updated_at": 723540} + "400": + application/json: {"errors": [{"message": "Invalid input", "long_message": "The input provided does not meet the requirements.", "code": "400_bad_request", "meta": {}}], "meta": {}} + ReplaceRoleSet: + speakeasy-default-replace-role-set: + parameters: + path: + role_set_key_or_id: "" + requestBody: + application/json: {"dest_role_set_key": "", "reassignment_mappings": {"key": "", "key1": "", "key2": ""}} + responses: + "200": + application/json: {"object": "deleted_object", "id": "deleted_object_id_example", "slug": "deleted-object-slug", "deleted": true, "external_id": ""} + "400": + application/json: {"errors": [{"message": "Invalid input", "long_message": "The input provided does not meet the requirements.", "code": "400_bad_request", "meta": {}}], "meta": {}} + AddRolesToRoleSet: + speakeasy-default-add-roles-to-role-set: + parameters: + path: + role_set_key_or_id: "" + requestBody: + application/json: {"role_keys": ["", ""], "default_role_key": "", "creator_role_key": ""} + responses: + "200": + application/json: {"object": "role_set", "id": "", "name": "", "key": "", "description": "unexpectedly frightened tragic that vainly", "roles": [{"object": "role_set_item", "id": "", "name": "", "key": "", "description": "coin lava eulogise fraternise", "members_count": 216023, "has_members": false, "created_at": 994070, "updated_at": 499006}], "default_role": {"object": "role_set_item", "id": "", "name": "", "key": "", "description": "before so mmm finally traffic", "members_count": 603851, "has_members": true, "created_at": 285228, "updated_at": 815572}, "creator_role": {"object": "role_set_item", "id": "", "name": "", "key": "", "description": "exterior pish phrase", "members_count": 419123, "has_members": false, "created_at": 205299, "updated_at": 224001}, "type": "initial", "role_set_migration": {"object": "role_set_migration", "id": "", "organization_id": "", "instance_id": "", "source_role_set_id": "", "dest_role_set_id": "", "trigger_type": "", "status": "", "migrated_members": 752252, "mappings": {"key": "", "key1": ""}, "started_at": 216108, "completed_at": 782039, "created_at": 315729, "updated_at": 193669}, "created_at": 97023, "updated_at": 497901} + "400": + application/json: {"errors": [{"message": "Invalid input", "long_message": "The input provided does not meet the requirements.", "code": "400_bad_request", "meta": {}}], "meta": {}} + ReplaceRoleInRoleSet: + speakeasy-default-replace-role-in-role-set: + parameters: + path: + role_set_key_or_id: "" + requestBody: + application/json: {"role_key": "", "to_role_key": ""} + responses: + "200": + application/json: {"object": "role_set", "id": "", "name": "", "key": "", "description": "lustrous notwithstanding hold questioningly", "roles": [{"object": "role_set_item", "id": "", "name": "", "key": "", "description": "wearily even fishery refine small", "members_count": 324369, "has_members": false, "created_at": 512210, "updated_at": 77989}], "default_role": {"object": "role_set_item", "id": "", "name": "", "key": "", "description": "than than why er circa quantify sense", "members_count": 193035, "has_members": null, "created_at": 728836, "updated_at": 255134}, "creator_role": {"object": "role_set_item", "id": "", "name": "", "key": "", "description": "detain underneath huzzah lounge oval by minty mmm astride", "members_count": 3600, "has_members": true, "created_at": 773354, "updated_at": 97332}, "type": "custom", "role_set_migration": {"object": "role_set_migration", "id": "", "organization_id": "", "instance_id": "", "source_role_set_id": "", "dest_role_set_id": "", "trigger_type": "", "status": "", "migrated_members": 587651, "mappings": {"key": "", "key1": "", "key2": ""}, "started_at": 497298, "completed_at": 979505, "created_at": 32098, "updated_at": 686117}, "created_at": 650880, "updated_at": 871456} + "400": + application/json: {"errors": [{"message": "Invalid input", "long_message": "The input provided does not meet the requirements.", "code": "400_bad_request", "meta": {}}], "meta": {}} examplesVersion: 1.0.2 generatedTests: {} -releaseNotes: "## Python SDK Changes:\n* `clerk.users.get_billing_subscription()`: `response.subscription_items.[].plan.features.[]` **Changed** **Breaking** :warning:\n* `clerk.billing.cancel_subscription_item()`: `response.plan.features.[]` **Changed** **Breaking** :warning:\n* `clerk.billing.list_subscription_items()`: `response.data.[].plan.features.[]` **Changed** **Breaking** :warning:\n* `clerk.billing.list_plans()`: `response.data.[].features.[]` **Changed** **Breaking** :warning:\n* `clerk.organizations.get_billing_subscription()`: `response.subscription_items.[].plan.features.[]` **Changed** **Breaking** :warning:\n* `clerk.api_keys.verify_api_key()`: **Added**\n* `clerk.users.set_profile_image()`: `response.bypass_client_trust` **Added**\n* `clerk.api_keys.create_api_key()`: **Added**\n* `clerk.users.list()`: `response.[].bypass_client_trust` **Added**\n* `clerk.users.create()`: \n * `request.bypass_client_trust` **Added**\n * `response.bypass_client_trust` **Added**\n* `clerk.users.get()`: `response.bypass_client_trust` **Added**\n* `clerk.users.update()`: \n * `request.bypass_client_trust` **Added**\n * `response.bypass_client_trust` **Added**\n* `clerk.users.ban()`: `response.bypass_client_trust` **Added**\n* `clerk.users.unban()`: `response.bypass_client_trust` **Added**\n* `clerk.users.bulk_ban()`: `response.[].bypass_client_trust` **Added**\n* `clerk.users.bulk_unban()`: `response.[].bypass_client_trust` **Added**\n* `clerk.users.lock()`: `response.bypass_client_trust` **Added**\n* `clerk.users.unlock()`: `response.bypass_client_trust` **Added**\n* `clerk.api_keys.revoke_api_key()`: **Added**\n* `clerk.users.delete_profile_image()`: `response.bypass_client_trust` **Added**\n* `clerk.users.update_metadata()`: `response.bypass_client_trust` **Added**\n* `clerk.api_keys.get_api_key_secret()`: **Added**\n* `clerk.api_keys.delete_api_key()`: **Added**\n* `clerk.saml_connections.list()`: `response.data.[]` **Changed**\n* `clerk.saml_connections.create()`: `response` **Changed**\n* `clerk.saml_connections.get()`: `response` **Changed**\n* `clerk.saml_connections.update()`: `response` **Changed**\n* `clerk.api_keys.update_api_key()`: **Added**\n* `clerk.api_keys.get_api_key()`: **Added**\n* `clerk.api_keys.get_api_keys()`: **Added**\n" +releaseNotes: "## Python SDK Changes:\n* `clerk.users.set_password_compromised()`: **Added**\n* `clerk.users.unset_password_compromised()`: **Added**\n* `clerk.instance_settings.get_instance_protect()`: **Added**\n* `clerk.instance_settings.update_instance_protect()`: **Added**\n* `clerk.billing.create_price_transition()`: **Added**\n* `clerk.role_sets.list()`: **Added**\n* `clerk.role_sets.create()`: **Added**\n* `clerk.role_sets.get()`: **Added**\n* `clerk.role_sets.update()`: **Added**\n* `clerk.role_sets.replace()`: **Added**\n* `clerk.role_sets.add_roles()`: **Added**\n* `clerk.role_sets.replace_role()`: **Added**\n* `clerk.users.create()`: `request.skip_user_requirement` **Added**\n* `clerk.users.get_billing_subscription()`: `response.subscription_items[].price_id` **Added**\n* `clerk.users.get_o_auth_access_token()`: `response.[].id_token` **Added**\n* `clerk.organization_invitations.create()`: `request.notify` **Added**\n* `clerk.organization_invitations.bulk_create()`: \n * `request_body[].notify` **Added**\n* `clerk.organizations.create()`: `error.status[402]` **Added**\n* `clerk.organizations.get_billing_subscription()`: `response.subscription_items[].price_id` **Added**\n* `clerk.billing.list_subscription_items()`: `response.data[].price_id` **Added**\n* `clerk.billing.cancel_subscription_item()`: `response.price_id` **Added**\n* `clerk.billing.extend_subscription_item_free_trial()`: `response.price_id` **Added**\n" generatedFiles: - .gitattributes - .vscode/settings.json diff --git a/.speakeasy/gen.yaml b/.speakeasy/gen.yaml index 9abede20..723378a2 100644 --- a/.speakeasy/gen.yaml +++ b/.speakeasy/gen.yaml @@ -13,6 +13,7 @@ generation: requestResponseComponentNamesFeb2024: true securityFeb2025: false sharedErrorComponentsApr2025: false + sharedNestedComponentsJan2026: false auth: oAuth2ClientCredentialsEnabled: true oAuth2PasswordEnabled: false @@ -26,7 +27,7 @@ generation: generateNewTests: false skipResponseBodyAssertions: false python: - version: 4.2.0 + version: 4.2.1 additionalDependencies: dev: pytest: ^8.3.3 @@ -42,6 +43,7 @@ python: - Clerk baseErrorName: ClerkBaseError clientServerStatusCodesAsErrors: true + constFieldCasing: upper defaultErrorName: SDKError description: Python Client SDK for clerk.dev enableCustomCodeRegions: true @@ -76,3 +78,4 @@ python: responseFormat: flat sseFlatResponse: false templateVersion: v2 + useAsyncHooks: false diff --git a/.speakeasy/workflow.lock b/.speakeasy/workflow.lock index c0d44264..b6eeef18 100644 --- a/.speakeasy/workflow.lock +++ b/.speakeasy/workflow.lock @@ -1,21 +1,21 @@ -speakeasyVersion: 1.675.4 +speakeasyVersion: 1.700.2 sources: clerk-openapi: sourceNamespace: clerk-openapi - sourceRevisionDigest: sha256:09b381d1731c7bb152fc6dba85bf99b2177dc9d23ca25192603196d8549af4c2 - sourceBlobDigest: sha256:33fc4e4e521dbde227ffb63777693bcb96c241a26d7b0e307fa2cb9d3a5e1610 + sourceRevisionDigest: sha256:356c9fb799fbc18a4404eff346587003df716d42038e5f0361da25be762cd0c5 + sourceBlobDigest: sha256:5abd4bc591af7915bcfdaf39779d94fdda611b7425feda55ef371fc0cefd8002 tags: - latest - - speakeasy-sdk-regen-1765481971 + - speakeasy-sdk-regen-1766103909 - "2025-11-10" targets: clerk-sdk-python: source: clerk-openapi sourceNamespace: clerk-openapi - sourceRevisionDigest: sha256:09b381d1731c7bb152fc6dba85bf99b2177dc9d23ca25192603196d8549af4c2 - sourceBlobDigest: sha256:33fc4e4e521dbde227ffb63777693bcb96c241a26d7b0e307fa2cb9d3a5e1610 + sourceRevisionDigest: sha256:356c9fb799fbc18a4404eff346587003df716d42038e5f0361da25be762cd0c5 + sourceBlobDigest: sha256:5abd4bc591af7915bcfdaf39779d94fdda611b7425feda55ef371fc0cefd8002 codeSamplesNamespace: clerk-openapi-python-code-samples - codeSamplesRevisionDigest: sha256:b4a32406ece8ceb85b90020a77787302aa1bc828c3a104f48236fd560a4fc240 + codeSamplesRevisionDigest: sha256:f15bc99478f9e3cff070d0edbd32041a186eeeb59677015437953cf61f955f20 workflow: workflowVersion: 1.0.0 speakeasyVersion: latest diff --git a/README.md b/README.md index fc9c693a..67b6a6a9 100644 --- a/README.md +++ b/README.md @@ -283,6 +283,7 @@ def verify_machine_token(request: httpx.Request): * [list_subscription_items](docs/sdks/billing/README.md#list_subscription_items) - List all subscription items * [cancel_subscription_item](docs/sdks/billing/README.md#cancel_subscription_item) - Cancel a subscription item * [extend_subscription_item_free_trial](docs/sdks/billing/README.md#extend_subscription_item_free_trial) - Extend free trial for a subscription item +* [create_price_transition](docs/sdks/billing/README.md#create_price_transition) - Create a price transition for a subscription item * [list_statements](docs/sdks/billing/README.md#list_statements) - List all billing statements * [get_statement](docs/sdks/billing/README.md#get_statement) - Retrieve a billing statement * [get_statement_payment_attempts](docs/sdks/billing/README.md#get_statement_payment_attempts) - List payment attempts for a billing statement @@ -331,6 +332,8 @@ def verify_machine_token(request: httpx.Request): * [update_restrictions](docs/sdks/instancesettingssdk/README.md#update_restrictions) - Update instance restrictions * [change_domain](docs/sdks/instancesettingssdk/README.md#change_domain) - Update production instance domain * [update_organization_settings](docs/sdks/instancesettingssdk/README.md#update_organization_settings) - Update instance organization settings +* [get_instance_protect](docs/sdks/instancesettingssdk/README.md#get_instance_protect) - Get instance protect settings +* [update_instance_protect](docs/sdks/instancesettingssdk/README.md#update_instance_protect) - Update instance protect settings ### [Invitations](docs/sdks/invitations/README.md) @@ -461,6 +464,16 @@ def verify_machine_token(request: httpx.Request): * [get](docs/sdks/redirecturls/README.md#get) - Retrieve a redirect URL * [delete](docs/sdks/redirecturls/README.md#delete) - Delete a redirect URL +### [RoleSets](docs/sdks/rolesetssdk/README.md) + +* [list](docs/sdks/rolesetssdk/README.md#list) - Get a list of role sets +* [create](docs/sdks/rolesetssdk/README.md#create) - Create a role set +* [get](docs/sdks/rolesetssdk/README.md#get) - Retrieve a role set +* [update](docs/sdks/rolesetssdk/README.md#update) - Update a role set +* [replace](docs/sdks/rolesetssdk/README.md#replace) - Replace a role set +* [add_roles](docs/sdks/rolesetssdk/README.md#add_roles) - Add roles to a role set +* [replace_role](docs/sdks/rolesetssdk/README.md#replace_role) - Replace a role in a role set + ### [SamlConnections](docs/sdks/samlconnectionssdk/README.md) * [list](docs/sdks/samlconnectionssdk/README.md#list) - Get a list of SAML Connections for an instance @@ -526,6 +539,8 @@ def verify_machine_token(request: httpx.Request): * [delete_web3_wallet](docs/sdks/users/README.md#delete_web3_wallet) - Delete a user web3 wallet * [delete_totp](docs/sdks/users/README.md#delete_totp) - Delete all the user's TOTPs * [delete_external_account](docs/sdks/users/README.md#delete_external_account) - Delete External Account +* [set_password_compromised](docs/sdks/users/README.md#set_password_compromised) - Set a user's password as compromised +* [unset_password_compromised](docs/sdks/users/README.md#unset_password_compromised) - Unset a user's password as compromised * [get_instance_organization_memberships](docs/sdks/users/README.md#get_instance_organization_memberships) - Get a list of all organization memberships within an instance. ### [WaitlistEntries](docs/sdks/waitlistentriessdk/README.md) @@ -675,33 +690,33 @@ with Clerk( **Inherit from [`ClerkBaseError`](./src/clerk_backend_api/models/clerkbaseerror.py)**: -* [`CreateAPIKeyAPIKeysResponseBody`](./src/clerk_backend_api/models/createapikeyapikeysresponsebody.py): 400 Bad Request. Status code `400`. Applicable to 1 of 178 methods.* -* [`GetAPIKeysAPIKeysResponseBody`](./src/clerk_backend_api/models/getapikeysapikeysresponsebody.py): 400 Bad Request. Status code `400`. Applicable to 1 of 178 methods.* -* [`GetAPIKeyAPIKeysResponseBody`](./src/clerk_backend_api/models/getapikeyapikeysresponsebody.py): 400 Bad Request. Status code `400`. Applicable to 1 of 178 methods.* -* [`UpdateAPIKeyAPIKeysResponseBody`](./src/clerk_backend_api/models/updateapikeyapikeysresponsebody.py): 400 Bad Request. Status code `400`. Applicable to 1 of 178 methods.* -* [`DeleteAPIKeyAPIKeysResponseBody`](./src/clerk_backend_api/models/deleteapikeyapikeysresponsebody.py): 400 Bad Request. Status code `400`. Applicable to 1 of 178 methods.* -* [`GetAPIKeySecretAPIKeysResponseBody`](./src/clerk_backend_api/models/getapikeysecretapikeysresponsebody.py): 400 Bad Request. Status code `400`. Applicable to 1 of 178 methods.* -* [`RevokeAPIKeyAPIKeysResponseBody`](./src/clerk_backend_api/models/revokeapikeyapikeysresponsebody.py): 400 Bad Request. Status code `400`. Applicable to 1 of 178 methods.* -* [`VerifyAPIKeyAPIKeysResponseBody`](./src/clerk_backend_api/models/verifyapikeyapikeysresponsebody.py): 400 Bad Request. Status code `400`. Applicable to 1 of 178 methods.* -* [`CreateM2MTokenM2mResponseBody`](./src/clerk_backend_api/models/createm2mtokenm2mresponsebody.py): 400 Bad Request. Status code `400`. Applicable to 1 of 178 methods.* -* [`GetM2MTokensM2mResponseBody`](./src/clerk_backend_api/models/getm2mtokensm2mresponsebody.py): 400 Bad Request. Status code `400`. Applicable to 1 of 178 methods.* -* [`RevokeM2MTokenM2mResponseBody`](./src/clerk_backend_api/models/revokem2mtokenm2mresponsebody.py): 400 Bad Request. Status code `400`. Applicable to 1 of 178 methods.* -* [`VerifyM2MTokenM2mResponseBody`](./src/clerk_backend_api/models/verifym2mtokenm2mresponsebody.py): 400 Bad Request. Status code `400`. Applicable to 1 of 178 methods.* -* [`VerifyOAuthAccessTokenOauthAccessTokensResponseBody`](./src/clerk_backend_api/models/verifyoauthaccesstokenoauthaccesstokensresponsebody.py): 400 Bad Request. Status code `400`. Applicable to 1 of 178 methods.* -* [`GetM2MTokensM2mResponseResponseBody`](./src/clerk_backend_api/models/getm2mtokensm2mresponseresponsebody.py): 403 Forbidden. Status code `403`. Applicable to 1 of 178 methods.* -* [`GetAPIKeysAPIKeysResponseResponseBody`](./src/clerk_backend_api/models/getapikeysapikeysresponseresponsebody.py): 404 Not Found. Status code `404`. Applicable to 1 of 178 methods.* -* [`GetAPIKeyAPIKeysResponseResponseBody`](./src/clerk_backend_api/models/getapikeyapikeysresponseresponsebody.py): 404 Not Found. Status code `404`. Applicable to 1 of 178 methods.* -* [`UpdateAPIKeyAPIKeysResponseResponseBody`](./src/clerk_backend_api/models/updateapikeyapikeysresponseresponsebody.py): 404 Not Found. Status code `404`. Applicable to 1 of 178 methods.* -* [`DeleteAPIKeyAPIKeysResponseResponseBody`](./src/clerk_backend_api/models/deleteapikeyapikeysresponseresponsebody.py): 404 Not Found. Status code `404`. Applicable to 1 of 178 methods.* -* [`GetAPIKeySecretAPIKeysResponseResponseBody`](./src/clerk_backend_api/models/getapikeysecretapikeysresponseresponsebody.py): 404 Not Found. Status code `404`. Applicable to 1 of 178 methods.* -* [`RevokeAPIKeyAPIKeysResponseResponseBody`](./src/clerk_backend_api/models/revokeapikeyapikeysresponseresponsebody.py): 404 Not Found. Status code `404`. Applicable to 1 of 178 methods.* -* [`VerifyAPIKeyAPIKeysResponseResponseBody`](./src/clerk_backend_api/models/verifyapikeyapikeysresponseresponsebody.py): 404 Not Found. Status code `404`. Applicable to 1 of 178 methods.* -* [`GetM2MTokensM2mResponse404ResponseBody`](./src/clerk_backend_api/models/getm2mtokensm2mresponse404responsebody.py): 404 Not Found. Status code `404`. Applicable to 1 of 178 methods.* -* [`RevokeM2MTokenM2mResponseResponseBody`](./src/clerk_backend_api/models/revokem2mtokenm2mresponseresponsebody.py): 404 Not Found. Status code `404`. Applicable to 1 of 178 methods.* -* [`VerifyM2MTokenM2mResponseResponseBody`](./src/clerk_backend_api/models/verifym2mtokenm2mresponseresponsebody.py): 404 Not Found. Status code `404`. Applicable to 1 of 178 methods.* -* [`VerifyOAuthAccessTokenOauthAccessTokensResponseResponseBody`](./src/clerk_backend_api/models/verifyoauthaccesstokenoauthaccesstokensresponseresponsebody.py): 404 Not Found. Status code `404`. Applicable to 1 of 178 methods.* -* [`CreateAPIKeyAPIKeysResponseResponseBody`](./src/clerk_backend_api/models/createapikeyapikeysresponseresponsebody.py): 409 Conflict. Status code `409`. Applicable to 1 of 178 methods.* -* [`CreateM2MTokenM2mResponseResponseBody`](./src/clerk_backend_api/models/createm2mtokenm2mresponseresponsebody.py): 409 Conflict. Status code `409`. Applicable to 1 of 178 methods.* +* [`CreateAPIKeyAPIKeysResponseBody`](./src/clerk_backend_api/models/createapikeyapikeysresponsebody.py): 400 Bad Request. Status code `400`. Applicable to 1 of 190 methods.* +* [`GetAPIKeysAPIKeysResponseBody`](./src/clerk_backend_api/models/getapikeysapikeysresponsebody.py): 400 Bad Request. Status code `400`. Applicable to 1 of 190 methods.* +* [`GetAPIKeyAPIKeysResponseBody`](./src/clerk_backend_api/models/getapikeyapikeysresponsebody.py): 400 Bad Request. Status code `400`. Applicable to 1 of 190 methods.* +* [`UpdateAPIKeyAPIKeysResponseBody`](./src/clerk_backend_api/models/updateapikeyapikeysresponsebody.py): 400 Bad Request. Status code `400`. Applicable to 1 of 190 methods.* +* [`DeleteAPIKeyAPIKeysResponseBody`](./src/clerk_backend_api/models/deleteapikeyapikeysresponsebody.py): 400 Bad Request. Status code `400`. Applicable to 1 of 190 methods.* +* [`GetAPIKeySecretAPIKeysResponseBody`](./src/clerk_backend_api/models/getapikeysecretapikeysresponsebody.py): 400 Bad Request. Status code `400`. Applicable to 1 of 190 methods.* +* [`RevokeAPIKeyAPIKeysResponseBody`](./src/clerk_backend_api/models/revokeapikeyapikeysresponsebody.py): 400 Bad Request. Status code `400`. Applicable to 1 of 190 methods.* +* [`VerifyAPIKeyAPIKeysResponseBody`](./src/clerk_backend_api/models/verifyapikeyapikeysresponsebody.py): 400 Bad Request. Status code `400`. Applicable to 1 of 190 methods.* +* [`CreateM2MTokenM2mResponseBody`](./src/clerk_backend_api/models/createm2mtokenm2mresponsebody.py): 400 Bad Request. Status code `400`. Applicable to 1 of 190 methods.* +* [`GetM2MTokensM2mResponseBody`](./src/clerk_backend_api/models/getm2mtokensm2mresponsebody.py): 400 Bad Request. Status code `400`. Applicable to 1 of 190 methods.* +* [`RevokeM2MTokenM2mResponseBody`](./src/clerk_backend_api/models/revokem2mtokenm2mresponsebody.py): 400 Bad Request. Status code `400`. Applicable to 1 of 190 methods.* +* [`VerifyM2MTokenM2mResponseBody`](./src/clerk_backend_api/models/verifym2mtokenm2mresponsebody.py): 400 Bad Request. Status code `400`. Applicable to 1 of 190 methods.* +* [`VerifyOAuthAccessTokenOauthAccessTokensResponseBody`](./src/clerk_backend_api/models/verifyoauthaccesstokenoauthaccesstokensresponsebody.py): 400 Bad Request. Status code `400`. Applicable to 1 of 190 methods.* +* [`GetM2MTokensM2mResponseResponseBody`](./src/clerk_backend_api/models/getm2mtokensm2mresponseresponsebody.py): 403 Forbidden. Status code `403`. Applicable to 1 of 190 methods.* +* [`GetAPIKeysAPIKeysResponseResponseBody`](./src/clerk_backend_api/models/getapikeysapikeysresponseresponsebody.py): 404 Not Found. Status code `404`. Applicable to 1 of 190 methods.* +* [`GetAPIKeyAPIKeysResponseResponseBody`](./src/clerk_backend_api/models/getapikeyapikeysresponseresponsebody.py): 404 Not Found. Status code `404`. Applicable to 1 of 190 methods.* +* [`UpdateAPIKeyAPIKeysResponseResponseBody`](./src/clerk_backend_api/models/updateapikeyapikeysresponseresponsebody.py): 404 Not Found. Status code `404`. Applicable to 1 of 190 methods.* +* [`DeleteAPIKeyAPIKeysResponseResponseBody`](./src/clerk_backend_api/models/deleteapikeyapikeysresponseresponsebody.py): 404 Not Found. Status code `404`. Applicable to 1 of 190 methods.* +* [`GetAPIKeySecretAPIKeysResponseResponseBody`](./src/clerk_backend_api/models/getapikeysecretapikeysresponseresponsebody.py): 404 Not Found. Status code `404`. Applicable to 1 of 190 methods.* +* [`RevokeAPIKeyAPIKeysResponseResponseBody`](./src/clerk_backend_api/models/revokeapikeyapikeysresponseresponsebody.py): 404 Not Found. Status code `404`. Applicable to 1 of 190 methods.* +* [`VerifyAPIKeyAPIKeysResponseResponseBody`](./src/clerk_backend_api/models/verifyapikeyapikeysresponseresponsebody.py): 404 Not Found. Status code `404`. Applicable to 1 of 190 methods.* +* [`GetM2MTokensM2mResponse404ResponseBody`](./src/clerk_backend_api/models/getm2mtokensm2mresponse404responsebody.py): 404 Not Found. Status code `404`. Applicable to 1 of 190 methods.* +* [`RevokeM2MTokenM2mResponseResponseBody`](./src/clerk_backend_api/models/revokem2mtokenm2mresponseresponsebody.py): 404 Not Found. Status code `404`. Applicable to 1 of 190 methods.* +* [`VerifyM2MTokenM2mResponseResponseBody`](./src/clerk_backend_api/models/verifym2mtokenm2mresponseresponsebody.py): 404 Not Found. Status code `404`. Applicable to 1 of 190 methods.* +* [`VerifyOAuthAccessTokenOauthAccessTokensResponseResponseBody`](./src/clerk_backend_api/models/verifyoauthaccesstokenoauthaccesstokensresponseresponsebody.py): 404 Not Found. Status code `404`. Applicable to 1 of 190 methods.* +* [`CreateAPIKeyAPIKeysResponseResponseBody`](./src/clerk_backend_api/models/createapikeyapikeysresponseresponsebody.py): 409 Conflict. Status code `409`. Applicable to 1 of 190 methods.* +* [`CreateM2MTokenM2mResponseResponseBody`](./src/clerk_backend_api/models/createm2mtokenm2mresponseresponsebody.py): 409 Conflict. Status code `409`. Applicable to 1 of 190 methods.* * [`ResponseValidationError`](./src/clerk_backend_api/models/responsevalidationerror.py): Type mismatch between the response data and the expected Pydantic model. Provides access to the Pydantic validation error via the `cause` attribute. diff --git a/RELEASES.md b/RELEASES.md index 0939aada..5c7028b4 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -528,4 +528,14 @@ Based on: ### Generated - [python v4.2.0] . ### Releases -- [PyPI v4.2.0] https://pypi.org/project/clerk-backend-api/4.2.0 - . \ No newline at end of file +- [PyPI v4.2.0] https://pypi.org/project/clerk-backend-api/4.2.0 - . + +## 2026-02-01 00:34:36 +### Changes +Based on: +- OpenAPI Doc +- Speakeasy CLI 1.700.2 (2.801.2) https://github.com/speakeasy-api/speakeasy +### Generated +- [python v4.2.1] . +### Releases +- [PyPI v4.2.1] https://pypi.org/project/clerk-backend-api/4.2.1 - . \ No newline at end of file diff --git a/docs/models/addrolestorolesetrequest.md b/docs/models/addrolestorolesetrequest.md new file mode 100644 index 00000000..5f55abf3 --- /dev/null +++ b/docs/models/addrolestorolesetrequest.md @@ -0,0 +1,9 @@ +# AddRolesToRoleSetRequest + + +## Fields + +| Field | Type | Required | Description | +| -------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | +| `role_set_key_or_id` | *str* | :heavy_check_mark: | The key or ID of the role set | +| `request_body` | [models.AddRolesToRoleSetRequestBody](../models/addrolestorolesetrequestbody.md) | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/docs/models/addrolestorolesetrequestbody.md b/docs/models/addrolestorolesetrequestbody.md new file mode 100644 index 00000000..faa7449f --- /dev/null +++ b/docs/models/addrolestorolesetrequestbody.md @@ -0,0 +1,10 @@ +# AddRolesToRoleSetRequestBody + + +## Fields + +| Field | Type | Required | Description | +| ---------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | +| `role_keys` | List[*str*] | :heavy_check_mark: | Array of role keys to add to the role set.
Must contain at least one role and no more than 10 roles. | +| `default_role_key` | *Optional[str]* | :heavy_minus_sign: | Optionally update the default role to one of the newly added roles. | +| `creator_role_key` | *Optional[str]* | :heavy_minus_sign: | Optionally update the creator role to one of the newly added roles. | \ No newline at end of file diff --git a/docs/models/commercepriceresponse.md b/docs/models/commercepriceresponse.md new file mode 100644 index 00000000..daddf428 --- /dev/null +++ b/docs/models/commercepriceresponse.md @@ -0,0 +1,19 @@ +# CommercePriceResponse + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | +| `object` | [models.CommercePriceResponseObject](../models/commercepriceresponseobject.md) | :heavy_check_mark: | String representing the object's type. Objects of the same type share the same value. | +| `id` | *str* | :heavy_check_mark: | Unique identifier for the price. | +| `plan_id` | *str* | :heavy_check_mark: | Unique identifier for the associated plan. | +| `instance_id` | *str* | :heavy_check_mark: | Unique identifier for the instance. | +| `currency` | *str* | :heavy_check_mark: | The currency code (e.g., "USD"). | +| `currency_symbol` | *str* | :heavy_check_mark: | The currency symbol (e.g., "$"). | +| `amount` | *int* | :heavy_check_mark: | The amount in cents for the price. | +| `annual_monthly_amount` | *int* | :heavy_check_mark: | The monthly amount in cents when billed annually. | +| `fee` | [models.CommerceMoneyResponse](../models/commercemoneyresponse.md) | :heavy_check_mark: | N/A | +| `annual_monthly_fee` | [models.CommerceMoneyResponse](../models/commercemoneyresponse.md) | :heavy_check_mark: | N/A | +| `description` | *OptionalNullable[str]* | :heavy_minus_sign: | The description of the price. | +| `created_at` | *int* | :heavy_check_mark: | Unix timestamp (milliseconds) of creation. | \ No newline at end of file diff --git a/docs/models/commercepriceresponseobject.md b/docs/models/commercepriceresponseobject.md new file mode 100644 index 00000000..7bb2ba63 --- /dev/null +++ b/docs/models/commercepriceresponseobject.md @@ -0,0 +1,10 @@ +# CommercePriceResponseObject + +String representing the object's type. Objects of the same type share the same value. + + +## Values + +| Name | Value | +| ---------------- | ---------------- | +| `COMMERCE_PRICE` | commerce_price | \ No newline at end of file diff --git a/docs/models/commercepricetransitiondetails.md b/docs/models/commercepricetransitiondetails.md new file mode 100644 index 00000000..5e83faba --- /dev/null +++ b/docs/models/commercepricetransitiondetails.md @@ -0,0 +1,16 @@ +# CommercePriceTransitionDetails + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | +| `previous_plan` | [models.SchemasCommercePlan](../models/schemascommerceplan.md) | :heavy_check_mark: | N/A | +| `previous_price` | [models.CommercePriceResponse](../models/commercepriceresponse.md) | :heavy_check_mark: | N/A | +| `effective_at` | *int* | :heavy_check_mark: | Unix timestamp (milliseconds) when the new price takes effect. | +| `effective_mode` | [models.EffectiveMode](../models/effectivemode.md) | :heavy_check_mark: | When the new price takes effect. | +| `next_billing_date` | *OptionalNullable[int]* | :heavy_minus_sign: | Unix timestamp (milliseconds) for the next billing date. | +| `charged_immediately` | *bool* | :heavy_check_mark: | Whether an immediate charge was made. | +| `immediate_charge` | [OptionalNullable[models.ImmediateCharge]](../models/immediatecharge.md) | :heavy_minus_sign: | Amount charged immediately, if any. | +| `previous_subscription_item_status` | [models.PreviousSubscriptionItemStatus](../models/previoussubscriptionitemstatus.md) | :heavy_check_mark: | The status of the previous subscription item after transition. | +| `previous_subscription_item_id` | *str* | :heavy_check_mark: | The ID of the previous subscription item. | \ No newline at end of file diff --git a/docs/models/commercepricetransitionresponse.md b/docs/models/commercepricetransitionresponse.md new file mode 100644 index 00000000..04213ba4 --- /dev/null +++ b/docs/models/commercepricetransitionresponse.md @@ -0,0 +1,12 @@ +# CommercePriceTransitionResponse + +A commerce price transition. + + +## Fields + +| Field | Type | Required | Description | +| -------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- | +| `object` | [models.CommercePriceTransitionResponseObject](../models/commercepricetransitionresponseobject.md) | :heavy_check_mark: | String representing the object's type. Objects of the same type share the same value. | +| `subscription_item` | [models.SchemasCommerceSubscriptionItem](../models/schemascommercesubscriptionitem.md) | :heavy_check_mark: | N/A | +| `transition` | [models.CommercePriceTransitionDetails](../models/commercepricetransitiondetails.md) | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/docs/models/commercepricetransitionresponseobject.md b/docs/models/commercepricetransitionresponseobject.md new file mode 100644 index 00000000..bcf5af7b --- /dev/null +++ b/docs/models/commercepricetransitionresponseobject.md @@ -0,0 +1,10 @@ +# CommercePriceTransitionResponseObject + +String representing the object's type. Objects of the same type share the same value. + + +## Values + +| Name | Value | +| --------------------------- | --------------------------- | +| `COMMERCE_PRICE_TRANSITION` | commerce_price_transition | \ No newline at end of file diff --git a/docs/models/commercesubscriptionitem.md b/docs/models/commercesubscriptionitem.md index c31a81db..da17de96 100644 --- a/docs/models/commercesubscriptionitem.md +++ b/docs/models/commercesubscriptionitem.md @@ -11,6 +11,7 @@ | `status` | [models.CommerceSubscriptionItemStatus](../models/commercesubscriptionitemstatus.md) | :heavy_check_mark: | Current status of the subscription item. | | `credit` | [Optional[models.CommerceSubscriptionCreditResponse]](../models/commercesubscriptioncreditresponse.md) | :heavy_minus_sign: | N/A | | `plan_id` | *Nullable[str]* | :heavy_check_mark: | Unique identifier for the associated plan. | +| `price_id` | *Optional[str]* | :heavy_minus_sign: | Unique identifier for the associated price | | `plan` | [OptionalNullable[models.Plan]](../models/plan.md) | :heavy_minus_sign: | The associated plan. | | `plan_period` | [models.PlanPeriod](../models/planperiod.md) | :heavy_check_mark: | The billing period for this subscription item. | | `payment_method` | [Optional[models.CommercePaymentMethodResponse]](../models/commercepaymentmethodresponse.md) | :heavy_minus_sign: | N/A | diff --git a/docs/models/createapikeyresponsebody.md b/docs/models/createapikeyresponsebody.md index 87c07004..96b07c78 100644 --- a/docs/models/createapikeyresponsebody.md +++ b/docs/models/createapikeyresponsebody.md @@ -5,22 +5,22 @@ ## Fields -| Field | Type | Required | Description | Example | -| ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | -| `object` | [models.CreateAPIKeyObject](../models/createapikeyobject.md) | :heavy_check_mark: | N/A | | -| `id` | *str* | :heavy_check_mark: | N/A | ak_3beecc9c60adb5f9b850e91a8ee1e992 | -| `type` | *str* | :heavy_check_mark: | N/A | api_key | -| `subject` | *str* | :heavy_check_mark: | N/A | user_2xhFjEI5X2qWRvtV13BzSj8H6Dk | -| `name` | *str* | :heavy_check_mark: | N/A | MY_SERVICE_API_KEY | -| `description` | *OptionalNullable[str]* | :heavy_minus_sign: | N/A | This is my API Key | -| `claims` | *Nullable[Any]* | :heavy_check_mark: | N/A | {
"foo": "bar"
} | -| `scopes` | List[*str*] | :heavy_check_mark: | N/A | [
"read",
"write"
] | -| `secret` | *str* | :heavy_check_mark: | N/A | ak_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | -| `revoked` | *bool* | :heavy_check_mark: | N/A | false | -| `revocation_reason` | *Nullable[str]* | :heavy_check_mark: | N/A | Revoked by user | -| `expired` | *bool* | :heavy_check_mark: | N/A | false | -| `expiration` | *Nullable[float]* | :heavy_check_mark: | N/A | 1716883200 | -| `created_by` | *Nullable[str]* | :heavy_check_mark: | N/A | user_2xhFjEI5X2qWRvtV13BzSj8H6Dk | -| `last_used_at` | *Nullable[float]* | :heavy_check_mark: | N/A | 1716883200 | -| `created_at` | *float* | :heavy_check_mark: | N/A | 1716883200 | -| `updated_at` | *float* | :heavy_check_mark: | N/A | 1716883200 | \ No newline at end of file +| Field | Type | Required | Description | Example | +| -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | +| `object` | [models.CreateAPIKeyObject](../models/createapikeyobject.md) | :heavy_check_mark: | N/A | | +| `id` | *str* | :heavy_check_mark: | N/A | ak_3beecc9c60adb5f9b850e91a8ee1e992 | +| `type` | *str* | :heavy_check_mark: | N/A | api_key | +| `subject` | *str* | :heavy_check_mark: | N/A | user_2xhFjEI5X2qWRvtV13BzSj8H6Dk | +| `name` | *str* | :heavy_check_mark: | N/A | MY_SERVICE_API_KEY | +| `description` | *OptionalNullable[str]* | :heavy_minus_sign: | N/A | This is my API Key | +| `claims` | *Nullable[Any]* | :heavy_check_mark: | N/A | {
"foo": "bar"
} | +| `scopes` | List[*str*] | :heavy_check_mark: | N/A | [
"read",
"write"
] | +| `secret` | *str* | :heavy_check_mark: | N/A | ak_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | +| `revoked` | *bool* | :heavy_check_mark: | N/A | false | +| `revocation_reason` | *Nullable[str]* | :heavy_check_mark: | N/A | Revoked by user | +| `expired` | *bool* | :heavy_check_mark: | N/A | false | +| `expiration` | *Nullable[float]* | :heavy_check_mark: | The timestamp for when the API key will expire, in milliseconds | 1716883200 | +| `created_by` | *Nullable[str]* | :heavy_check_mark: | N/A | user_2xhFjEI5X2qWRvtV13BzSj8H6Dk | +| `last_used_at` | *Nullable[float]* | :heavy_check_mark: | The timestamp for when the API key was last used, in milliseconds | 1716883200 | +| `created_at` | *float* | :heavy_check_mark: | The timestamp for when the API key was created, in milliseconds | 1716883200 | +| `updated_at` | *float* | :heavy_check_mark: | The timestamp for when the API key was last updated, in milliseconds | 1716883200 | \ No newline at end of file diff --git a/docs/models/createbillingpricetransitionrequest.md b/docs/models/createbillingpricetransitionrequest.md new file mode 100644 index 00000000..397502ba --- /dev/null +++ b/docs/models/createbillingpricetransitionrequest.md @@ -0,0 +1,9 @@ +# CreateBillingPriceTransitionRequest + + +## Fields + +| Field | Type | Required | Description | +| -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | +| `subscription_item_id` | *str* | :heavy_check_mark: | The ID of the subscription item to transition | +| `price_transition_request` | [models.PriceTransitionRequest](../models/pricetransitionrequest.md) | :heavy_check_mark: | Parameters for the price transition | \ No newline at end of file diff --git a/docs/models/createm2mtokenresponsebody.md b/docs/models/createm2mtokenresponsebody.md index 4f970e8e..93ee10e5 100644 --- a/docs/models/createm2mtokenresponsebody.md +++ b/docs/models/createm2mtokenresponsebody.md @@ -16,7 +16,7 @@ | `revoked` | *bool* | :heavy_check_mark: | N/A | false | | `revocation_reason` | *Nullable[str]* | :heavy_check_mark: | N/A | Revoked by user | | `expired` | *bool* | :heavy_check_mark: | N/A | false | -| `expiration` | *Nullable[float]* | :heavy_check_mark: | N/A | 1716883200 | -| `last_used_at` | *Nullable[float]* | :heavy_check_mark: | N/A | 1716883200 | -| `created_at` | *float* | :heavy_check_mark: | N/A | 1716883200 | -| `updated_at` | *float* | :heavy_check_mark: | N/A | 1716883200 | \ No newline at end of file +| `expiration` | *Nullable[float]* | :heavy_check_mark: | The timestamp for when the token will expire, in milliseconds | 1716883200 | +| `last_used_at` | *Nullable[float]* | :heavy_check_mark: | The timestamp for when the token was last used, in milliseconds | 1716883200 | +| `created_at` | *float* | :heavy_check_mark: | The timestamp for when the token was created, in milliseconds | 1716883200 | +| `updated_at` | *float* | :heavy_check_mark: | The timestamp for when the token was last updated, in milliseconds | 1716883200 | \ No newline at end of file diff --git a/docs/models/createmachinerequestbody.md b/docs/models/createmachinerequestbody.md index 2f76374e..9d66e5b1 100644 --- a/docs/models/createmachinerequestbody.md +++ b/docs/models/createmachinerequestbody.md @@ -6,5 +6,5 @@ | Field | Type | Required | Description | | -------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- | | `name` | *str* | :heavy_check_mark: | The name of the machine | -| `scoped_machines` | List[*str*] | :heavy_minus_sign: | Array of machine IDs that this machine will have access to. Maximum of 25 scopes per machine. | +| `scoped_machines` | List[*str*] | :heavy_minus_sign: | Array of machine IDs that this machine will have access to. Maximum of 150 scopes per machine. | | `default_token_ttl` | *Optional[int]* | :heavy_minus_sign: | The default time-to-live (TTL) in seconds for tokens created by this machine. Must be at least 1 second. | \ No newline at end of file diff --git a/docs/models/createorganizationinvitationbulkrequestbody.md b/docs/models/createorganizationinvitationbulkrequestbody.md index dff1e827..444cd025 100644 --- a/docs/models/createorganizationinvitationbulkrequestbody.md +++ b/docs/models/createorganizationinvitationbulkrequestbody.md @@ -11,4 +11,5 @@ | `public_metadata` | Dict[str, *Any*] | :heavy_minus_sign: | Metadata saved on the organization invitation, read-only from the Frontend API and fully accessible (read/write) from the Backend API.
When the organization invitation is accepted, the metadata will be transferred to the newly created organization membership. | {} | | `private_metadata` | Dict[str, *Any*] | :heavy_minus_sign: | Metadata saved on the organization invitation, fully accessible (read/write) from the Backend API but not visible from the Frontend API.
When the organization invitation is accepted, the metadata will be transferred to the newly created organization membership. | {} | | `redirect_url` | *OptionalNullable[str]* | :heavy_minus_sign: | Optional URL that the invitee will be redirected to once they accept the invitation by clicking the join link in the invitation email. | https://example.com/welcome | -| `expires_in_days` | *OptionalNullable[int]* | :heavy_minus_sign: | The number of days the invitation will be valid for. By default, the invitation has a 30 days expire. | | \ No newline at end of file +| `expires_in_days` | *OptionalNullable[int]* | :heavy_minus_sign: | The number of days the invitation will be valid for. By default, the invitation has a 30 days expire. | | +| `notify` | *OptionalNullable[bool]* | :heavy_minus_sign: | Optional flag which denotes whether an email invitation should be sent to the given email address.
Defaults to `true`. | | \ No newline at end of file diff --git a/docs/models/createorganizationinvitationrequestbody.md b/docs/models/createorganizationinvitationrequestbody.md index 2c4e102c..150dd2de 100644 --- a/docs/models/createorganizationinvitationrequestbody.md +++ b/docs/models/createorganizationinvitationrequestbody.md @@ -11,4 +11,5 @@ | `public_metadata` | Dict[str, *Any*] | :heavy_minus_sign: | Metadata saved on the organization invitation, read-only from the Frontend API and fully accessible (read/write) from the Backend API.
When the organization invitation is accepted, the metadata will be transferred to the newly created organization membership. | {
"key": "value"
} | | `private_metadata` | Dict[str, *Any*] | :heavy_minus_sign: | Metadata saved on the organization invitation, fully accessible (read/write) from the Backend API but not visible from the Frontend API.
When the organization invitation is accepted, the metadata will be transferred to the newly created organization membership. | {
"private_key": "secret_value"
} | | `redirect_url` | *OptionalNullable[str]* | :heavy_minus_sign: | Optional URL that the invitee will be redirected to once they accept the invitation by clicking the join link in the invitation email. | https://example.com/welcome | -| `expires_in_days` | *OptionalNullable[int]* | :heavy_minus_sign: | The number of days the invitation will be valid for. By default, the invitation has a 30 days expire. | | \ No newline at end of file +| `expires_in_days` | *OptionalNullable[int]* | :heavy_minus_sign: | The number of days the invitation will be valid for. By default, the invitation has a 30 days expire. | | +| `notify` | *OptionalNullable[bool]* | :heavy_minus_sign: | Optional flag which denotes whether an email invitation should be sent to the given email address.
Defaults to `true`. | | \ No newline at end of file diff --git a/docs/models/createrolesetrequestbody.md b/docs/models/createrolesetrequestbody.md new file mode 100644 index 00000000..c8dff7c2 --- /dev/null +++ b/docs/models/createrolesetrequestbody.md @@ -0,0 +1,14 @@ +# CreateRoleSetRequestBody + + +## Fields + +| Field | Type | Required | Description | +| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `name` | *str* | :heavy_check_mark: | The name of the new role set | +| `key` | *Optional[str]* | :heavy_minus_sign: | A unique key for the role set. Must start with 'role_set:' and contain only lowercase alphanumeric characters and underscores.
If not provided, a key will be generated from the name. | +| `description` | *OptionalNullable[str]* | :heavy_minus_sign: | Optional description for the role set | +| `default_role_key` | *str* | :heavy_check_mark: | The key of the role to use as the default role for new organization members.
Must be one of the roles in the `roles` array. | +| `creator_role_key` | *str* | :heavy_check_mark: | The key of the role to assign to organization creators.
Must be one of the roles in the `roles` array. | +| `type` | [Optional[models.CreateRoleSetType]](../models/createrolesettype.md) | :heavy_minus_sign: | The type of the role set. "initial" role sets are the default for new organizations.
Only one role set can be "initial" per instance. | +| `roles` | List[*str*] | :heavy_check_mark: | Array of role keys to include in the role set.
Must contain at least one role and no more than 10 roles. | \ No newline at end of file diff --git a/docs/models/createrolesettype.md b/docs/models/createrolesettype.md new file mode 100644 index 00000000..7b54ed42 --- /dev/null +++ b/docs/models/createrolesettype.md @@ -0,0 +1,12 @@ +# CreateRoleSetType + +The type of the role set. "initial" role sets are the default for new organizations. +Only one role set can be "initial" per instance. + + +## Values + +| Name | Value | +| --------- | --------- | +| `INITIAL` | initial | +| `CUSTOM` | custom | \ No newline at end of file diff --git a/docs/models/createuserrequestbody.md b/docs/models/createuserrequestbody.md index 4b4fa5f3..dfd3b956 100644 --- a/docs/models/createuserrequestbody.md +++ b/docs/models/createuserrequestbody.md @@ -3,30 +3,31 @@ ## Fields -| Field | Type | Required | Description | Example | -| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `external_id` | *OptionalNullable[str]* | :heavy_minus_sign: | The ID of the user as used in your external systems or your previous authentication solution.
Must be unique across your instance. | ext-id-001 | -| `first_name` | *OptionalNullable[str]* | :heavy_minus_sign: | The first name to assign to the user | John | -| `last_name` | *OptionalNullable[str]* | :heavy_minus_sign: | The last name to assign to the user | Doe | -| `locale` | *OptionalNullable[str]* | :heavy_minus_sign: | The locale to assign to the user (e.g., "en-US", "fr-FR") | | -| `email_address` | List[*str*] | :heavy_minus_sign: | Email addresses to add to the user.
Must be unique across your instance.
The first email address will be set as the user's primary email address. | | -| `phone_number` | List[*str*] | :heavy_minus_sign: | Phone numbers to add to the user.
Must be unique across your instance.
The first phone number will be set as the user's primary phone number. | | -| `web3_wallet` | List[*str*] | :heavy_minus_sign: | Web3 wallets to add to the user.
Must be unique across your instance.
The first wallet will be set as the user's primary wallet. | | -| `username` | *OptionalNullable[str]* | :heavy_minus_sign: | The username to give to the user.
It must be unique across your instance. | johndoe123 | -| `password` | *OptionalNullable[str]* | :heavy_minus_sign: | The plaintext password to give the user.
Must be at least 8 characters long, and cannot be in any list of hacked passwords. | Secure*Pass4 | -| `password_digest` | *OptionalNullable[str]* | :heavy_minus_sign: | In case you already have the password digests and not the passwords, you can use them for the newly created user via this property.
The digests should be generated with one of the supported algorithms.
The hashing algorithm can be specified using the `password_hasher` property. | $argon2i$v=19$m=4096,t=3,p=1$4t6CL3P7YiHBtwESXawI8Hm20zJj4cs7/4/G3c187e0$m7RQFczcKr5bIR0IIxbpO2P0tyrLjf3eUW3M3QSwnLc | -| `password_hasher` | *Optional[str]* | :heavy_minus_sign: | The hashing algorithm that was used to generate the password digest.

The algorithms we support at the moment are [`bcrypt`](https://en.wikipedia.org/wiki/Bcrypt), [`bcrypt_sha256_django`](https://docs.djangoproject.com/en/4.0/topics/auth/passwords/), [`md5`](https://en.wikipedia.org/wiki/MD5), `pbkdf2_sha1`, `pbkdf2_sha256`, [`pbkdf2_sha256_django`](https://docs.djangoproject.com/en/4.0/topics/auth/passwords/),
[`phpass`](https://www.openwall.com/phpass/), `md5_phpass`, [`scrypt_firebase`](https://firebaseopensource.com/projects/firebase/scrypt/),
[`scrypt_werkzeug`](https://werkzeug.palletsprojects.com/en/3.0.x/utils/#werkzeug.security.generate_password_hash), [`sha256`](https://en.wikipedia.org/wiki/SHA-2),
[`ldap_ssha`](https://www.openldap.org/faq/data/cache/347.html) and the [`argon2`](https://argon2.online/) variants: `argon2i` and `argon2id`.

Each of the supported hashers expects the incoming digest to be in a particular format. See the [Clerk docs](https://clerk.com/docs/references/backend/user/create-user) for more information. | | -| `skip_password_checks` | *OptionalNullable[bool]* | :heavy_minus_sign: | When set to `true` all password checks are skipped.
It is recommended to use this method only when migrating plaintext passwords to Clerk.
Upon migration the user base should be prompted to pick stronger password. | false | -| `skip_password_requirement` | *OptionalNullable[bool]* | :heavy_minus_sign: | When set to `true`, `password` is not required anymore when creating the user and can be omitted.
This is useful when you are trying to create a user that doesn't have a password, in an instance that is using passwords.
Please note that you cannot use this flag if password is the only way for a user to sign into your instance. | false | -| `totp_secret` | *OptionalNullable[str]* | :heavy_minus_sign: | In case TOTP is configured on the instance, you can provide the secret to enable it on the newly created user without the need to reset it.
Please note that currently the supported options are:
* Period: 30 seconds
* Code length: 6 digits
* Algorithm: SHA1 | base32totpsecretkey | -| `backup_codes` | List[*str*] | :heavy_minus_sign: | If Backup Codes are configured on the instance, you can provide them to enable it on the newly created user without the need to reset them.
You must provide the backup codes in plain format or the corresponding bcrypt digest. | [
"123456",
"654321"
] | -| `public_metadata` | Dict[str, *Any*] | :heavy_minus_sign: | Metadata saved on the user, that is visible to both your Frontend and Backend APIs | {
"role": "user"
} | -| `private_metadata` | Dict[str, *Any*] | :heavy_minus_sign: | Metadata saved on the user, that is only visible to your Backend API | {
"internal_id": "789"
} | -| `unsafe_metadata` | Dict[str, *Any*] | :heavy_minus_sign: | Metadata saved on the user, that can be updated from both the Frontend and Backend APIs.
Note: Since this data can be modified from the frontend, it is not guaranteed to be safe. | {
"preferences": {
"theme": "dark"
}
} | -| `delete_self_enabled` | *OptionalNullable[bool]* | :heavy_minus_sign: | If enabled, user can delete themselves via FAPI.
| | -| `legal_accepted_at` | *OptionalNullable[str]* | :heavy_minus_sign: | A custom timestamp denoting _when_ the user accepted legal requirements, specified in RFC3339 format (e.g. `2012-10-20T07:15:20.902Z`). | | -| `skip_legal_checks` | *OptionalNullable[bool]* | :heavy_minus_sign: | When set to `true` all legal checks are skipped.
It is not recommended to skip legal checks unless you are migrating a user to Clerk. | | -| `create_organization_enabled` | *OptionalNullable[bool]* | :heavy_minus_sign: | If enabled, user can create organizations via FAPI.
| | -| `create_organizations_limit` | *OptionalNullable[int]* | :heavy_minus_sign: | The maximum number of organizations the user can create. 0 means unlimited.
| | -| `created_at` | *OptionalNullable[str]* | :heavy_minus_sign: | A custom date/time denoting _when_ the user signed up to the application, specified in RFC3339 format (e.g. `2012-10-20T07:15:20.902Z`). | 2023-03-15T07:15:20.902Z | -| `bypass_client_trust` | *OptionalNullable[bool]* | :heavy_minus_sign: | When set to `true`, the user will bypass client trust checks during sign-in. | | \ No newline at end of file +| Field | Type | Required | Description | Example | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `external_id` | *OptionalNullable[str]* | :heavy_minus_sign: | The ID of the user as used in your external systems or your previous authentication solution.
Must be unique across your instance. | ext-id-001 | +| `first_name` | *OptionalNullable[str]* | :heavy_minus_sign: | The first name to assign to the user | John | +| `last_name` | *OptionalNullable[str]* | :heavy_minus_sign: | The last name to assign to the user | Doe | +| `locale` | *OptionalNullable[str]* | :heavy_minus_sign: | The locale to assign to the user (e.g., "en-US", "fr-FR") | | +| `email_address` | List[*str*] | :heavy_minus_sign: | Email addresses to add to the user.
Must be unique across your instance.
The first email address will be set as the user's primary email address. | | +| `phone_number` | List[*str*] | :heavy_minus_sign: | Phone numbers to add to the user.
Must be unique across your instance.
The first phone number will be set as the user's primary phone number. | | +| `web3_wallet` | List[*str*] | :heavy_minus_sign: | Web3 wallets to add to the user.
Must be unique across your instance.
The first wallet will be set as the user's primary wallet. | | +| `username` | *OptionalNullable[str]* | :heavy_minus_sign: | The username to give to the user.
It must be unique across your instance. | johndoe123 | +| `password` | *OptionalNullable[str]* | :heavy_minus_sign: | The plaintext password to give the user.
Must be at least 8 characters long, and cannot be in any list of hacked passwords. | Secure*Pass4 | +| `password_digest` | *OptionalNullable[str]* | :heavy_minus_sign: | In case you already have the password digests and not the passwords, you can use them for the newly created user via this property.
The digests should be generated with one of the supported algorithms.
The hashing algorithm can be specified using the `password_hasher` property. | $argon2i$v=19$m=4096,t=3,p=1$4t6CL3P7YiHBtwESXawI8Hm20zJj4cs7/4/G3c187e0$m7RQFczcKr5bIR0IIxbpO2P0tyrLjf3eUW3M3QSwnLc | +| `password_hasher` | *Optional[str]* | :heavy_minus_sign: | The hashing algorithm that was used to generate the password digest.

The algorithms we support at the moment are [`bcrypt`](https://en.wikipedia.org/wiki/Bcrypt), [`bcrypt_sha256_django`](https://docs.djangoproject.com/en/4.0/topics/auth/passwords/), [`md5`](https://en.wikipedia.org/wiki/MD5), `pbkdf2_sha1`, `pbkdf2_sha256`, [`pbkdf2_sha256_django`](https://docs.djangoproject.com/en/4.0/topics/auth/passwords/),
[`phpass`](https://www.openwall.com/phpass/), `md5_phpass`, [`scrypt_firebase`](https://firebaseopensource.com/projects/firebase/scrypt/),
[`scrypt_werkzeug`](https://werkzeug.palletsprojects.com/en/3.0.x/utils/#werkzeug.security.generate_password_hash), [`sha256`](https://en.wikipedia.org/wiki/SHA-2),
[`ldap_ssha`](https://www.openldap.org/faq/data/cache/347.html), the [`argon2`](https://argon2.online/) variants: `argon2i` and `argon2id`, and `sha512_symfony`, the SHA-512 variant of the [Symfony](https://symfony.com/doc/current/security/passwords.html) legacy hasher.

Each of the supported hashers expects the incoming digest to be in a particular format. See the [Clerk docs](https://clerk.com/docs/references/backend/user/create-user) for more information. | | +| `skip_password_checks` | *OptionalNullable[bool]* | :heavy_minus_sign: | When set to `true` all password checks are skipped.
It is recommended to use this method only when migrating plaintext passwords to Clerk.
Upon migration the user base should be prompted to pick stronger password. | false | +| `skip_password_requirement` | *OptionalNullable[bool]* | :heavy_minus_sign: | When set to `true`, `password` is not required anymore when creating the user and can be omitted.
This is useful when you are trying to create a user that doesn't have a password, in an instance that is using passwords.
Please note that you cannot use this flag if password is the only way for a user to sign into your instance. | false | +| `totp_secret` | *OptionalNullable[str]* | :heavy_minus_sign: | In case TOTP is configured on the instance, you can provide the secret to enable it on the newly created user without the need to reset it.
Please note that currently the supported options are:
* Period: 30 seconds
* Code length: 6 digits
* Algorithm: SHA1 | base32totpsecretkey | +| `backup_codes` | List[*str*] | :heavy_minus_sign: | If Backup Codes are configured on the instance, you can provide them to enable it on the newly created user without the need to reset them.
You must provide the backup codes in plain format or the corresponding bcrypt digest. | [
"123456",
"654321"
] | +| `public_metadata` | Dict[str, *Any*] | :heavy_minus_sign: | Metadata saved on the user, that is visible to both your Frontend and Backend APIs | {
"role": "user"
} | +| `private_metadata` | Dict[str, *Any*] | :heavy_minus_sign: | Metadata saved on the user, that is only visible to your Backend API | {
"internal_id": "789"
} | +| `unsafe_metadata` | Dict[str, *Any*] | :heavy_minus_sign: | Metadata saved on the user, that can be updated from both the Frontend and Backend APIs.
Note: Since this data can be modified from the frontend, it is not guaranteed to be safe. | {
"preferences": {
"theme": "dark"
}
} | +| `delete_self_enabled` | *OptionalNullable[bool]* | :heavy_minus_sign: | If enabled, user can delete themselves via FAPI.
| | +| `legal_accepted_at` | *OptionalNullable[str]* | :heavy_minus_sign: | A custom timestamp denoting _when_ the user accepted legal requirements, specified in RFC3339 format (e.g. `2012-10-20T07:15:20.902Z`). | | +| `skip_legal_checks` | *OptionalNullable[bool]* | :heavy_minus_sign: | When set to `true` all legal checks are skipped.
It is not recommended to skip legal checks unless you are migrating a user to Clerk. | | +| `skip_user_requirement` | *OptionalNullable[bool]* | :heavy_minus_sign: | When set to `true`, identification types are not enforced.
At least one identification type must be enabled and provided on your instance (email, phone, web3 wallet, or username).
Users created without required identification types cannot use those authentication strategies
It is not recommended to use this flag unless you need to allow Clerk UI components to prompt for required fields while BAPI creates users with minimal data, or for migration a user to Clerk. | | +| `create_organization_enabled` | *OptionalNullable[bool]* | :heavy_minus_sign: | If enabled, user can create organizations via FAPI.
| | +| `create_organizations_limit` | *OptionalNullable[int]* | :heavy_minus_sign: | The maximum number of organizations the user can create. 0 means unlimited.
| | +| `created_at` | *OptionalNullable[str]* | :heavy_minus_sign: | A custom date/time denoting _when_ the user signed up to the application, specified in RFC3339 format (e.g. `2012-10-20T07:15:20.902Z`). | 2023-03-15T07:15:20.902Z | +| `bypass_client_trust` | *OptionalNullable[bool]* | :heavy_minus_sign: | When set to `true`, the user will bypass client trust checks during sign-in. | | \ No newline at end of file diff --git a/docs/models/creatorrole.md b/docs/models/creatorrole.md new file mode 100644 index 00000000..d246737c --- /dev/null +++ b/docs/models/creatorrole.md @@ -0,0 +1,18 @@ +# CreatorRole + +The role assigned to the creator of an organization + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------ | ------------------------------------------------------------------------ | ------------------------------------------------------------------------ | ------------------------------------------------------------------------ | +| `object` | [models.RoleSetCreatorRoleObject](../models/rolesetcreatorroleobject.md) | :heavy_check_mark: | N/A | +| `id` | *str* | :heavy_check_mark: | The unique identifier of the role | +| `name` | *str* | :heavy_check_mark: | The name of the role | +| `key` | *str* | :heavy_check_mark: | The key of the role (e.g., "org:admin", "org:member") | +| `description` | *Nullable[str]* | :heavy_check_mark: | Optional description of the role | +| `members_count` | *OptionalNullable[int]* | :heavy_minus_sign: | The number of members assigned to this role within the role set | +| `has_members` | *OptionalNullable[bool]* | :heavy_minus_sign: | Whether this role has any members assigned within the role set | +| `created_at` | *int* | :heavy_check_mark: | Unix timestamp of role creation | +| `updated_at` | *int* | :heavy_check_mark: | Unix timestamp of last role update | \ No newline at end of file diff --git a/docs/models/data.md b/docs/models/data.md index f8f70bc4..6d52499c 100644 --- a/docs/models/data.md +++ b/docs/models/data.md @@ -3,21 +3,21 @@ ## Fields -| Field | Type | Required | Description | Example | -| -------------------------------------------------------- | -------------------------------------------------------- | -------------------------------------------------------- | -------------------------------------------------------- | -------------------------------------------------------- | -| `object` | [models.GetAPIKeysObject](../models/getapikeysobject.md) | :heavy_check_mark: | N/A | | -| `id` | *str* | :heavy_check_mark: | N/A | ak_3beecc9c60adb5f9b850e91a8ee1e992 | -| `type` | *str* | :heavy_check_mark: | N/A | api_key | -| `subject` | *str* | :heavy_check_mark: | N/A | user_2xhFjEI5X2qWRvtV13BzSj8H6Dk | -| `name` | *str* | :heavy_check_mark: | N/A | MY_SERVICE_API_KEY | -| `description` | *OptionalNullable[str]* | :heavy_minus_sign: | N/A | This is my API Key | -| `claims` | *Nullable[Any]* | :heavy_check_mark: | N/A | {
"foo": "bar"
} | -| `scopes` | List[*str*] | :heavy_check_mark: | N/A | [
"read",
"write"
] | -| `revoked` | *bool* | :heavy_check_mark: | N/A | false | -| `revocation_reason` | *Nullable[str]* | :heavy_check_mark: | N/A | Revoked by user | -| `expired` | *bool* | :heavy_check_mark: | N/A | false | -| `expiration` | *Nullable[float]* | :heavy_check_mark: | N/A | 1716883200 | -| `created_by` | *Nullable[str]* | :heavy_check_mark: | N/A | user_2xhFjEI5X2qWRvtV13BzSj8H6Dk | -| `last_used_at` | *Nullable[float]* | :heavy_check_mark: | N/A | 1716883200 | -| `created_at` | *float* | :heavy_check_mark: | N/A | 1716883200 | -| `updated_at` | *float* | :heavy_check_mark: | N/A | 1716883200 | \ No newline at end of file +| Field | Type | Required | Description | Example | +| -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | +| `object` | [models.GetAPIKeysObject](../models/getapikeysobject.md) | :heavy_check_mark: | N/A | | +| `id` | *str* | :heavy_check_mark: | N/A | ak_3beecc9c60adb5f9b850e91a8ee1e992 | +| `type` | *str* | :heavy_check_mark: | N/A | api_key | +| `subject` | *str* | :heavy_check_mark: | N/A | user_2xhFjEI5X2qWRvtV13BzSj8H6Dk | +| `name` | *str* | :heavy_check_mark: | N/A | MY_SERVICE_API_KEY | +| `description` | *OptionalNullable[str]* | :heavy_minus_sign: | N/A | This is my API Key | +| `claims` | *Nullable[Any]* | :heavy_check_mark: | N/A | {
"foo": "bar"
} | +| `scopes` | List[*str*] | :heavy_check_mark: | N/A | [
"read",
"write"
] | +| `revoked` | *bool* | :heavy_check_mark: | N/A | false | +| `revocation_reason` | *Nullable[str]* | :heavy_check_mark: | N/A | Revoked by user | +| `expired` | *bool* | :heavy_check_mark: | N/A | false | +| `expiration` | *Nullable[float]* | :heavy_check_mark: | The timestamp for when the API key will expire, in milliseconds | 1716883200 | +| `created_by` | *Nullable[str]* | :heavy_check_mark: | N/A | user_2xhFjEI5X2qWRvtV13BzSj8H6Dk | +| `last_used_at` | *Nullable[float]* | :heavy_check_mark: | The timestamp for when the API key was last used, in milliseconds | 1716883200 | +| `created_at` | *float* | :heavy_check_mark: | The timestamp for when the API key was created, in milliseconds | 1716883200 | +| `updated_at` | *float* | :heavy_check_mark: | The timestamp for when the API key was last updated, in milliseconds | 1716883200 | \ No newline at end of file diff --git a/docs/models/defaultrole.md b/docs/models/defaultrole.md new file mode 100644 index 00000000..80043f0e --- /dev/null +++ b/docs/models/defaultrole.md @@ -0,0 +1,18 @@ +# DefaultRole + +The default role assigned to new organization members + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------ | ------------------------------------------------------------------------ | ------------------------------------------------------------------------ | ------------------------------------------------------------------------ | +| `object` | [models.RoleSetDefaultRoleObject](../models/rolesetdefaultroleobject.md) | :heavy_check_mark: | N/A | +| `id` | *str* | :heavy_check_mark: | The unique identifier of the role | +| `name` | *str* | :heavy_check_mark: | The name of the role | +| `key` | *str* | :heavy_check_mark: | The key of the role (e.g., "org:admin", "org:member") | +| `description` | *Nullable[str]* | :heavy_check_mark: | Optional description of the role | +| `members_count` | *OptionalNullable[int]* | :heavy_minus_sign: | The number of members assigned to this role within the role set | +| `has_members` | *OptionalNullable[bool]* | :heavy_minus_sign: | Whether this role has any members assigned within the role set | +| `created_at` | *int* | :heavy_check_mark: | Unix timestamp of role creation | +| `updated_at` | *int* | :heavy_check_mark: | Unix timestamp of last role update | \ No newline at end of file diff --git a/docs/models/effectivemode.md b/docs/models/effectivemode.md new file mode 100644 index 00000000..2bca7a10 --- /dev/null +++ b/docs/models/effectivemode.md @@ -0,0 +1,11 @@ +# EffectiveMode + +When the new price takes effect. + + +## Values + +| Name | Value | +| --------------- | --------------- | +| `IMMEDIATE` | immediate | +| `END_OF_PERIOD` | end_of_period | \ No newline at end of file diff --git a/docs/models/getapikeyresponsebody.md b/docs/models/getapikeyresponsebody.md index 8c495b4e..d0a3fdf7 100644 --- a/docs/models/getapikeyresponsebody.md +++ b/docs/models/getapikeyresponsebody.md @@ -5,21 +5,21 @@ ## Fields -| Field | Type | Required | Description | Example | -| ------------------------------------------------------ | ------------------------------------------------------ | ------------------------------------------------------ | ------------------------------------------------------ | ------------------------------------------------------ | -| `object` | [models.GetAPIKeyObject](../models/getapikeyobject.md) | :heavy_check_mark: | N/A | | -| `id` | *str* | :heavy_check_mark: | N/A | ak_3beecc9c60adb5f9b850e91a8ee1e992 | -| `type` | *str* | :heavy_check_mark: | N/A | api_key | -| `subject` | *str* | :heavy_check_mark: | N/A | user_2xhFjEI5X2qWRvtV13BzSj8H6Dk | -| `name` | *str* | :heavy_check_mark: | N/A | MY_SERVICE_API_KEY | -| `description` | *OptionalNullable[str]* | :heavy_minus_sign: | N/A | This is my API Key | -| `claims` | *Nullable[Any]* | :heavy_check_mark: | N/A | {
"foo": "bar"
} | -| `scopes` | List[*str*] | :heavy_check_mark: | N/A | [
"read",
"write"
] | -| `revoked` | *bool* | :heavy_check_mark: | N/A | false | -| `revocation_reason` | *Nullable[str]* | :heavy_check_mark: | N/A | Revoked by user | -| `expired` | *bool* | :heavy_check_mark: | N/A | false | -| `expiration` | *Nullable[float]* | :heavy_check_mark: | N/A | 1716883200 | -| `created_by` | *Nullable[str]* | :heavy_check_mark: | N/A | user_2xhFjEI5X2qWRvtV13BzSj8H6Dk | -| `last_used_at` | *Nullable[float]* | :heavy_check_mark: | N/A | 1716883200 | -| `created_at` | *float* | :heavy_check_mark: | N/A | 1716883200 | -| `updated_at` | *float* | :heavy_check_mark: | N/A | 1716883200 | \ No newline at end of file +| Field | Type | Required | Description | Example | +| -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | +| `object` | [models.GetAPIKeyObject](../models/getapikeyobject.md) | :heavy_check_mark: | N/A | | +| `id` | *str* | :heavy_check_mark: | N/A | ak_3beecc9c60adb5f9b850e91a8ee1e992 | +| `type` | *str* | :heavy_check_mark: | N/A | api_key | +| `subject` | *str* | :heavy_check_mark: | N/A | user_2xhFjEI5X2qWRvtV13BzSj8H6Dk | +| `name` | *str* | :heavy_check_mark: | N/A | MY_SERVICE_API_KEY | +| `description` | *OptionalNullable[str]* | :heavy_minus_sign: | N/A | This is my API Key | +| `claims` | *Nullable[Any]* | :heavy_check_mark: | N/A | {
"foo": "bar"
} | +| `scopes` | List[*str*] | :heavy_check_mark: | N/A | [
"read",
"write"
] | +| `revoked` | *bool* | :heavy_check_mark: | N/A | false | +| `revocation_reason` | *Nullable[str]* | :heavy_check_mark: | N/A | Revoked by user | +| `expired` | *bool* | :heavy_check_mark: | N/A | false | +| `expiration` | *Nullable[float]* | :heavy_check_mark: | The timestamp for when the API key will expire, in milliseconds | 1716883200 | +| `created_by` | *Nullable[str]* | :heavy_check_mark: | N/A | user_2xhFjEI5X2qWRvtV13BzSj8H6Dk | +| `last_used_at` | *Nullable[float]* | :heavy_check_mark: | The timestamp for when the API key was last used, in milliseconds | 1716883200 | +| `created_at` | *float* | :heavy_check_mark: | The timestamp for when the API key was created, in milliseconds | 1716883200 | +| `updated_at` | *float* | :heavy_check_mark: | The timestamp for when the API key was last updated, in milliseconds | 1716883200 | \ No newline at end of file diff --git a/docs/models/getrolesetrequest.md b/docs/models/getrolesetrequest.md new file mode 100644 index 00000000..ce170b47 --- /dev/null +++ b/docs/models/getrolesetrequest.md @@ -0,0 +1,8 @@ +# GetRoleSetRequest + + +## Fields + +| Field | Type | Required | Description | +| ----------------------------- | ----------------------------- | ----------------------------- | ----------------------------- | +| `role_set_key_or_id` | *str* | :heavy_check_mark: | The key or ID of the role set | \ No newline at end of file diff --git a/docs/models/immediatecharge.md b/docs/models/immediatecharge.md new file mode 100644 index 00000000..739574b0 --- /dev/null +++ b/docs/models/immediatecharge.md @@ -0,0 +1,13 @@ +# ImmediateCharge + +Amount charged immediately, if any. + + +## Fields + +| Field | Type | Required | Description | +| -------------------------------------------------- | -------------------------------------------------- | -------------------------------------------------- | -------------------------------------------------- | +| `amount` | *int* | :heavy_check_mark: | The amount in cents. | +| `amount_formatted` | *str* | :heavy_check_mark: | The formatted amount as a string (e.g., "$49.99"). | +| `currency` | *str* | :heavy_check_mark: | The currency code (e.g., "USD"). | +| `currency_symbol` | *str* | :heavy_check_mark: | The currency symbol (e.g., "$"). | \ No newline at end of file diff --git a/docs/models/instanceprotect.md b/docs/models/instanceprotect.md new file mode 100644 index 00000000..d5cea66e --- /dev/null +++ b/docs/models/instanceprotect.md @@ -0,0 +1,12 @@ +# InstanceProtect + +Success + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------ | ------------------------------------------------------------------ | ------------------------------------------------------------------ | ------------------------------------------------------------------ | +| `object` | [models.InstanceProtectObject](../models/instanceprotectobject.md) | :heavy_check_mark: | N/A | +| `rules_enabled` | *bool* | :heavy_check_mark: | N/A | +| `specter_enabled` | *bool* | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/docs/models/instanceprotectobject.md b/docs/models/instanceprotectobject.md new file mode 100644 index 00000000..78515e94 --- /dev/null +++ b/docs/models/instanceprotectobject.md @@ -0,0 +1,8 @@ +# InstanceProtectObject + + +## Values + +| Name | Value | +| ------------------ | ------------------ | +| `INSTANCE_PROTECT` | instance_protect | \ No newline at end of file diff --git a/docs/models/listrolesetsrequest.md b/docs/models/listrolesetsrequest.md new file mode 100644 index 00000000..f0b4a5d8 --- /dev/null +++ b/docs/models/listrolesetsrequest.md @@ -0,0 +1,11 @@ +# ListRoleSetsRequest + + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `query` | *Optional[str]* | :heavy_minus_sign: | Returns role sets with ID, name, or key that match the given query.
Uses exact match for role set ID and partial match for name and key. | | +| `order_by` | *Optional[str]* | :heavy_minus_sign: | Allows to return role sets in a particular order.
At the moment, you can order the returned role sets by their `created_at`, `name`, or `key`.
In order to specify the direction, you can use the `+/-` symbols prepended in the property to order by.
For example, if you want role sets to be returned in descending order according to their `created_at` property, you can use `-created_at`.
If you don't use `+` or `-`, then `+` is implied.
Defaults to `-created_at`. | | +| `limit` | *Optional[int]* | :heavy_minus_sign: | Applies a limit to the number of results returned.
Can be used for paginating the results together with `offset`. | 20 | +| `offset` | *Optional[int]* | :heavy_minus_sign: | Skip the first `offset` results when paginating.
Needs to be an integer greater or equal to zero.
To be used in conjunction with `limit`. | 10 | \ No newline at end of file diff --git a/docs/models/m2mtokens.md b/docs/models/m2mtokens.md index 4fc88e04..1b816a4d 100644 --- a/docs/models/m2mtokens.md +++ b/docs/models/m2mtokens.md @@ -13,7 +13,7 @@ | `revoked` | *bool* | :heavy_check_mark: | N/A | false | | `revocation_reason` | *Nullable[str]* | :heavy_check_mark: | N/A | Revoked by user | | `expired` | *bool* | :heavy_check_mark: | N/A | false | -| `expiration` | *Nullable[float]* | :heavy_check_mark: | N/A | 1716883200 | -| `last_used_at` | *Nullable[float]* | :heavy_check_mark: | N/A | 1716883200 | -| `created_at` | *float* | :heavy_check_mark: | N/A | 1716883200 | -| `updated_at` | *float* | :heavy_check_mark: | N/A | 1716883200 | \ No newline at end of file +| `expiration` | *Nullable[float]* | :heavy_check_mark: | The timestamp for when the token will expire, in milliseconds | 1716883200 | +| `last_used_at` | *Nullable[float]* | :heavy_check_mark: | The timestamp for when the token was last used, in milliseconds | 1716883200 | +| `created_at` | *float* | :heavy_check_mark: | The timestamp for when the token was created, in milliseconds | 1716883200 | +| `updated_at` | *float* | :heavy_check_mark: | The timestamp for when the token was last updated, in milliseconds | 1716883200 | \ No newline at end of file diff --git a/docs/models/oauthaccesstoken.md b/docs/models/oauthaccesstoken.md index 1bee722a..b5cfd921 100644 --- a/docs/models/oauthaccesstoken.md +++ b/docs/models/oauthaccesstoken.md @@ -5,15 +5,16 @@ Success ## Fields -| Field | Type | Required | Description | -| ---------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | -| `object` | [models.OAuthAccessTokenObject](../models/oauthaccesstokenobject.md) | :heavy_check_mark: | N/A | -| `external_account_id` | *str* | :heavy_check_mark: | External account ID | -| `provider_user_id` | *str* | :heavy_check_mark: | The unique ID of the user in the external provider's system | -| `token` | *str* | :heavy_check_mark: | The access token | -| `expires_at` | *Nullable[int]* | :heavy_check_mark: | Unix timestamp of the access token expiration. | -| `provider` | *str* | :heavy_check_mark: | The ID of the provider | -| `public_metadata` | Dict[str, *Any*] | :heavy_check_mark: | N/A | -| `label` | *Nullable[str]* | :heavy_check_mark: | N/A | -| `scopes` | List[*str*] | :heavy_minus_sign: | The list of scopes that the token is valid for. Only present for OAuth 2.0 tokens. | -| `token_secret` | *Optional[str]* | :heavy_minus_sign: | The token secret. Only present for OAuth 1.0 tokens. | \ No newline at end of file +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------ | +| `object` | [models.OAuthAccessTokenObject](../models/oauthaccesstokenobject.md) | :heavy_check_mark: | N/A | +| `external_account_id` | *str* | :heavy_check_mark: | External account ID | +| `provider_user_id` | *str* | :heavy_check_mark: | The unique ID of the user in the external provider's system | +| `token` | *str* | :heavy_check_mark: | The access token | +| `expires_at` | *Nullable[int]* | :heavy_check_mark: | Unix timestamp of the access token expiration. | +| `provider` | *str* | :heavy_check_mark: | The ID of the provider | +| `public_metadata` | Dict[str, *Any*] | :heavy_check_mark: | N/A | +| `label` | *Nullable[str]* | :heavy_check_mark: | N/A | +| `scopes` | List[*str*] | :heavy_minus_sign: | The list of scopes that the token is valid for. Only present for OAuth 2.0 tokens. | +| `id_token` | *Optional[str]* | :heavy_minus_sign: | The ID token retrieved from the OIDC provider. Only present for OIDC-compliant OAuth 2.0 providers when available. | +| `token_secret` | *Optional[str]* | :heavy_minus_sign: | The token secret. Only present for OAuth 1.0 tokens. | \ No newline at end of file diff --git a/docs/models/previoussubscriptionitemstatus.md b/docs/models/previoussubscriptionitemstatus.md new file mode 100644 index 00000000..86033b30 --- /dev/null +++ b/docs/models/previoussubscriptionitemstatus.md @@ -0,0 +1,12 @@ +# PreviousSubscriptionItemStatus + +The status of the previous subscription item after transition. + + +## Values + +| Name | Value | +| ----------- | ----------- | +| `CANCELED` | canceled | +| `ENDED` | ended | +| `ABANDONED` | abandoned | \ No newline at end of file diff --git a/docs/models/pricetransitionrequest.md b/docs/models/pricetransitionrequest.md new file mode 100644 index 00000000..0261adef --- /dev/null +++ b/docs/models/pricetransitionrequest.md @@ -0,0 +1,9 @@ +# PriceTransitionRequest + + +## Fields + +| Field | Type | Required | Description | +| ---------------------------------------------- | ---------------------------------------------- | ---------------------------------------------- | ---------------------------------------------- | +| `from_price_id` | *str* | :heavy_check_mark: | The current price ID of the subscription item. | +| `to_price_id` | *str* | :heavy_check_mark: | The target price ID to transition to. | \ No newline at end of file diff --git a/docs/models/replaceroleinrolesetrequest.md b/docs/models/replaceroleinrolesetrequest.md new file mode 100644 index 00000000..d5113e37 --- /dev/null +++ b/docs/models/replaceroleinrolesetrequest.md @@ -0,0 +1,9 @@ +# ReplaceRoleInRoleSetRequest + + +## Fields + +| Field | Type | Required | Description | +| -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | +| `role_set_key_or_id` | *str* | :heavy_check_mark: | The key or ID of the role set | +| `request_body` | [models.ReplaceRoleInRoleSetRequestBody](../models/replaceroleinrolesetrequestbody.md) | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/docs/models/replaceroleinrolesetrequestbody.md b/docs/models/replaceroleinrolesetrequestbody.md new file mode 100644 index 00000000..8c850d47 --- /dev/null +++ b/docs/models/replaceroleinrolesetrequestbody.md @@ -0,0 +1,9 @@ +# ReplaceRoleInRoleSetRequestBody + + +## Fields + +| Field | Type | Required | Description | +| ----------------------------------------------- | ----------------------------------------------- | ----------------------------------------------- | ----------------------------------------------- | +| `role_key` | *str* | :heavy_check_mark: | The key of the role to remove from the role set | +| `to_role_key` | *str* | :heavy_check_mark: | The key of the role to reassign members to | \ No newline at end of file diff --git a/docs/models/replacerolesetrequest.md b/docs/models/replacerolesetrequest.md new file mode 100644 index 00000000..6ec4d6c4 --- /dev/null +++ b/docs/models/replacerolesetrequest.md @@ -0,0 +1,9 @@ +# ReplaceRoleSetRequest + + +## Fields + +| Field | Type | Required | Description | +| -------------------------------------------------------------------------- | -------------------------------------------------------------------------- | -------------------------------------------------------------------------- | -------------------------------------------------------------------------- | +| `role_set_key_or_id` | *str* | :heavy_check_mark: | The key or ID of the role set to replace | +| `request_body` | [models.ReplaceRoleSetRequestBody](../models/replacerolesetrequestbody.md) | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/docs/models/replacerolesetrequestbody.md b/docs/models/replacerolesetrequestbody.md new file mode 100644 index 00000000..44aedc60 --- /dev/null +++ b/docs/models/replacerolesetrequestbody.md @@ -0,0 +1,9 @@ +# ReplaceRoleSetRequestBody + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- | +| `dest_role_set_key` | *str* | :heavy_check_mark: | The key of the destination role set | +| `reassignment_mappings` | Dict[str, *str*] | :heavy_minus_sign: | Mappings from source role keys to destination role keys.
Required if members have roles that need to be reassigned. | \ No newline at end of file diff --git a/docs/models/revokeapikeyresponsebody.md b/docs/models/revokeapikeyresponsebody.md index ac4bf540..66c29300 100644 --- a/docs/models/revokeapikeyresponsebody.md +++ b/docs/models/revokeapikeyresponsebody.md @@ -5,21 +5,21 @@ ## Fields -| Field | Type | Required | Description | Example | -| ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | -| `object` | [models.RevokeAPIKeyObject](../models/revokeapikeyobject.md) | :heavy_check_mark: | N/A | | -| `id` | *str* | :heavy_check_mark: | N/A | ak_3beecc9c60adb5f9b850e91a8ee1e992 | -| `type` | *str* | :heavy_check_mark: | N/A | api_key | -| `subject` | *str* | :heavy_check_mark: | N/A | user_2xhFjEI5X2qWRvtV13BzSj8H6Dk | -| `name` | *str* | :heavy_check_mark: | N/A | MY_SERVICE_API_KEY | -| `description` | *OptionalNullable[str]* | :heavy_minus_sign: | N/A | This is my API Key | -| `claims` | *Nullable[Any]* | :heavy_check_mark: | N/A | {
"foo": "bar"
} | -| `scopes` | List[*str*] | :heavy_check_mark: | N/A | [
"read",
"write"
] | -| `revoked` | *bool* | :heavy_check_mark: | N/A | false | -| `revocation_reason` | *Nullable[str]* | :heavy_check_mark: | N/A | Revoked by user | -| `expired` | *bool* | :heavy_check_mark: | N/A | false | -| `expiration` | *Nullable[float]* | :heavy_check_mark: | N/A | 1716883200 | -| `created_by` | *Nullable[str]* | :heavy_check_mark: | N/A | user_2xhFjEI5X2qWRvtV13BzSj8H6Dk | -| `last_used_at` | *Nullable[float]* | :heavy_check_mark: | N/A | 1716883200 | -| `created_at` | *float* | :heavy_check_mark: | N/A | 1716883200 | -| `updated_at` | *float* | :heavy_check_mark: | N/A | 1716883200 | \ No newline at end of file +| Field | Type | Required | Description | Example | +| -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | +| `object` | [models.RevokeAPIKeyObject](../models/revokeapikeyobject.md) | :heavy_check_mark: | N/A | | +| `id` | *str* | :heavy_check_mark: | N/A | ak_3beecc9c60adb5f9b850e91a8ee1e992 | +| `type` | *str* | :heavy_check_mark: | N/A | api_key | +| `subject` | *str* | :heavy_check_mark: | N/A | user_2xhFjEI5X2qWRvtV13BzSj8H6Dk | +| `name` | *str* | :heavy_check_mark: | N/A | MY_SERVICE_API_KEY | +| `description` | *OptionalNullable[str]* | :heavy_minus_sign: | N/A | This is my API Key | +| `claims` | *Nullable[Any]* | :heavy_check_mark: | N/A | {
"foo": "bar"
} | +| `scopes` | List[*str*] | :heavy_check_mark: | N/A | [
"read",
"write"
] | +| `revoked` | *bool* | :heavy_check_mark: | N/A | false | +| `revocation_reason` | *Nullable[str]* | :heavy_check_mark: | N/A | Revoked by user | +| `expired` | *bool* | :heavy_check_mark: | N/A | false | +| `expiration` | *Nullable[float]* | :heavy_check_mark: | The timestamp for when the API key will expire, in milliseconds | 1716883200 | +| `created_by` | *Nullable[str]* | :heavy_check_mark: | N/A | user_2xhFjEI5X2qWRvtV13BzSj8H6Dk | +| `last_used_at` | *Nullable[float]* | :heavy_check_mark: | The timestamp for when the API key was last used, in milliseconds | 1716883200 | +| `created_at` | *float* | :heavy_check_mark: | The timestamp for when the API key was created, in milliseconds | 1716883200 | +| `updated_at` | *float* | :heavy_check_mark: | The timestamp for when the API key was last updated, in milliseconds | 1716883200 | \ No newline at end of file diff --git a/docs/models/revokem2mtokenresponsebody.md b/docs/models/revokem2mtokenresponsebody.md index 0315730b..91ebf6fe 100644 --- a/docs/models/revokem2mtokenresponsebody.md +++ b/docs/models/revokem2mtokenresponsebody.md @@ -15,7 +15,7 @@ | `revoked` | *bool* | :heavy_check_mark: | N/A | false | | `revocation_reason` | *Nullable[str]* | :heavy_check_mark: | N/A | Revoked by user | | `expired` | *bool* | :heavy_check_mark: | N/A | false | -| `expiration` | *Nullable[float]* | :heavy_check_mark: | N/A | 1716883200 | -| `last_used_at` | *Nullable[float]* | :heavy_check_mark: | N/A | 1716883200 | -| `created_at` | *float* | :heavy_check_mark: | N/A | 1716883200 | -| `updated_at` | *float* | :heavy_check_mark: | N/A | 1716883200 | \ No newline at end of file +| `expiration` | *Nullable[float]* | :heavy_check_mark: | The timestamp for when the token will expire, in milliseconds | 1716883200 | +| `last_used_at` | *Nullable[float]* | :heavy_check_mark: | The timestamp for when the token was last used, in milliseconds | 1716883200 | +| `created_at` | *float* | :heavy_check_mark: | The timestamp for when the token was created, in milliseconds | 1716883200 | +| `updated_at` | *float* | :heavy_check_mark: | The timestamp for when the token was last updated, in milliseconds | 1716883200 | \ No newline at end of file diff --git a/docs/models/roleset.md b/docs/models/roleset.md new file mode 100644 index 00000000..c8acfcb3 --- /dev/null +++ b/docs/models/roleset.md @@ -0,0 +1,21 @@ +# RoleSet + +A role set defines a collection of roles that can be assigned to organization members + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | +| `object` | [models.RoleSetObject](../models/rolesetobject.md) | :heavy_check_mark: | N/A | +| `id` | *str* | :heavy_check_mark: | The unique identifier of the role set | +| `name` | *str* | :heavy_check_mark: | The name of the role set | +| `key` | *str* | :heavy_check_mark: | A unique key for the role set (e.g., "role_set:default") | +| `description` | *Nullable[str]* | :heavy_check_mark: | Optional description of the role set | +| `roles` | List[[models.RoleSetItem](../models/rolesetitem.md)] | :heavy_check_mark: | The list of roles in this role set | +| `default_role` | [OptionalNullable[models.DefaultRole]](../models/defaultrole.md) | :heavy_minus_sign: | The default role assigned to new organization members | +| `creator_role` | [OptionalNullable[models.CreatorRole]](../models/creatorrole.md) | :heavy_minus_sign: | The role assigned to the creator of an organization | +| `type` | [models.Type](../models/type.md) | :heavy_check_mark: | The type of the role set ("initial" or "custom") | +| `role_set_migration` | [OptionalNullable[models.RoleSetMigration]](../models/rolesetmigration.md) | :heavy_minus_sign: | Active migration information, only present when status is "enqueued" or "in_progress" | +| `created_at` | *int* | :heavy_check_mark: | Unix timestamp of role set creation | +| `updated_at` | *int* | :heavy_check_mark: | Unix timestamp of last role set update | \ No newline at end of file diff --git a/docs/models/rolesetcreatorroleobject.md b/docs/models/rolesetcreatorroleobject.md new file mode 100644 index 00000000..a108279a --- /dev/null +++ b/docs/models/rolesetcreatorroleobject.md @@ -0,0 +1,8 @@ +# RoleSetCreatorRoleObject + + +## Values + +| Name | Value | +| --------------- | --------------- | +| `ROLE_SET_ITEM` | role_set_item | \ No newline at end of file diff --git a/docs/models/rolesetdefaultroleobject.md b/docs/models/rolesetdefaultroleobject.md new file mode 100644 index 00000000..5df9b4c0 --- /dev/null +++ b/docs/models/rolesetdefaultroleobject.md @@ -0,0 +1,8 @@ +# RoleSetDefaultRoleObject + + +## Values + +| Name | Value | +| --------------- | --------------- | +| `ROLE_SET_ITEM` | role_set_item | \ No newline at end of file diff --git a/docs/models/rolesetitem.md b/docs/models/rolesetitem.md new file mode 100644 index 00000000..bce1454b --- /dev/null +++ b/docs/models/rolesetitem.md @@ -0,0 +1,18 @@ +# RoleSetItem + +A role within a role set + + +## Fields + +| Field | Type | Required | Description | +| --------------------------------------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------------- | +| `object` | [models.RoleSetItemObject](../models/rolesetitemobject.md) | :heavy_check_mark: | N/A | +| `id` | *str* | :heavy_check_mark: | The unique identifier of the role | +| `name` | *str* | :heavy_check_mark: | The name of the role | +| `key` | *str* | :heavy_check_mark: | The key of the role (e.g., "org:admin", "org:member") | +| `description` | *Nullable[str]* | :heavy_check_mark: | Optional description of the role | +| `members_count` | *OptionalNullable[int]* | :heavy_minus_sign: | The number of members assigned to this role within the role set | +| `has_members` | *OptionalNullable[bool]* | :heavy_minus_sign: | Whether this role has any members assigned within the role set | +| `created_at` | *int* | :heavy_check_mark: | Unix timestamp of role creation | +| `updated_at` | *int* | :heavy_check_mark: | Unix timestamp of last role update | \ No newline at end of file diff --git a/docs/models/rolesetitemobject.md b/docs/models/rolesetitemobject.md new file mode 100644 index 00000000..f42ab724 --- /dev/null +++ b/docs/models/rolesetitemobject.md @@ -0,0 +1,8 @@ +# RoleSetItemObject + + +## Values + +| Name | Value | +| --------------- | --------------- | +| `ROLE_SET_ITEM` | role_set_item | \ No newline at end of file diff --git a/docs/models/rolesetmigration.md b/docs/models/rolesetmigration.md new file mode 100644 index 00000000..3a339c7c --- /dev/null +++ b/docs/models/rolesetmigration.md @@ -0,0 +1,23 @@ +# RoleSetMigration + +Active migration information, only present when status is "enqueued" or "in_progress" + + +## Fields + +| Field | Type | Required | Description | +| ---------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | +| `object` | [models.RoleSetRoleSetMigrationObject](../models/rolesetrolesetmigrationobject.md) | :heavy_check_mark: | N/A | +| `id` | *str* | :heavy_check_mark: | The unique identifier of the migration | +| `organization_id` | *OptionalNullable[str]* | :heavy_minus_sign: | The organization ID if the migration is scoped to a specific organization | +| `instance_id` | *str* | :heavy_check_mark: | The instance ID this migration belongs to | +| `source_role_set_id` | *str* | :heavy_check_mark: | The ID of the source role set being migrated from | +| `dest_role_set_id` | *OptionalNullable[str]* | :heavy_minus_sign: | The ID of the destination role set being migrated to | +| `trigger_type` | *str* | :heavy_check_mark: | What triggered this migration (e.g., "role_set_deletion", "role_removal") | +| `status` | *str* | :heavy_check_mark: | Current status of the migration (e.g., "enqueued", "in_progress", "completed") | +| `migrated_members` | *int* | :heavy_check_mark: | Number of members that have been migrated so far | +| `mappings` | Dict[str, *str*] | :heavy_minus_sign: | Role key mappings from source to destination roles | +| `started_at` | *OptionalNullable[int]* | :heavy_minus_sign: | Unix timestamp when the migration started | +| `completed_at` | *OptionalNullable[int]* | :heavy_minus_sign: | Unix timestamp when the migration completed | +| `created_at` | *int* | :heavy_check_mark: | Unix timestamp of migration creation | +| `updated_at` | *int* | :heavy_check_mark: | Unix timestamp of last migration update | \ No newline at end of file diff --git a/docs/models/rolesetobject.md b/docs/models/rolesetobject.md new file mode 100644 index 00000000..06fb7253 --- /dev/null +++ b/docs/models/rolesetobject.md @@ -0,0 +1,8 @@ +# RoleSetObject + + +## Values + +| Name | Value | +| ---------- | ---------- | +| `ROLE_SET` | role_set | \ No newline at end of file diff --git a/docs/models/rolesetrolesetmigrationobject.md b/docs/models/rolesetrolesetmigrationobject.md new file mode 100644 index 00000000..7449a0b3 --- /dev/null +++ b/docs/models/rolesetrolesetmigrationobject.md @@ -0,0 +1,8 @@ +# RoleSetRoleSetMigrationObject + + +## Values + +| Name | Value | +| -------------------- | -------------------- | +| `ROLE_SET_MIGRATION` | role_set_migration | \ No newline at end of file diff --git a/docs/models/rolesets.md b/docs/models/rolesets.md new file mode 100644 index 00000000..4f8f7d75 --- /dev/null +++ b/docs/models/rolesets.md @@ -0,0 +1,11 @@ +# RoleSets + +Success + + +## Fields + +| Field | Type | Required | Description | +| -------------------------------------------- | -------------------------------------------- | -------------------------------------------- | -------------------------------------------- | +| `data` | List[[models.RoleSet](../models/roleset.md)] | :heavy_check_mark: | N/A | +| `total_count` | *int* | :heavy_check_mark: | Total number of role sets | \ No newline at end of file diff --git a/docs/models/schemascommerceplan.md b/docs/models/schemascommerceplan.md new file mode 100644 index 00000000..2893aa19 --- /dev/null +++ b/docs/models/schemascommerceplan.md @@ -0,0 +1,36 @@ +# SchemasCommercePlan + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | +| `object` | [models.SchemasCommercePlanObject](../models/schemascommerceplanobject.md) | :heavy_check_mark: | String representing the object's type. Objects of the same type share the same value. | +| `id` | *str* | :heavy_check_mark: | Unique identifier for the commerce plan. | +| `name` | *str* | :heavy_check_mark: | The name of the commerce plan. | +| `fee` | [models.CommerceMoneyResponse](../models/commercemoneyresponse.md) | :heavy_check_mark: | N/A | +| `annual_monthly_fee` | [models.CommerceMoneyResponse](../models/commercemoneyresponse.md) | :heavy_check_mark: | N/A | +| `annual_fee` | [models.CommerceMoneyResponse](../models/commercemoneyresponse.md) | :heavy_check_mark: | N/A | +| `amount` | *int* | :heavy_check_mark: | The amount in cents for the plan. | +| `amount_formatted` | *str* | :heavy_check_mark: | The formatted amount as a string (e.g., "$49.99"). | +| `annual_monthly_amount` | *int* | :heavy_check_mark: | The monthly amount in cents when billed annually. | +| `annual_monthly_amount_formatted` | *str* | :heavy_check_mark: | The formatted annual monthly amount as a string. | +| `annual_amount` | *int* | :heavy_check_mark: | The total annual amount in cents. | +| `annual_amount_formatted` | *str* | :heavy_check_mark: | The formatted annual amount as a string. | +| `currency_symbol` | *str* | :heavy_check_mark: | The currency symbol (e.g., "$"). | +| `currency` | *str* | :heavy_check_mark: | The currency code (e.g., "USD"). | +| `description` | *str* | :heavy_check_mark: | The description of the commerce plan. | +| `product_id` | *str* | :heavy_check_mark: | The ID of the product this plan belongs to. | +| `is_default` | *bool* | :heavy_check_mark: | Whether this is the default plan. | +| `is_recurring` | *bool* | :heavy_check_mark: | Whether this is a recurring plan. | +| `publicly_visible` | *bool* | :heavy_check_mark: | Whether this plan is publicly visible. | +| `has_base_fee` | *bool* | :heavy_check_mark: | Whether this plan has a base fee. | +| `payer_type` | List[*str*] | :heavy_check_mark: | The types of payers that can use this plan. | +| `for_payer_type` | *str* | :heavy_check_mark: | The payer type this plan is designed for. | +| `slug` | *str* | :heavy_check_mark: | The URL-friendly slug for the plan. | +| `avatar_url` | *str* | :heavy_check_mark: | The URL of the plan's avatar image. | +| `period` | *Optional[str]* | :heavy_minus_sign: | The billing period for the plan. | +| `interval` | *Optional[int]* | :heavy_minus_sign: | The billing interval. | +| `features` | List[[models.SchemasFeatureResponse](../models/schemasfeatureresponse.md)] | :heavy_check_mark: | The features included in this plan. | +| `free_trial_enabled` | *Optional[bool]* | :heavy_minus_sign: | Whether free trial is enabled for this plan. | +| `free_trial_days` | *OptionalNullable[int]* | :heavy_minus_sign: | Number of free trial days for this plan. | \ No newline at end of file diff --git a/docs/models/schemascommerceplanobject.md b/docs/models/schemascommerceplanobject.md new file mode 100644 index 00000000..0a914fbb --- /dev/null +++ b/docs/models/schemascommerceplanobject.md @@ -0,0 +1,10 @@ +# SchemasCommercePlanObject + +String representing the object's type. Objects of the same type share the same value. + + +## Values + +| Name | Value | +| --------------- | --------------- | +| `COMMERCE_PLAN` | commerce_plan | \ No newline at end of file diff --git a/docs/models/schemascommercesubscriptionitem.md b/docs/models/schemascommercesubscriptionitem.md index 1f8d2d4b..edc5f717 100644 --- a/docs/models/schemascommercesubscriptionitem.md +++ b/docs/models/schemascommercesubscriptionitem.md @@ -13,6 +13,7 @@ A commerce subscription item. | `status` | [models.SchemasCommerceSubscriptionItemStatus](../models/schemascommercesubscriptionitemstatus.md) | :heavy_check_mark: | Current status of the subscription item. | | `credit` | [OptionalNullable[models.Credit]](../models/credit.md) | :heavy_minus_sign: | Credit information (only available in PaymentAttempt events). | | `plan_id` | *str* | :heavy_check_mark: | Unique identifier for the associated plan. | +| `price_id` | *Optional[str]* | :heavy_minus_sign: | Unique identifier for the associated price | | `plan` | [Nullable[models.SchemasCommerceSubscriptionItemPlan]](../models/schemascommercesubscriptionitemplan.md) | :heavy_check_mark: | The associated commerce plan. | | `plan_period` | [models.SchemasCommerceSubscriptionItemPlanPeriod](../models/schemascommercesubscriptionitemplanperiod.md) | :heavy_check_mark: | The billing period for this subscription. | | `payment_source_id` | *str* | :heavy_check_mark: | Unique identifier for the payment source. | diff --git a/docs/models/setuserpasswordcompromisedrequest.md b/docs/models/setuserpasswordcompromisedrequest.md new file mode 100644 index 00000000..5c9d9a02 --- /dev/null +++ b/docs/models/setuserpasswordcompromisedrequest.md @@ -0,0 +1,9 @@ +# SetUserPasswordCompromisedRequest + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------ | +| `user_id` | *str* | :heavy_check_mark: | The ID of the user to set the password as compromised | +| `request_body` | [Optional[models.SetUserPasswordCompromisedRequestBody]](../models/setuserpasswordcompromisedrequestbody.md) | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/models/setuserpasswordcompromisedrequestbody.md b/docs/models/setuserpasswordcompromisedrequestbody.md new file mode 100644 index 00000000..4d6237f5 --- /dev/null +++ b/docs/models/setuserpasswordcompromisedrequestbody.md @@ -0,0 +1,8 @@ +# SetUserPasswordCompromisedRequestBody + + +## Fields + +| Field | Type | Required | Description | +| ------------------------ | ------------------------ | ------------------------ | ------------------------ | +| `revoke_all_sessions` | *OptionalNullable[bool]* | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/models/type.md b/docs/models/type.md new file mode 100644 index 00000000..5e7aa828 --- /dev/null +++ b/docs/models/type.md @@ -0,0 +1,11 @@ +# Type + +The type of the role set ("initial" or "custom") + + +## Values + +| Name | Value | +| --------- | --------- | +| `INITIAL` | initial | +| `CUSTOM` | custom | \ No newline at end of file diff --git a/docs/models/unsetuserpasswordcompromisedrequest.md b/docs/models/unsetuserpasswordcompromisedrequest.md new file mode 100644 index 00000000..0a189fc4 --- /dev/null +++ b/docs/models/unsetuserpasswordcompromisedrequest.md @@ -0,0 +1,8 @@ +# UnsetUserPasswordCompromisedRequest + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------ | ------------------------------------------------------ | ------------------------------------------------------ | ------------------------------------------------------ | +| `user_id` | *str* | :heavy_check_mark: | The ID of the user to unset the compromised status for | \ No newline at end of file diff --git a/docs/models/updateapikeyresponsebody.md b/docs/models/updateapikeyresponsebody.md index 164cde31..f2dff9c7 100644 --- a/docs/models/updateapikeyresponsebody.md +++ b/docs/models/updateapikeyresponsebody.md @@ -5,21 +5,21 @@ ## Fields -| Field | Type | Required | Description | Example | -| ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | -| `object` | [models.UpdateAPIKeyObject](../models/updateapikeyobject.md) | :heavy_check_mark: | N/A | | -| `id` | *str* | :heavy_check_mark: | N/A | ak_3beecc9c60adb5f9b850e91a8ee1e992 | -| `type` | *str* | :heavy_check_mark: | N/A | api_key | -| `subject` | *str* | :heavy_check_mark: | N/A | user_2xhFjEI5X2qWRvtV13BzSj8H6Dk | -| `name` | *str* | :heavy_check_mark: | N/A | MY_SERVICE_API_KEY | -| `description` | *OptionalNullable[str]* | :heavy_minus_sign: | N/A | This is my API Key | -| `claims` | *Nullable[Any]* | :heavy_check_mark: | N/A | {
"foo": "bar"
} | -| `scopes` | List[*str*] | :heavy_check_mark: | N/A | [
"read",
"write"
] | -| `revoked` | *bool* | :heavy_check_mark: | N/A | false | -| `revocation_reason` | *Nullable[str]* | :heavy_check_mark: | N/A | Revoked by user | -| `expired` | *bool* | :heavy_check_mark: | N/A | false | -| `expiration` | *Nullable[float]* | :heavy_check_mark: | N/A | 1716883200 | -| `created_by` | *Nullable[str]* | :heavy_check_mark: | N/A | user_2xhFjEI5X2qWRvtV13BzSj8H6Dk | -| `last_used_at` | *Nullable[float]* | :heavy_check_mark: | N/A | 1716883200 | -| `created_at` | *float* | :heavy_check_mark: | N/A | 1716883200 | -| `updated_at` | *float* | :heavy_check_mark: | N/A | 1716883200 | \ No newline at end of file +| Field | Type | Required | Description | Example | +| -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | +| `object` | [models.UpdateAPIKeyObject](../models/updateapikeyobject.md) | :heavy_check_mark: | N/A | | +| `id` | *str* | :heavy_check_mark: | N/A | ak_3beecc9c60adb5f9b850e91a8ee1e992 | +| `type` | *str* | :heavy_check_mark: | N/A | api_key | +| `subject` | *str* | :heavy_check_mark: | N/A | user_2xhFjEI5X2qWRvtV13BzSj8H6Dk | +| `name` | *str* | :heavy_check_mark: | N/A | MY_SERVICE_API_KEY | +| `description` | *OptionalNullable[str]* | :heavy_minus_sign: | N/A | This is my API Key | +| `claims` | *Nullable[Any]* | :heavy_check_mark: | N/A | {
"foo": "bar"
} | +| `scopes` | List[*str*] | :heavy_check_mark: | N/A | [
"read",
"write"
] | +| `revoked` | *bool* | :heavy_check_mark: | N/A | false | +| `revocation_reason` | *Nullable[str]* | :heavy_check_mark: | N/A | Revoked by user | +| `expired` | *bool* | :heavy_check_mark: | N/A | false | +| `expiration` | *Nullable[float]* | :heavy_check_mark: | The timestamp for when the API key will expire, in milliseconds | 1716883200 | +| `created_by` | *Nullable[str]* | :heavy_check_mark: | N/A | user_2xhFjEI5X2qWRvtV13BzSj8H6Dk | +| `last_used_at` | *Nullable[float]* | :heavy_check_mark: | The timestamp for when the API key was last used, in milliseconds | 1716883200 | +| `created_at` | *float* | :heavy_check_mark: | The timestamp for when the API key was created, in milliseconds | 1716883200 | +| `updated_at` | *float* | :heavy_check_mark: | The timestamp for when the API key was last updated, in milliseconds | 1716883200 | \ No newline at end of file diff --git a/docs/models/updateinstanceprotectrequestbody.md b/docs/models/updateinstanceprotectrequestbody.md new file mode 100644 index 00000000..0fefea3e --- /dev/null +++ b/docs/models/updateinstanceprotectrequestbody.md @@ -0,0 +1,9 @@ +# UpdateInstanceProtectRequestBody + + +## Fields + +| Field | Type | Required | Description | +| ------------------------ | ------------------------ | ------------------------ | ------------------------ | +| `rules_enabled` | *OptionalNullable[bool]* | :heavy_minus_sign: | N/A | +| `specter_enabled` | *OptionalNullable[bool]* | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/models/updaterolesetrequest.md b/docs/models/updaterolesetrequest.md new file mode 100644 index 00000000..11a25bdd --- /dev/null +++ b/docs/models/updaterolesetrequest.md @@ -0,0 +1,9 @@ +# UpdateRoleSetRequest + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------ | ------------------------------------------------------------------------ | ------------------------------------------------------------------------ | ------------------------------------------------------------------------ | +| `role_set_key_or_id` | *str* | :heavy_check_mark: | The key or ID of the role set to update | +| `request_body` | [models.UpdateRoleSetRequestBody](../models/updaterolesetrequestbody.md) | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/docs/models/updaterolesetrequestbody.md b/docs/models/updaterolesetrequestbody.md new file mode 100644 index 00000000..8a9d6d76 --- /dev/null +++ b/docs/models/updaterolesetrequestbody.md @@ -0,0 +1,13 @@ +# UpdateRoleSetRequestBody + + +## Fields + +| Field | Type | Required | Description | +| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `name` | *OptionalNullable[str]* | :heavy_minus_sign: | The new name for the role set | +| `key` | *OptionalNullable[str]* | :heavy_minus_sign: | A unique key for the role set. Must start with 'role_set:' and contain only lowercase alphanumeric characters and underscores. | +| `description` | *OptionalNullable[str]* | :heavy_minus_sign: | Optional description for the role set | +| `type` | [OptionalNullable[models.UpdateRoleSetType]](../models/updaterolesettype.md) | :heavy_minus_sign: | Set to "initial" to make this the default role set for new organizations.
Only one role set can be "initial" per instance; setting this will change any existing initial role set to "custom". | +| `default_role_key` | *OptionalNullable[str]* | :heavy_minus_sign: | The key of the role to use as the default role for new organization members.
Must be an existing role in the role set. | +| `creator_role_key` | *OptionalNullable[str]* | :heavy_minus_sign: | The key of the role to assign to organization creators.
Must be an existing role in the role set. | \ No newline at end of file diff --git a/docs/models/updaterolesettype.md b/docs/models/updaterolesettype.md new file mode 100644 index 00000000..773d4b6c --- /dev/null +++ b/docs/models/updaterolesettype.md @@ -0,0 +1,11 @@ +# UpdateRoleSetType + +Set to "initial" to make this the default role set for new organizations. +Only one role set can be "initial" per instance; setting this will change any existing initial role set to "custom". + + +## Values + +| Name | Value | +| --------- | --------- | +| `INITIAL` | initial | \ No newline at end of file diff --git a/docs/models/updateuserrequestbody.md b/docs/models/updateuserrequestbody.md index e7783970..efd2f854 100644 --- a/docs/models/updateuserrequestbody.md +++ b/docs/models/updateuserrequestbody.md @@ -3,32 +3,32 @@ ## Fields -| Field | Type | Required | Description | Example | -| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `external_id` | *OptionalNullable[str]* | :heavy_minus_sign: | The ID of the user as used in your external systems or your previous authentication solution.
Must be unique across your instance. | ext_123 | -| `first_name` | *OptionalNullable[str]* | :heavy_minus_sign: | The first name to assign to the user | Jane | -| `last_name` | *OptionalNullable[str]* | :heavy_minus_sign: | The last name to assign to the user | Doe | -| `locale` | *OptionalNullable[str]* | :heavy_minus_sign: | The locale to assign to the user (e.g., "en-US", "fr-FR") | | -| `primary_email_address_id` | *OptionalNullable[str]* | :heavy_minus_sign: | The ID of the email address to set as primary.
It must be verified, and present on the current user. | eml_12345 | -| `notify_primary_email_address_changed` | *OptionalNullable[bool]* | :heavy_minus_sign: | If set to `true`, the user will be notified that their primary email address has changed.
By default, no notification is sent. | true | -| `primary_phone_number_id` | *OptionalNullable[str]* | :heavy_minus_sign: | The ID of the phone number to set as primary.
It must be verified, and present on the current user. | phn_67890 | -| `primary_web3_wallet_id` | *OptionalNullable[str]* | :heavy_minus_sign: | The ID of the web3 wallets to set as primary.
It must be verified, and present on the current user. | wlt_123 | -| `username` | *OptionalNullable[str]* | :heavy_minus_sign: | The username to give to the user.
It must be unique across your instance. | janedoe | -| `profile_image_id` | *OptionalNullable[str]* | :heavy_minus_sign: | The ID of the image to set as the user's profile image | img_789 | -| `password` | *OptionalNullable[str]* | :heavy_minus_sign: | The plaintext password to give the user.
Must be at least 8 characters long, and cannot be in any list of hacked passwords. | secretPass123! | -| `password_digest` | *Optional[str]* | :heavy_minus_sign: | In case you already have the password digests and not the passwords, you can use them for the newly created user via this property.
The digests should be generated with one of the supported algorithms.
The hashing algorithm can be specified using the `password_hasher` property. | $argon2i$v=19$m=4096,t=3,p=1$4t6CL3P7YiHBtwESXawI8Hm20zJj4cs7/4/G3c187e0$m7RQFczcKr5bIR0IIxbpO2P0tyrLjf3eUW3M3QSwnLc | -| `password_hasher` | *Optional[str]* | :heavy_minus_sign: | The hashing algorithm that was used to generate the password digest.

The algorithms we support at the moment are [`bcrypt`](https://en.wikipedia.org/wiki/Bcrypt), [`bcrypt_sha256_django`](https://docs.djangoproject.com/en/4.0/topics/auth/passwords/), [`md5`](https://en.wikipedia.org/wiki/MD5), `pbkdf2_sha1`, `pbkdf2_sha256`, [`pbkdf2_sha256_django`](https://docs.djangoproject.com/en/4.0/topics/auth/passwords/),
[`phpass`](https://www.openwall.com/phpass/), `md5_phpass`, [`scrypt_firebase`](https://firebaseopensource.com/projects/firebase/scrypt/),
[`scrypt_werkzeug`](https://werkzeug.palletsprojects.com/en/3.0.x/utils/#werkzeug.security.generate_password_hash), [`sha256`](https://en.wikipedia.org/wiki/SHA-2),
[`ldap_ssha`](https://www.openldap.org/faq/data/cache/347.html) and the [`argon2`](https://argon2.online/) variants: `argon2i` and `argon2id`.

Each of the supported hashers expects the incoming digest to be in a particular format. See the [Clerk docs](https://clerk.com/docs/references/backend/user/create-user) for more information. | | -| `skip_password_checks` | *OptionalNullable[bool]* | :heavy_minus_sign: | Set it to `true` if you're updating the user's password and want to skip any password policy settings check. This parameter can only be used when providing a `password`. | false | -| `sign_out_of_other_sessions` | *OptionalNullable[bool]* | :heavy_minus_sign: | Set to `true` to sign out the user from all their active sessions once their password is updated. This parameter can only be used when providing a `password`. | true | -| `totp_secret` | *OptionalNullable[str]* | :heavy_minus_sign: | In case TOTP is configured on the instance, you can provide the secret to enable it on the specific user without the need to reset it.
Please note that currently the supported options are:
* Period: 30 seconds
* Code length: 6 digits
* Algorithm: SHA1 | ABCD1234EFGH5678 | -| `backup_codes` | List[*str*] | :heavy_minus_sign: | If Backup Codes are configured on the instance, you can provide them to enable it on the specific user without the need to reset them.
You must provide the backup codes in plain format or the corresponding bcrypt digest. | [
"123456",
"654321"
] | -| `public_metadata` | Dict[str, *Any*] | :heavy_minus_sign: | Metadata saved on the user, that is visible to both your Frontend and Backend APIs | {
"theme": "dark"
} | -| `private_metadata` | Dict[str, *Any*] | :heavy_minus_sign: | Metadata saved on the user, that is only visible to your Backend API | {
"vip": true
} | -| `unsafe_metadata` | Dict[str, *Any*] | :heavy_minus_sign: | Metadata saved on the user, that can be updated from both the Frontend and Backend APIs.
Note: Since this data can be modified from the frontend, it is not guaranteed to be safe. | {
"age": 30
} | -| `delete_self_enabled` | *OptionalNullable[bool]* | :heavy_minus_sign: | If true, the user can delete themselves with the Frontend API. | true | -| `create_organization_enabled` | *OptionalNullable[bool]* | :heavy_minus_sign: | If true, the user can create organizations with the Frontend API. | false | -| `legal_accepted_at` | *OptionalNullable[str]* | :heavy_minus_sign: | A custom timestamp denoting _when_ the user accepted legal requirements, specified in RFC3339 format (e.g. `2012-10-20T07:15:20.902Z`). | | -| `skip_legal_checks` | *OptionalNullable[bool]* | :heavy_minus_sign: | When set to `true` all legal checks are skipped.
It is not recommended to skip legal checks unless you are migrating a user to Clerk. | | -| `create_organizations_limit` | *OptionalNullable[int]* | :heavy_minus_sign: | The maximum number of organizations the user can create. 0 means unlimited. | | -| `created_at` | *OptionalNullable[str]* | :heavy_minus_sign: | A custom date/time denoting _when_ the user signed up to the application, specified in RFC3339 format (e.g. `2012-10-20T07:15:20.902Z`). | 2021-04-05T14:30:00.000Z | -| `bypass_client_trust` | *OptionalNullable[bool]* | :heavy_minus_sign: | When set to `true`, the user will bypass client trust checks during sign-in. | | \ No newline at end of file +| Field | Type | Required | Description | Example | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `external_id` | *OptionalNullable[str]* | :heavy_minus_sign: | The ID of the user as used in your external systems or your previous authentication solution.
Must be unique across your instance. | ext_123 | +| `first_name` | *OptionalNullable[str]* | :heavy_minus_sign: | The first name to assign to the user | Jane | +| `last_name` | *OptionalNullable[str]* | :heavy_minus_sign: | The last name to assign to the user | Doe | +| `locale` | *OptionalNullable[str]* | :heavy_minus_sign: | The locale to assign to the user (e.g., "en-US", "fr-FR") | | +| `primary_email_address_id` | *OptionalNullable[str]* | :heavy_minus_sign: | The ID of the email address to set as primary.
It must be verified, and present on the current user. | eml_12345 | +| `notify_primary_email_address_changed` | *OptionalNullable[bool]* | :heavy_minus_sign: | If set to `true`, the user will be notified that their primary email address has changed.
By default, no notification is sent. | true | +| `primary_phone_number_id` | *OptionalNullable[str]* | :heavy_minus_sign: | The ID of the phone number to set as primary.
It must be verified, and present on the current user. | phn_67890 | +| `primary_web3_wallet_id` | *OptionalNullable[str]* | :heavy_minus_sign: | The ID of the web3 wallets to set as primary.
It must be verified, and present on the current user. | wlt_123 | +| `username` | *OptionalNullable[str]* | :heavy_minus_sign: | The username to give to the user.
It must be unique across your instance. | janedoe | +| `profile_image_id` | *OptionalNullable[str]* | :heavy_minus_sign: | The ID of the image to set as the user's profile image | img_789 | +| `password` | *OptionalNullable[str]* | :heavy_minus_sign: | The plaintext password to give the user.
Must be at least 8 characters long, and cannot be in any list of hacked passwords. | secretPass123! | +| `password_digest` | *Optional[str]* | :heavy_minus_sign: | In case you already have the password digests and not the passwords, you can use them for the newly created user via this property.
The digests should be generated with one of the supported algorithms.
The hashing algorithm can be specified using the `password_hasher` property. | $argon2i$v=19$m=4096,t=3,p=1$4t6CL3P7YiHBtwESXawI8Hm20zJj4cs7/4/G3c187e0$m7RQFczcKr5bIR0IIxbpO2P0tyrLjf3eUW3M3QSwnLc | +| `password_hasher` | *Optional[str]* | :heavy_minus_sign: | The hashing algorithm that was used to generate the password digest.

The algorithms we support at the moment are [`bcrypt`](https://en.wikipedia.org/wiki/Bcrypt), [`bcrypt_sha256_django`](https://docs.djangoproject.com/en/4.0/topics/auth/passwords/), [`md5`](https://en.wikipedia.org/wiki/MD5), `pbkdf2_sha1`, `pbkdf2_sha256`, [`pbkdf2_sha256_django`](https://docs.djangoproject.com/en/4.0/topics/auth/passwords/),
[`phpass`](https://www.openwall.com/phpass/), `md5_phpass`, [`scrypt_firebase`](https://firebaseopensource.com/projects/firebase/scrypt/),
[`scrypt_werkzeug`](https://werkzeug.palletsprojects.com/en/3.0.x/utils/#werkzeug.security.generate_password_hash), [`sha256`](https://en.wikipedia.org/wiki/SHA-2),
[`ldap_ssha`](https://www.openldap.org/faq/data/cache/347.html), the [`argon2`](https://argon2.online/) variants: `argon2i` and `argon2id`, and `sha512_symfony`, the SHA-512 variant of the [Symfony](https://symfony.com/doc/current/security/passwords.html) legacy hasher.

Each of the supported hashers expects the incoming digest to be in a particular format. See the [Clerk docs](https://clerk.com/docs/references/backend/user/create-user) for more information. | | +| `skip_password_checks` | *OptionalNullable[bool]* | :heavy_minus_sign: | Set it to `true` if you're updating the user's password and want to skip any password policy settings check. This parameter can only be used when providing a `password`. | false | +| `sign_out_of_other_sessions` | *OptionalNullable[bool]* | :heavy_minus_sign: | Set to `true` to sign out the user from all their active sessions once their password is updated. This parameter can only be used when providing a `password`. | true | +| `totp_secret` | *OptionalNullable[str]* | :heavy_minus_sign: | In case TOTP is configured on the instance, you can provide the secret to enable it on the specific user without the need to reset it.
Please note that currently the supported options are:
* Period: 30 seconds
* Code length: 6 digits
* Algorithm: SHA1 | ABCD1234EFGH5678 | +| `backup_codes` | List[*str*] | :heavy_minus_sign: | If Backup Codes are configured on the instance, you can provide them to enable it on the specific user without the need to reset them.
You must provide the backup codes in plain format or the corresponding bcrypt digest. | [
"123456",
"654321"
] | +| `public_metadata` | Dict[str, *Any*] | :heavy_minus_sign: | Metadata saved on the user, that is visible to both your Frontend and Backend APIs | {
"theme": "dark"
} | +| `private_metadata` | Dict[str, *Any*] | :heavy_minus_sign: | Metadata saved on the user, that is only visible to your Backend API | {
"vip": true
} | +| `unsafe_metadata` | Dict[str, *Any*] | :heavy_minus_sign: | Metadata saved on the user, that can be updated from both the Frontend and Backend APIs.
Note: Since this data can be modified from the frontend, it is not guaranteed to be safe. | {
"age": 30
} | +| `delete_self_enabled` | *OptionalNullable[bool]* | :heavy_minus_sign: | If true, the user can delete themselves with the Frontend API. | true | +| `create_organization_enabled` | *OptionalNullable[bool]* | :heavy_minus_sign: | If true, the user can create organizations with the Frontend API. | false | +| `legal_accepted_at` | *OptionalNullable[str]* | :heavy_minus_sign: | A custom timestamp denoting _when_ the user accepted legal requirements, specified in RFC3339 format (e.g. `2012-10-20T07:15:20.902Z`). | | +| `skip_legal_checks` | *OptionalNullable[bool]* | :heavy_minus_sign: | When set to `true` all legal checks are skipped.
It is not recommended to skip legal checks unless you are migrating a user to Clerk. | | +| `create_organizations_limit` | *OptionalNullable[int]* | :heavy_minus_sign: | The maximum number of organizations the user can create. 0 means unlimited. | | +| `created_at` | *OptionalNullable[str]* | :heavy_minus_sign: | A custom date/time denoting _when_ the user signed up to the application, specified in RFC3339 format (e.g. `2012-10-20T07:15:20.902Z`). | 2021-04-05T14:30:00.000Z | +| `bypass_client_trust` | *OptionalNullable[bool]* | :heavy_minus_sign: | When set to `true`, the user will bypass client trust checks during sign-in. | | \ No newline at end of file diff --git a/docs/models/verifyapikeyresponsebody.md b/docs/models/verifyapikeyresponsebody.md index 2a1bc667..56a8cfb5 100644 --- a/docs/models/verifyapikeyresponsebody.md +++ b/docs/models/verifyapikeyresponsebody.md @@ -5,21 +5,21 @@ ## Fields -| Field | Type | Required | Description | Example | -| ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | -| `object` | [models.VerifyAPIKeyObject](../models/verifyapikeyobject.md) | :heavy_check_mark: | N/A | | -| `id` | *str* | :heavy_check_mark: | N/A | ak_3beecc9c60adb5f9b850e91a8ee1e992 | -| `type` | *str* | :heavy_check_mark: | N/A | api_key | -| `subject` | *str* | :heavy_check_mark: | N/A | user_2xhFjEI5X2qWRvtV13BzSj8H6Dk | -| `name` | *str* | :heavy_check_mark: | N/A | MY_SERVICE_API_KEY | -| `description` | *OptionalNullable[str]* | :heavy_minus_sign: | N/A | This is my API Key | -| `claims` | *Nullable[Any]* | :heavy_check_mark: | N/A | {
"foo": "bar"
} | -| `scopes` | List[*str*] | :heavy_check_mark: | N/A | [
"read",
"write"
] | -| `revoked` | *bool* | :heavy_check_mark: | N/A | false | -| `revocation_reason` | *Nullable[str]* | :heavy_check_mark: | N/A | Revoked by user | -| `expired` | *bool* | :heavy_check_mark: | N/A | false | -| `expiration` | *Nullable[float]* | :heavy_check_mark: | N/A | 1716883200 | -| `created_by` | *Nullable[str]* | :heavy_check_mark: | N/A | user_2xhFjEI5X2qWRvtV13BzSj8H6Dk | -| `last_used_at` | *Nullable[float]* | :heavy_check_mark: | N/A | 1716883200 | -| `created_at` | *float* | :heavy_check_mark: | N/A | 1716883200 | -| `updated_at` | *float* | :heavy_check_mark: | N/A | 1716883200 | \ No newline at end of file +| Field | Type | Required | Description | Example | +| -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | +| `object` | [models.VerifyAPIKeyObject](../models/verifyapikeyobject.md) | :heavy_check_mark: | N/A | | +| `id` | *str* | :heavy_check_mark: | N/A | ak_3beecc9c60adb5f9b850e91a8ee1e992 | +| `type` | *str* | :heavy_check_mark: | N/A | api_key | +| `subject` | *str* | :heavy_check_mark: | N/A | user_2xhFjEI5X2qWRvtV13BzSj8H6Dk | +| `name` | *str* | :heavy_check_mark: | N/A | MY_SERVICE_API_KEY | +| `description` | *OptionalNullable[str]* | :heavy_minus_sign: | N/A | This is my API Key | +| `claims` | *Nullable[Any]* | :heavy_check_mark: | N/A | {
"foo": "bar"
} | +| `scopes` | List[*str*] | :heavy_check_mark: | N/A | [
"read",
"write"
] | +| `revoked` | *bool* | :heavy_check_mark: | N/A | false | +| `revocation_reason` | *Nullable[str]* | :heavy_check_mark: | N/A | Revoked by user | +| `expired` | *bool* | :heavy_check_mark: | N/A | false | +| `expiration` | *Nullable[float]* | :heavy_check_mark: | The timestamp for when the API key will expire, in milliseconds | 1716883200 | +| `created_by` | *Nullable[str]* | :heavy_check_mark: | N/A | user_2xhFjEI5X2qWRvtV13BzSj8H6Dk | +| `last_used_at` | *Nullable[float]* | :heavy_check_mark: | The timestamp for when the API key was last used, in milliseconds | 1716883200 | +| `created_at` | *float* | :heavy_check_mark: | The timestamp for when the API key was created, in milliseconds | 1716883200 | +| `updated_at` | *float* | :heavy_check_mark: | The timestamp for when the API key was last updated, in milliseconds | 1716883200 | \ No newline at end of file diff --git a/docs/models/verifym2mtokenresponsebody.md b/docs/models/verifym2mtokenresponsebody.md index 55bfd8d0..41a33706 100644 --- a/docs/models/verifym2mtokenresponsebody.md +++ b/docs/models/verifym2mtokenresponsebody.md @@ -15,7 +15,7 @@ | `revoked` | *bool* | :heavy_check_mark: | N/A | false | | `revocation_reason` | *Nullable[str]* | :heavy_check_mark: | N/A | Revoked by user | | `expired` | *bool* | :heavy_check_mark: | N/A | false | -| `expiration` | *Nullable[float]* | :heavy_check_mark: | N/A | 1716883200 | -| `last_used_at` | *Nullable[float]* | :heavy_check_mark: | N/A | 1716883200 | -| `created_at` | *float* | :heavy_check_mark: | N/A | 1716883200 | -| `updated_at` | *float* | :heavy_check_mark: | N/A | 1716883200 | \ No newline at end of file +| `expiration` | *Nullable[float]* | :heavy_check_mark: | The timestamp for when the token will expire, in milliseconds | 1716883200 | +| `last_used_at` | *Nullable[float]* | :heavy_check_mark: | The timestamp for when the token was last used, in milliseconds | 1716883200 | +| `created_at` | *float* | :heavy_check_mark: | The timestamp for when the token was created, in milliseconds | 1716883200 | +| `updated_at` | *float* | :heavy_check_mark: | The timestamp for when the token was last updated, in milliseconds | 1716883200 | \ No newline at end of file diff --git a/docs/sdks/billing/README.md b/docs/sdks/billing/README.md index 968c02b9..7fdfaac7 100644 --- a/docs/sdks/billing/README.md +++ b/docs/sdks/billing/README.md @@ -8,6 +8,7 @@ * [list_subscription_items](#list_subscription_items) - List all subscription items * [cancel_subscription_item](#cancel_subscription_item) - Cancel a subscription item * [extend_subscription_item_free_trial](#extend_subscription_item_free_trial) - Extend free trial for a subscription item +* [create_price_transition](#create_price_transition) - Create a price transition for a subscription item * [list_statements](#list_statements) - List all billing statements * [get_statement](#get_statement) - Retrieve a billing statement * [get_statement_payment_attempts](#get_statement_payment_attempts) - List payment attempts for a billing statement @@ -196,6 +197,50 @@ with Clerk( | models.ClerkErrors | 500 | application/json | | models.SDKError | 4XX, 5XX | \*/\* | +## create_price_transition + +Creates a price transition for the specified subscription item. +This may create an upcoming subscription item or activate immediately depending on plan and payer rules. + +### Example Usage + + +```python +from clerk_backend_api import Clerk + + +with Clerk( + bearer_auth="", +) as clerk: + + res = clerk.billing.create_price_transition(subscription_item_id="", from_price_id="", to_price_id="") + + # Handle response + print(res) + +``` + +### Parameters + +| Parameter | Type | Required | Description | +| ------------------------------------------------------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------- | +| `subscription_item_id` | *str* | :heavy_check_mark: | The ID of the subscription item to transition | +| `from_price_id` | *str* | :heavy_check_mark: | The current price ID of the subscription item. | +| `to_price_id` | *str* | :heavy_check_mark: | The target price ID to transition to. | +| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.md) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | + +### Response + +**[models.CommercePriceTransitionResponse](../../models/commercepricetransitionresponse.md)** + +### Errors + +| Error Type | Status Code | Content Type | +| ---------------------------- | ---------------------------- | ---------------------------- | +| models.ClerkErrors | 400, 401, 403, 404, 409, 422 | application/json | +| models.ClerkErrors | 500 | application/json | +| models.SDKError | 4XX, 5XX | \*/\* | + ## list_statements Returns a list of all billing statements for the instance. The statements are returned sorted by creation date, diff --git a/docs/sdks/instancesettingssdk/README.md b/docs/sdks/instancesettingssdk/README.md index 49ce0814..aa2a0d04 100644 --- a/docs/sdks/instancesettingssdk/README.md +++ b/docs/sdks/instancesettingssdk/README.md @@ -2,6 +2,8 @@ ## Overview +Modify the settings of your instance. + ### Available Operations * [get](#get) - Fetch the current instance @@ -9,6 +11,8 @@ * [update_restrictions](#update_restrictions) - Update instance restrictions * [change_domain](#change_domain) - Update production instance domain * [update_organization_settings](#update_organization_settings) - Update instance organization settings +* [get_instance_protect](#get_instance_protect) - Get instance protect settings +* [update_instance_protect](#update_instance_protect) - Update instance protect settings ## get @@ -233,4 +237,85 @@ with Clerk( | Error Type | Status Code | Content Type | | ------------------ | ------------------ | ------------------ | | models.ClerkErrors | 400, 402, 404, 422 | application/json | +| models.SDKError | 4XX, 5XX | \*/\* | + +## get_instance_protect + +Get instance protect settings + +### Example Usage + + +```python +from clerk_backend_api import Clerk + + +with Clerk( + bearer_auth="", +) as clerk: + + res = clerk.instance_settings.get_instance_protect() + + # Handle response + print(res) + +``` + +### Parameters + +| Parameter | Type | Required | Description | +| ------------------------------------------------------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------- | +| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.md) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | + +### Response + +**[models.InstanceProtect](../../models/instanceprotect.md)** + +### Errors + +| Error Type | Status Code | Content Type | +| --------------- | --------------- | --------------- | +| models.SDKError | 4XX, 5XX | \*/\* | + +## update_instance_protect + +Update instance protect settings + +### Example Usage + + +```python +from clerk_backend_api import Clerk + + +with Clerk( + bearer_auth="", +) as clerk: + + res = clerk.instance_settings.update_instance_protect(request={ + "rules_enabled": True, + "specter_enabled": True, + }) + + # Handle response + print(res) + +``` + +### Parameters + +| Parameter | Type | Required | Description | +| ------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- | +| `request` | [models.UpdateInstanceProtectRequestBody](../../models/updateinstanceprotectrequestbody.md) | :heavy_check_mark: | The request object to use for the request. | +| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.md) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | + +### Response + +**[models.InstanceProtect](../../models/instanceprotect.md)** + +### Errors + +| Error Type | Status Code | Content Type | +| ------------------ | ------------------ | ------------------ | +| models.ClerkErrors | 422 | application/json | | models.SDKError | 4XX, 5XX | \*/\* | \ No newline at end of file diff --git a/docs/sdks/machines/README.md b/docs/sdks/machines/README.md index e2ae3312..d028c155 100644 --- a/docs/sdks/machines/README.md +++ b/docs/sdks/machines/README.md @@ -315,7 +315,7 @@ with Clerk( ## create_scope Creates a new machine scope, allowing the specified machine to access another machine. -Maximum of 25 scopes per machine. +Maximum of 150 scopes per machine. ### Example Usage diff --git a/docs/sdks/organizationinvitationssdk/README.md b/docs/sdks/organizationinvitationssdk/README.md index 643c2fbb..5cd0f742 100644 --- a/docs/sdks/organizationinvitationssdk/README.md +++ b/docs/sdks/organizationinvitationssdk/README.md @@ -97,7 +97,7 @@ with Clerk( "key": "value", }, private_metadata={ "private_key": "secret_value", - }, redirect_url="https://example.com/welcome", expires_in_days=785754) + }, redirect_url="https://example.com/welcome", expires_in_days=785754, notify=True) # Handle response print(res) @@ -116,6 +116,7 @@ with Clerk( | `private_metadata` | Dict[str, *Any*] | :heavy_minus_sign: | Metadata saved on the organization invitation, fully accessible (read/write) from the Backend API but not visible from the Frontend API.
When the organization invitation is accepted, the metadata will be transferred to the newly created organization membership. | {
"private_key": "secret_value"
} | | `redirect_url` | *OptionalNullable[str]* | :heavy_minus_sign: | Optional URL that the invitee will be redirected to once they accept the invitation by clicking the join link in the invitation email. | https://example.com/welcome | | `expires_in_days` | *OptionalNullable[int]* | :heavy_minus_sign: | The number of days the invitation will be valid for. By default, the invitation has a 30 days expire. | | +| `notify` | *OptionalNullable[bool]* | :heavy_minus_sign: | Optional flag which denotes whether an email invitation should be sent to the given email address.
Defaults to `true`. | | | `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.md) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | | ### Response diff --git a/docs/sdks/organizationssdk/README.md b/docs/sdks/organizationssdk/README.md index bf16e5d3..9b57e848 100644 --- a/docs/sdks/organizationssdk/README.md +++ b/docs/sdks/organizationssdk/README.md @@ -126,7 +126,7 @@ with Clerk( | Error Type | Status Code | Content Type | | ------------------ | ------------------ | ------------------ | -| models.ClerkErrors | 400, 403, 422 | application/json | +| models.ClerkErrors | 400, 402, 403, 422 | application/json | | models.SDKError | 4XX, 5XX | \*/\* | ## get diff --git a/docs/sdks/rolesetssdk/README.md b/docs/sdks/rolesetssdk/README.md new file mode 100644 index 00000000..27434811 --- /dev/null +++ b/docs/sdks/rolesetssdk/README.md @@ -0,0 +1,336 @@ +# RoleSets + +## Overview + +### Available Operations + +* [list](#list) - Get a list of role sets +* [create](#create) - Create a role set +* [get](#get) - Retrieve a role set +* [update](#update) - Update a role set +* [replace](#replace) - Replace a role set +* [add_roles](#add_roles) - Add roles to a role set +* [replace_role](#replace_role) - Replace a role in a role set + +## list + +Returns a list of role sets for the instance. +Results can be paginated using the optional `limit` and `offset` query parameters. +The role sets are ordered by descending creation date by default. + +### Example Usage + + +```python +from clerk_backend_api import Clerk + + +with Clerk( + bearer_auth="", +) as clerk: + + res = clerk.role_sets.list(query="", order_by="-created_at", limit=20, offset=10) + + # Handle response + print(res) + +``` + +### Parameters + +| Parameter | Type | Required | Description | Example | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `query` | *Optional[str]* | :heavy_minus_sign: | Returns role sets with ID, name, or key that match the given query.
Uses exact match for role set ID and partial match for name and key. | | +| `order_by` | *Optional[str]* | :heavy_minus_sign: | Allows to return role sets in a particular order.
At the moment, you can order the returned role sets by their `created_at`, `name`, or `key`.
In order to specify the direction, you can use the `+/-` symbols prepended in the property to order by.
For example, if you want role sets to be returned in descending order according to their `created_at` property, you can use `-created_at`.
If you don't use `+` or `-`, then `+` is implied.
Defaults to `-created_at`. | | +| `limit` | *Optional[int]* | :heavy_minus_sign: | Applies a limit to the number of results returned.
Can be used for paginating the results together with `offset`. | 20 | +| `offset` | *Optional[int]* | :heavy_minus_sign: | Skip the first `offset` results when paginating.
Needs to be an integer greater or equal to zero.
To be used in conjunction with `limit`. | 10 | +| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.md) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | | + +### Response + +**[models.RoleSets](../../models/rolesets.md)** + +### Errors + +| Error Type | Status Code | Content Type | +| ------------------ | ------------------ | ------------------ | +| models.ClerkErrors | 400, 401, 403, 422 | application/json | +| models.SDKError | 4XX, 5XX | \*/\* | + +## create + +Creates a new role set with the given name and roles. +The key must be unique for the instance and start with the 'role_set:' prefix, followed by lowercase alphanumeric characters and underscores only. +You must provide at least one role and specify a default role key and creator role key. + +### Example Usage + + +```python +import clerk_backend_api +from clerk_backend_api import Clerk + + +with Clerk( + bearer_auth="", +) as clerk: + + res = clerk.role_sets.create(name="", default_role_key="", creator_role_key="", roles=[ + "", + ], key="", description="coarse minor like whopping jazz concerning questioningly loose", type_=clerk_backend_api.CreateRoleSetType.CUSTOM) + + # Handle response + print(res) + +``` + +### Parameters + +| Parameter | Type | Required | Description | +| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `name` | *str* | :heavy_check_mark: | The name of the new role set | +| `default_role_key` | *str* | :heavy_check_mark: | The key of the role to use as the default role for new organization members.
Must be one of the roles in the `roles` array. | +| `creator_role_key` | *str* | :heavy_check_mark: | The key of the role to assign to organization creators.
Must be one of the roles in the `roles` array. | +| `roles` | List[*str*] | :heavy_check_mark: | Array of role keys to include in the role set.
Must contain at least one role and no more than 10 roles. | +| `key` | *Optional[str]* | :heavy_minus_sign: | A unique key for the role set. Must start with 'role_set:' and contain only lowercase alphanumeric characters and underscores.
If not provided, a key will be generated from the name. | +| `description` | *OptionalNullable[str]* | :heavy_minus_sign: | Optional description for the role set | +| `type` | [Optional[models.CreateRoleSetType]](../../models/createrolesettype.md) | :heavy_minus_sign: | The type of the role set. "initial" role sets are the default for new organizations.
Only one role set can be "initial" per instance. | +| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.md) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | + +### Response + +**[models.RoleSet](../../models/roleset.md)** + +### Errors + +| Error Type | Status Code | Content Type | +| ---------------------------- | ---------------------------- | ---------------------------- | +| models.ClerkErrors | 400, 401, 402, 403, 404, 422 | application/json | +| models.SDKError | 4XX, 5XX | \*/\* | + +## get + +Retrieves an existing role set by its key or ID. + +### Example Usage + + +```python +from clerk_backend_api import Clerk + + +with Clerk( + bearer_auth="", +) as clerk: + + res = clerk.role_sets.get(role_set_key_or_id="") + + # Handle response + print(res) + +``` + +### Parameters + +| Parameter | Type | Required | Description | +| ------------------------------------------------------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------- | +| `role_set_key_or_id` | *str* | :heavy_check_mark: | The key or ID of the role set | +| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.md) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | + +### Response + +**[models.RoleSet](../../models/roleset.md)** + +### Errors + +| Error Type | Status Code | Content Type | +| ------------------ | ------------------ | ------------------ | +| models.ClerkErrors | 401, 403, 404 | application/json | +| models.SDKError | 4XX, 5XX | \*/\* | + +## update + +Updates an existing role set. +You can update the name, key, description, type, default role, or creator role. +All parameters are optional - you can update only the fields you want to change. + +### Example Usage + + +```python +import clerk_backend_api +from clerk_backend_api import Clerk + + +with Clerk( + bearer_auth="", +) as clerk: + + res = clerk.role_sets.update(role_set_key_or_id="", name="", key=None, description="airbus atop ouch gadzooks anti talkative mould", type_=clerk_backend_api.UpdateRoleSetType.INITIAL, default_role_key="", creator_role_key="") + + # Handle response + print(res) + +``` + +### Parameters + +| Parameter | Type | Required | Description | +| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `role_set_key_or_id` | *str* | :heavy_check_mark: | The key or ID of the role set to update | +| `name` | *OptionalNullable[str]* | :heavy_minus_sign: | The new name for the role set | +| `key` | *OptionalNullable[str]* | :heavy_minus_sign: | A unique key for the role set. Must start with 'role_set:' and contain only lowercase alphanumeric characters and underscores. | +| `description` | *OptionalNullable[str]* | :heavy_minus_sign: | Optional description for the role set | +| `type` | [OptionalNullable[models.UpdateRoleSetType]](../../models/updaterolesettype.md) | :heavy_minus_sign: | Set to "initial" to make this the default role set for new organizations.
Only one role set can be "initial" per instance; setting this will change any existing initial role set to "custom". | +| `default_role_key` | *OptionalNullable[str]* | :heavy_minus_sign: | The key of the role to use as the default role for new organization members.
Must be an existing role in the role set. | +| `creator_role_key` | *OptionalNullable[str]* | :heavy_minus_sign: | The key of the role to assign to organization creators.
Must be an existing role in the role set. | +| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.md) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | + +### Response + +**[models.RoleSet](../../models/roleset.md)** + +### Errors + +| Error Type | Status Code | Content Type | +| ----------------------- | ----------------------- | ----------------------- | +| models.ClerkErrors | 400, 401, 403, 404, 422 | application/json | +| models.SDKError | 4XX, 5XX | \*/\* | + +## replace + +Replaces a role set with another role set. This is functionally equivalent to deleting +the role set but allows for atomic replacement with migration support. +Organizations using this role set will be migrated to the destination role set. + +### Example Usage + + +```python +from clerk_backend_api import Clerk + + +with Clerk( + bearer_auth="", +) as clerk: + + res = clerk.role_sets.replace(role_set_key_or_id="", dest_role_set_key="", reassignment_mappings={ + "key": "", + "key1": "", + "key2": "", + }) + + # Handle response + print(res) + +``` + +### Parameters + +| Parameter | Type | Required | Description | +| ------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- | +| `role_set_key_or_id` | *str* | :heavy_check_mark: | The key or ID of the role set to replace | +| `dest_role_set_key` | *str* | :heavy_check_mark: | The key of the destination role set | +| `reassignment_mappings` | Dict[str, *str*] | :heavy_minus_sign: | Mappings from source role keys to destination role keys.
Required if members have roles that need to be reassigned. | +| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.md) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | + +### Response + +**[models.DeletedObject](../../models/deletedobject.md)** + +### Errors + +| Error Type | Status Code | Content Type | +| ----------------------- | ----------------------- | ----------------------- | +| models.ClerkErrors | 400, 401, 403, 404, 422 | application/json | +| models.SDKError | 4XX, 5XX | \*/\* | + +## add_roles + +Adds one or more roles to an existing role set. +You can optionally update the default role or creator role when adding new roles. + +### Example Usage + + +```python +from clerk_backend_api import Clerk + + +with Clerk( + bearer_auth="", +) as clerk: + + res = clerk.role_sets.add_roles(role_set_key_or_id="", role_keys=[ + "", + "", + ], default_role_key="", creator_role_key="") + + # Handle response + print(res) + +``` + +### Parameters + +| Parameter | Type | Required | Description | +| ---------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | +| `role_set_key_or_id` | *str* | :heavy_check_mark: | The key or ID of the role set | +| `role_keys` | List[*str*] | :heavy_check_mark: | Array of role keys to add to the role set.
Must contain at least one role and no more than 10 roles. | +| `default_role_key` | *Optional[str]* | :heavy_minus_sign: | Optionally update the default role to one of the newly added roles. | +| `creator_role_key` | *Optional[str]* | :heavy_minus_sign: | Optionally update the creator role to one of the newly added roles. | +| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.md) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | + +### Response + +**[models.RoleSet](../../models/roleset.md)** + +### Errors + +| Error Type | Status Code | Content Type | +| ----------------------- | ----------------------- | ----------------------- | +| models.ClerkErrors | 400, 401, 403, 404, 422 | application/json | +| models.SDKError | 4XX, 5XX | \*/\* | + +## replace_role + +Replaces a role in a role set with another role. This atomically removes +the source role and reassigns any members to the destination role. + +### Example Usage + + +```python +from clerk_backend_api import Clerk + + +with Clerk( + bearer_auth="", +) as clerk: + + res = clerk.role_sets.replace_role(role_set_key_or_id="", role_key="", to_role_key="") + + # Handle response + print(res) + +``` + +### Parameters + +| Parameter | Type | Required | Description | +| ------------------------------------------------------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------- | +| `role_set_key_or_id` | *str* | :heavy_check_mark: | The key or ID of the role set | +| `role_key` | *str* | :heavy_check_mark: | The key of the role to remove from the role set | +| `to_role_key` | *str* | :heavy_check_mark: | The key of the role to reassign members to | +| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.md) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | + +### Response + +**[models.RoleSet](../../models/roleset.md)** + +### Errors + +| Error Type | Status Code | Content Type | +| ----------------------- | ----------------------- | ----------------------- | +| models.ClerkErrors | 400, 401, 403, 404, 422 | application/json | +| models.SDKError | 4XX, 5XX | \*/\* | \ No newline at end of file diff --git a/docs/sdks/users/README.md b/docs/sdks/users/README.md index e6bf7e4c..d3e31fbc 100644 --- a/docs/sdks/users/README.md +++ b/docs/sdks/users/README.md @@ -31,6 +31,8 @@ * [delete_web3_wallet](#delete_web3_wallet) - Delete a user web3 wallet * [delete_totp](#delete_totp) - Delete all the user's TOTPs * [delete_external_account](#delete_external_account) - Delete External Account +* [set_password_compromised](#set_password_compromised) - Set a user's password as compromised +* [unset_password_compromised](#unset_password_compromised) - Unset a user's password as compromised * [get_instance_organization_memberships](#get_instance_organization_memberships) - Get a list of all organization memberships within an instance. ## list @@ -147,7 +149,7 @@ with Clerk( "preferences": { "theme": "dark", }, - }, delete_self_enabled=True, legal_accepted_at="", skip_legal_checks=False, create_organization_enabled=None, create_organizations_limit=81560, created_at="2023-03-15T07:15:20.902Z", bypass_client_trust=True) + }, delete_self_enabled=True, legal_accepted_at="", skip_legal_checks=False, skip_user_requirement=True, create_organization_enabled=None, create_organizations_limit=81560, created_at="2023-03-15T07:15:20.902Z", bypass_client_trust=True) # Handle response print(res) @@ -156,34 +158,35 @@ with Clerk( ### Parameters -| Parameter | Type | Required | Description | Example | -| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `external_id` | *OptionalNullable[str]* | :heavy_minus_sign: | The ID of the user as used in your external systems or your previous authentication solution.
Must be unique across your instance. | ext-id-001 | -| `first_name` | *OptionalNullable[str]* | :heavy_minus_sign: | The first name to assign to the user | John | -| `last_name` | *OptionalNullable[str]* | :heavy_minus_sign: | The last name to assign to the user | Doe | -| `locale` | *OptionalNullable[str]* | :heavy_minus_sign: | The locale to assign to the user (e.g., "en-US", "fr-FR") | | -| `email_address` | List[*str*] | :heavy_minus_sign: | Email addresses to add to the user.
Must be unique across your instance.
The first email address will be set as the user's primary email address. | | -| `phone_number` | List[*str*] | :heavy_minus_sign: | Phone numbers to add to the user.
Must be unique across your instance.
The first phone number will be set as the user's primary phone number. | | -| `web3_wallet` | List[*str*] | :heavy_minus_sign: | Web3 wallets to add to the user.
Must be unique across your instance.
The first wallet will be set as the user's primary wallet. | | -| `username` | *OptionalNullable[str]* | :heavy_minus_sign: | The username to give to the user.
It must be unique across your instance. | johndoe123 | -| `password` | *OptionalNullable[str]* | :heavy_minus_sign: | The plaintext password to give the user.
Must be at least 8 characters long, and cannot be in any list of hacked passwords. | Secure*Pass4 | -| `password_digest` | *OptionalNullable[str]* | :heavy_minus_sign: | In case you already have the password digests and not the passwords, you can use them for the newly created user via this property.
The digests should be generated with one of the supported algorithms.
The hashing algorithm can be specified using the `password_hasher` property. | $argon2i$v=19$m=4096,t=3,p=1$4t6CL3P7YiHBtwESXawI8Hm20zJj4cs7/4/G3c187e0$m7RQFczcKr5bIR0IIxbpO2P0tyrLjf3eUW3M3QSwnLc | -| `password_hasher` | *Optional[str]* | :heavy_minus_sign: | The hashing algorithm that was used to generate the password digest.

The algorithms we support at the moment are [`bcrypt`](https://en.wikipedia.org/wiki/Bcrypt), [`bcrypt_sha256_django`](https://docs.djangoproject.com/en/4.0/topics/auth/passwords/), [`md5`](https://en.wikipedia.org/wiki/MD5), `pbkdf2_sha1`, `pbkdf2_sha256`, [`pbkdf2_sha256_django`](https://docs.djangoproject.com/en/4.0/topics/auth/passwords/),
[`phpass`](https://www.openwall.com/phpass/), `md5_phpass`, [`scrypt_firebase`](https://firebaseopensource.com/projects/firebase/scrypt/),
[`scrypt_werkzeug`](https://werkzeug.palletsprojects.com/en/3.0.x/utils/#werkzeug.security.generate_password_hash), [`sha256`](https://en.wikipedia.org/wiki/SHA-2),
[`ldap_ssha`](https://www.openldap.org/faq/data/cache/347.html) and the [`argon2`](https://argon2.online/) variants: `argon2i` and `argon2id`.

Each of the supported hashers expects the incoming digest to be in a particular format. See the [Clerk docs](https://clerk.com/docs/references/backend/user/create-user) for more information. | | -| `skip_password_checks` | *OptionalNullable[bool]* | :heavy_minus_sign: | When set to `true` all password checks are skipped.
It is recommended to use this method only when migrating plaintext passwords to Clerk.
Upon migration the user base should be prompted to pick stronger password. | false | -| `skip_password_requirement` | *OptionalNullable[bool]* | :heavy_minus_sign: | When set to `true`, `password` is not required anymore when creating the user and can be omitted.
This is useful when you are trying to create a user that doesn't have a password, in an instance that is using passwords.
Please note that you cannot use this flag if password is the only way for a user to sign into your instance. | false | -| `totp_secret` | *OptionalNullable[str]* | :heavy_minus_sign: | In case TOTP is configured on the instance, you can provide the secret to enable it on the newly created user without the need to reset it.
Please note that currently the supported options are:
* Period: 30 seconds
* Code length: 6 digits
* Algorithm: SHA1 | base32totpsecretkey | -| `backup_codes` | List[*str*] | :heavy_minus_sign: | If Backup Codes are configured on the instance, you can provide them to enable it on the newly created user without the need to reset them.
You must provide the backup codes in plain format or the corresponding bcrypt digest. | [
"123456",
"654321"
] | -| `public_metadata` | Dict[str, *Any*] | :heavy_minus_sign: | Metadata saved on the user, that is visible to both your Frontend and Backend APIs | {
"role": "user"
} | -| `private_metadata` | Dict[str, *Any*] | :heavy_minus_sign: | Metadata saved on the user, that is only visible to your Backend API | {
"internal_id": "789"
} | -| `unsafe_metadata` | Dict[str, *Any*] | :heavy_minus_sign: | Metadata saved on the user, that can be updated from both the Frontend and Backend APIs.
Note: Since this data can be modified from the frontend, it is not guaranteed to be safe. | {
"preferences": {
"theme": "dark"
}
} | -| `delete_self_enabled` | *OptionalNullable[bool]* | :heavy_minus_sign: | If enabled, user can delete themselves via FAPI.
| | -| `legal_accepted_at` | *OptionalNullable[str]* | :heavy_minus_sign: | A custom timestamp denoting _when_ the user accepted legal requirements, specified in RFC3339 format (e.g. `2012-10-20T07:15:20.902Z`). | | -| `skip_legal_checks` | *OptionalNullable[bool]* | :heavy_minus_sign: | When set to `true` all legal checks are skipped.
It is not recommended to skip legal checks unless you are migrating a user to Clerk. | | -| `create_organization_enabled` | *OptionalNullable[bool]* | :heavy_minus_sign: | If enabled, user can create organizations via FAPI.
| | -| `create_organizations_limit` | *OptionalNullable[int]* | :heavy_minus_sign: | The maximum number of organizations the user can create. 0 means unlimited.
| | -| `created_at` | *OptionalNullable[str]* | :heavy_minus_sign: | A custom date/time denoting _when_ the user signed up to the application, specified in RFC3339 format (e.g. `2012-10-20T07:15:20.902Z`). | 2023-03-15T07:15:20.902Z | -| `bypass_client_trust` | *OptionalNullable[bool]* | :heavy_minus_sign: | When set to `true`, the user will bypass client trust checks during sign-in. | | -| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.md) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | | +| Parameter | Type | Required | Description | Example | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `external_id` | *OptionalNullable[str]* | :heavy_minus_sign: | The ID of the user as used in your external systems or your previous authentication solution.
Must be unique across your instance. | ext-id-001 | +| `first_name` | *OptionalNullable[str]* | :heavy_minus_sign: | The first name to assign to the user | John | +| `last_name` | *OptionalNullable[str]* | :heavy_minus_sign: | The last name to assign to the user | Doe | +| `locale` | *OptionalNullable[str]* | :heavy_minus_sign: | The locale to assign to the user (e.g., "en-US", "fr-FR") | | +| `email_address` | List[*str*] | :heavy_minus_sign: | Email addresses to add to the user.
Must be unique across your instance.
The first email address will be set as the user's primary email address. | | +| `phone_number` | List[*str*] | :heavy_minus_sign: | Phone numbers to add to the user.
Must be unique across your instance.
The first phone number will be set as the user's primary phone number. | | +| `web3_wallet` | List[*str*] | :heavy_minus_sign: | Web3 wallets to add to the user.
Must be unique across your instance.
The first wallet will be set as the user's primary wallet. | | +| `username` | *OptionalNullable[str]* | :heavy_minus_sign: | The username to give to the user.
It must be unique across your instance. | johndoe123 | +| `password` | *OptionalNullable[str]* | :heavy_minus_sign: | The plaintext password to give the user.
Must be at least 8 characters long, and cannot be in any list of hacked passwords. | Secure*Pass4 | +| `password_digest` | *OptionalNullable[str]* | :heavy_minus_sign: | In case you already have the password digests and not the passwords, you can use them for the newly created user via this property.
The digests should be generated with one of the supported algorithms.
The hashing algorithm can be specified using the `password_hasher` property. | $argon2i$v=19$m=4096,t=3,p=1$4t6CL3P7YiHBtwESXawI8Hm20zJj4cs7/4/G3c187e0$m7RQFczcKr5bIR0IIxbpO2P0tyrLjf3eUW3M3QSwnLc | +| `password_hasher` | *Optional[str]* | :heavy_minus_sign: | The hashing algorithm that was used to generate the password digest.

The algorithms we support at the moment are [`bcrypt`](https://en.wikipedia.org/wiki/Bcrypt), [`bcrypt_sha256_django`](https://docs.djangoproject.com/en/4.0/topics/auth/passwords/), [`md5`](https://en.wikipedia.org/wiki/MD5), `pbkdf2_sha1`, `pbkdf2_sha256`, [`pbkdf2_sha256_django`](https://docs.djangoproject.com/en/4.0/topics/auth/passwords/),
[`phpass`](https://www.openwall.com/phpass/), `md5_phpass`, [`scrypt_firebase`](https://firebaseopensource.com/projects/firebase/scrypt/),
[`scrypt_werkzeug`](https://werkzeug.palletsprojects.com/en/3.0.x/utils/#werkzeug.security.generate_password_hash), [`sha256`](https://en.wikipedia.org/wiki/SHA-2),
[`ldap_ssha`](https://www.openldap.org/faq/data/cache/347.html), the [`argon2`](https://argon2.online/) variants: `argon2i` and `argon2id`, and `sha512_symfony`, the SHA-512 variant of the [Symfony](https://symfony.com/doc/current/security/passwords.html) legacy hasher.

Each of the supported hashers expects the incoming digest to be in a particular format. See the [Clerk docs](https://clerk.com/docs/references/backend/user/create-user) for more information. | | +| `skip_password_checks` | *OptionalNullable[bool]* | :heavy_minus_sign: | When set to `true` all password checks are skipped.
It is recommended to use this method only when migrating plaintext passwords to Clerk.
Upon migration the user base should be prompted to pick stronger password. | false | +| `skip_password_requirement` | *OptionalNullable[bool]* | :heavy_minus_sign: | When set to `true`, `password` is not required anymore when creating the user and can be omitted.
This is useful when you are trying to create a user that doesn't have a password, in an instance that is using passwords.
Please note that you cannot use this flag if password is the only way for a user to sign into your instance. | false | +| `totp_secret` | *OptionalNullable[str]* | :heavy_minus_sign: | In case TOTP is configured on the instance, you can provide the secret to enable it on the newly created user without the need to reset it.
Please note that currently the supported options are:
* Period: 30 seconds
* Code length: 6 digits
* Algorithm: SHA1 | base32totpsecretkey | +| `backup_codes` | List[*str*] | :heavy_minus_sign: | If Backup Codes are configured on the instance, you can provide them to enable it on the newly created user without the need to reset them.
You must provide the backup codes in plain format or the corresponding bcrypt digest. | [
"123456",
"654321"
] | +| `public_metadata` | Dict[str, *Any*] | :heavy_minus_sign: | Metadata saved on the user, that is visible to both your Frontend and Backend APIs | {
"role": "user"
} | +| `private_metadata` | Dict[str, *Any*] | :heavy_minus_sign: | Metadata saved on the user, that is only visible to your Backend API | {
"internal_id": "789"
} | +| `unsafe_metadata` | Dict[str, *Any*] | :heavy_minus_sign: | Metadata saved on the user, that can be updated from both the Frontend and Backend APIs.
Note: Since this data can be modified from the frontend, it is not guaranteed to be safe. | {
"preferences": {
"theme": "dark"
}
} | +| `delete_self_enabled` | *OptionalNullable[bool]* | :heavy_minus_sign: | If enabled, user can delete themselves via FAPI.
| | +| `legal_accepted_at` | *OptionalNullable[str]* | :heavy_minus_sign: | A custom timestamp denoting _when_ the user accepted legal requirements, specified in RFC3339 format (e.g. `2012-10-20T07:15:20.902Z`). | | +| `skip_legal_checks` | *OptionalNullable[bool]* | :heavy_minus_sign: | When set to `true` all legal checks are skipped.
It is not recommended to skip legal checks unless you are migrating a user to Clerk. | | +| `skip_user_requirement` | *OptionalNullable[bool]* | :heavy_minus_sign: | When set to `true`, identification types are not enforced.
At least one identification type must be enabled and provided on your instance (email, phone, web3 wallet, or username).
Users created without required identification types cannot use those authentication strategies
It is not recommended to use this flag unless you need to allow Clerk UI components to prompt for required fields while BAPI creates users with minimal data, or for migration a user to Clerk. | | +| `create_organization_enabled` | *OptionalNullable[bool]* | :heavy_minus_sign: | If enabled, user can create organizations via FAPI.
| | +| `create_organizations_limit` | *OptionalNullable[int]* | :heavy_minus_sign: | The maximum number of organizations the user can create. 0 means unlimited.
| | +| `created_at` | *OptionalNullable[str]* | :heavy_minus_sign: | A custom date/time denoting _when_ the user signed up to the application, specified in RFC3339 format (e.g. `2012-10-20T07:15:20.902Z`). | 2023-03-15T07:15:20.902Z | +| `bypass_client_trust` | *OptionalNullable[bool]* | :heavy_minus_sign: | When set to `true`, the user will bypass client trust checks during sign-in. | | +| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.md) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | | ### Response @@ -351,37 +354,37 @@ with Clerk( ### Parameters -| Parameter | Type | Required | Description | Example | -| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `user_id` | *str* | :heavy_check_mark: | The ID of the user to update | usr_1 | -| `external_id` | *OptionalNullable[str]* | :heavy_minus_sign: | The ID of the user as used in your external systems or your previous authentication solution.
Must be unique across your instance. | ext_123 | -| `first_name` | *OptionalNullable[str]* | :heavy_minus_sign: | The first name to assign to the user | Jane | -| `last_name` | *OptionalNullable[str]* | :heavy_minus_sign: | The last name to assign to the user | Doe | -| `locale` | *OptionalNullable[str]* | :heavy_minus_sign: | The locale to assign to the user (e.g., "en-US", "fr-FR") | | -| `primary_email_address_id` | *OptionalNullable[str]* | :heavy_minus_sign: | The ID of the email address to set as primary.
It must be verified, and present on the current user. | eml_12345 | -| `notify_primary_email_address_changed` | *OptionalNullable[bool]* | :heavy_minus_sign: | If set to `true`, the user will be notified that their primary email address has changed.
By default, no notification is sent. | true | -| `primary_phone_number_id` | *OptionalNullable[str]* | :heavy_minus_sign: | The ID of the phone number to set as primary.
It must be verified, and present on the current user. | phn_67890 | -| `primary_web3_wallet_id` | *OptionalNullable[str]* | :heavy_minus_sign: | The ID of the web3 wallets to set as primary.
It must be verified, and present on the current user. | wlt_123 | -| `username` | *OptionalNullable[str]* | :heavy_minus_sign: | The username to give to the user.
It must be unique across your instance. | janedoe | -| `profile_image_id` | *OptionalNullable[str]* | :heavy_minus_sign: | The ID of the image to set as the user's profile image | img_789 | -| `password` | *OptionalNullable[str]* | :heavy_minus_sign: | The plaintext password to give the user.
Must be at least 8 characters long, and cannot be in any list of hacked passwords. | secretPass123! | -| `password_digest` | *Optional[str]* | :heavy_minus_sign: | In case you already have the password digests and not the passwords, you can use them for the newly created user via this property.
The digests should be generated with one of the supported algorithms.
The hashing algorithm can be specified using the `password_hasher` property. | $argon2i$v=19$m=4096,t=3,p=1$4t6CL3P7YiHBtwESXawI8Hm20zJj4cs7/4/G3c187e0$m7RQFczcKr5bIR0IIxbpO2P0tyrLjf3eUW3M3QSwnLc | -| `password_hasher` | *Optional[str]* | :heavy_minus_sign: | The hashing algorithm that was used to generate the password digest.

The algorithms we support at the moment are [`bcrypt`](https://en.wikipedia.org/wiki/Bcrypt), [`bcrypt_sha256_django`](https://docs.djangoproject.com/en/4.0/topics/auth/passwords/), [`md5`](https://en.wikipedia.org/wiki/MD5), `pbkdf2_sha1`, `pbkdf2_sha256`, [`pbkdf2_sha256_django`](https://docs.djangoproject.com/en/4.0/topics/auth/passwords/),
[`phpass`](https://www.openwall.com/phpass/), `md5_phpass`, [`scrypt_firebase`](https://firebaseopensource.com/projects/firebase/scrypt/),
[`scrypt_werkzeug`](https://werkzeug.palletsprojects.com/en/3.0.x/utils/#werkzeug.security.generate_password_hash), [`sha256`](https://en.wikipedia.org/wiki/SHA-2),
[`ldap_ssha`](https://www.openldap.org/faq/data/cache/347.html) and the [`argon2`](https://argon2.online/) variants: `argon2i` and `argon2id`.

Each of the supported hashers expects the incoming digest to be in a particular format. See the [Clerk docs](https://clerk.com/docs/references/backend/user/create-user) for more information. | | -| `skip_password_checks` | *OptionalNullable[bool]* | :heavy_minus_sign: | Set it to `true` if you're updating the user's password and want to skip any password policy settings check. This parameter can only be used when providing a `password`. | false | -| `sign_out_of_other_sessions` | *OptionalNullable[bool]* | :heavy_minus_sign: | Set to `true` to sign out the user from all their active sessions once their password is updated. This parameter can only be used when providing a `password`. | true | -| `totp_secret` | *OptionalNullable[str]* | :heavy_minus_sign: | In case TOTP is configured on the instance, you can provide the secret to enable it on the specific user without the need to reset it.
Please note that currently the supported options are:
* Period: 30 seconds
* Code length: 6 digits
* Algorithm: SHA1 | ABCD1234EFGH5678 | -| `backup_codes` | List[*str*] | :heavy_minus_sign: | If Backup Codes are configured on the instance, you can provide them to enable it on the specific user without the need to reset them.
You must provide the backup codes in plain format or the corresponding bcrypt digest. | [
"123456",
"654321"
] | -| `public_metadata` | Dict[str, *Any*] | :heavy_minus_sign: | Metadata saved on the user, that is visible to both your Frontend and Backend APIs | {
"theme": "dark"
} | -| `private_metadata` | Dict[str, *Any*] | :heavy_minus_sign: | Metadata saved on the user, that is only visible to your Backend API | {
"vip": true
} | -| `unsafe_metadata` | Dict[str, *Any*] | :heavy_minus_sign: | Metadata saved on the user, that can be updated from both the Frontend and Backend APIs.
Note: Since this data can be modified from the frontend, it is not guaranteed to be safe. | {
"age": 30
} | -| `delete_self_enabled` | *OptionalNullable[bool]* | :heavy_minus_sign: | If true, the user can delete themselves with the Frontend API. | true | -| `create_organization_enabled` | *OptionalNullable[bool]* | :heavy_minus_sign: | If true, the user can create organizations with the Frontend API. | false | -| `legal_accepted_at` | *OptionalNullable[str]* | :heavy_minus_sign: | A custom timestamp denoting _when_ the user accepted legal requirements, specified in RFC3339 format (e.g. `2012-10-20T07:15:20.902Z`). | | -| `skip_legal_checks` | *OptionalNullable[bool]* | :heavy_minus_sign: | When set to `true` all legal checks are skipped.
It is not recommended to skip legal checks unless you are migrating a user to Clerk. | | -| `create_organizations_limit` | *OptionalNullable[int]* | :heavy_minus_sign: | The maximum number of organizations the user can create. 0 means unlimited. | | -| `created_at` | *OptionalNullable[str]* | :heavy_minus_sign: | A custom date/time denoting _when_ the user signed up to the application, specified in RFC3339 format (e.g. `2012-10-20T07:15:20.902Z`). | 2021-04-05T14:30:00.000Z | -| `bypass_client_trust` | *OptionalNullable[bool]* | :heavy_minus_sign: | When set to `true`, the user will bypass client trust checks during sign-in. | | -| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.md) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | | +| Parameter | Type | Required | Description | Example | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `user_id` | *str* | :heavy_check_mark: | The ID of the user to update | usr_1 | +| `external_id` | *OptionalNullable[str]* | :heavy_minus_sign: | The ID of the user as used in your external systems or your previous authentication solution.
Must be unique across your instance. | ext_123 | +| `first_name` | *OptionalNullable[str]* | :heavy_minus_sign: | The first name to assign to the user | Jane | +| `last_name` | *OptionalNullable[str]* | :heavy_minus_sign: | The last name to assign to the user | Doe | +| `locale` | *OptionalNullable[str]* | :heavy_minus_sign: | The locale to assign to the user (e.g., "en-US", "fr-FR") | | +| `primary_email_address_id` | *OptionalNullable[str]* | :heavy_minus_sign: | The ID of the email address to set as primary.
It must be verified, and present on the current user. | eml_12345 | +| `notify_primary_email_address_changed` | *OptionalNullable[bool]* | :heavy_minus_sign: | If set to `true`, the user will be notified that their primary email address has changed.
By default, no notification is sent. | true | +| `primary_phone_number_id` | *OptionalNullable[str]* | :heavy_minus_sign: | The ID of the phone number to set as primary.
It must be verified, and present on the current user. | phn_67890 | +| `primary_web3_wallet_id` | *OptionalNullable[str]* | :heavy_minus_sign: | The ID of the web3 wallets to set as primary.
It must be verified, and present on the current user. | wlt_123 | +| `username` | *OptionalNullable[str]* | :heavy_minus_sign: | The username to give to the user.
It must be unique across your instance. | janedoe | +| `profile_image_id` | *OptionalNullable[str]* | :heavy_minus_sign: | The ID of the image to set as the user's profile image | img_789 | +| `password` | *OptionalNullable[str]* | :heavy_minus_sign: | The plaintext password to give the user.
Must be at least 8 characters long, and cannot be in any list of hacked passwords. | secretPass123! | +| `password_digest` | *Optional[str]* | :heavy_minus_sign: | In case you already have the password digests and not the passwords, you can use them for the newly created user via this property.
The digests should be generated with one of the supported algorithms.
The hashing algorithm can be specified using the `password_hasher` property. | $argon2i$v=19$m=4096,t=3,p=1$4t6CL3P7YiHBtwESXawI8Hm20zJj4cs7/4/G3c187e0$m7RQFczcKr5bIR0IIxbpO2P0tyrLjf3eUW3M3QSwnLc | +| `password_hasher` | *Optional[str]* | :heavy_minus_sign: | The hashing algorithm that was used to generate the password digest.

The algorithms we support at the moment are [`bcrypt`](https://en.wikipedia.org/wiki/Bcrypt), [`bcrypt_sha256_django`](https://docs.djangoproject.com/en/4.0/topics/auth/passwords/), [`md5`](https://en.wikipedia.org/wiki/MD5), `pbkdf2_sha1`, `pbkdf2_sha256`, [`pbkdf2_sha256_django`](https://docs.djangoproject.com/en/4.0/topics/auth/passwords/),
[`phpass`](https://www.openwall.com/phpass/), `md5_phpass`, [`scrypt_firebase`](https://firebaseopensource.com/projects/firebase/scrypt/),
[`scrypt_werkzeug`](https://werkzeug.palletsprojects.com/en/3.0.x/utils/#werkzeug.security.generate_password_hash), [`sha256`](https://en.wikipedia.org/wiki/SHA-2),
[`ldap_ssha`](https://www.openldap.org/faq/data/cache/347.html), the [`argon2`](https://argon2.online/) variants: `argon2i` and `argon2id`, and `sha512_symfony`, the SHA-512 variant of the [Symfony](https://symfony.com/doc/current/security/passwords.html) legacy hasher.

Each of the supported hashers expects the incoming digest to be in a particular format. See the [Clerk docs](https://clerk.com/docs/references/backend/user/create-user) for more information. | | +| `skip_password_checks` | *OptionalNullable[bool]* | :heavy_minus_sign: | Set it to `true` if you're updating the user's password and want to skip any password policy settings check. This parameter can only be used when providing a `password`. | false | +| `sign_out_of_other_sessions` | *OptionalNullable[bool]* | :heavy_minus_sign: | Set to `true` to sign out the user from all their active sessions once their password is updated. This parameter can only be used when providing a `password`. | true | +| `totp_secret` | *OptionalNullable[str]* | :heavy_minus_sign: | In case TOTP is configured on the instance, you can provide the secret to enable it on the specific user without the need to reset it.
Please note that currently the supported options are:
* Period: 30 seconds
* Code length: 6 digits
* Algorithm: SHA1 | ABCD1234EFGH5678 | +| `backup_codes` | List[*str*] | :heavy_minus_sign: | If Backup Codes are configured on the instance, you can provide them to enable it on the specific user without the need to reset them.
You must provide the backup codes in plain format or the corresponding bcrypt digest. | [
"123456",
"654321"
] | +| `public_metadata` | Dict[str, *Any*] | :heavy_minus_sign: | Metadata saved on the user, that is visible to both your Frontend and Backend APIs | {
"theme": "dark"
} | +| `private_metadata` | Dict[str, *Any*] | :heavy_minus_sign: | Metadata saved on the user, that is only visible to your Backend API | {
"vip": true
} | +| `unsafe_metadata` | Dict[str, *Any*] | :heavy_minus_sign: | Metadata saved on the user, that can be updated from both the Frontend and Backend APIs.
Note: Since this data can be modified from the frontend, it is not guaranteed to be safe. | {
"age": 30
} | +| `delete_self_enabled` | *OptionalNullable[bool]* | :heavy_minus_sign: | If true, the user can delete themselves with the Frontend API. | true | +| `create_organization_enabled` | *OptionalNullable[bool]* | :heavy_minus_sign: | If true, the user can create organizations with the Frontend API. | false | +| `legal_accepted_at` | *OptionalNullable[str]* | :heavy_minus_sign: | A custom timestamp denoting _when_ the user accepted legal requirements, specified in RFC3339 format (e.g. `2012-10-20T07:15:20.902Z`). | | +| `skip_legal_checks` | *OptionalNullable[bool]* | :heavy_minus_sign: | When set to `true` all legal checks are skipped.
It is not recommended to skip legal checks unless you are migrating a user to Clerk. | | +| `create_organizations_limit` | *OptionalNullable[int]* | :heavy_minus_sign: | The maximum number of organizations the user can create. 0 means unlimited. | | +| `created_at` | *OptionalNullable[str]* | :heavy_minus_sign: | A custom date/time denoting _when_ the user signed up to the application, specified in RFC3339 format (e.g. `2012-10-20T07:15:20.902Z`). | 2021-04-05T14:30:00.000Z | +| `bypass_client_trust` | *OptionalNullable[bool]* | :heavy_minus_sign: | When set to `true`, the user will bypass client trust checks during sign-in. | | +| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.md) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | | ### Response @@ -1334,6 +1337,87 @@ with Clerk( | models.ClerkErrors | 500 | application/json | | models.SDKError | 4XX, 5XX | \*/\* | +## set_password_compromised + +Sets the given user's password as compromised. The user will be prompted to reset their password on their next sign-in. + +### Example Usage + + +```python +from clerk_backend_api import Clerk + + +with Clerk( + bearer_auth="", +) as clerk: + + res = clerk.users.set_password_compromised(user_id="", revoke_all_sessions=False) + + # Handle response + print(res) + +``` + +### Parameters + +| Parameter | Type | Required | Description | +| ------------------------------------------------------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------- | +| `user_id` | *str* | :heavy_check_mark: | The ID of the user to set the password as compromised | +| `revoke_all_sessions` | *OptionalNullable[bool]* | :heavy_minus_sign: | N/A | +| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.md) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | + +### Response + +**[models.User](../../models/user.md)** + +### Errors + +| Error Type | Status Code | Content Type | +| ----------------------- | ----------------------- | ----------------------- | +| models.ClerkErrors | 400, 401, 403, 404, 422 | application/json | +| models.SDKError | 4XX, 5XX | \*/\* | + +## unset_password_compromised + +Sets the given user's password as no longer compromised. The user will no longer be prompted to reset their password on their next sign-in. + +### Example Usage + + +```python +from clerk_backend_api import Clerk + + +with Clerk( + bearer_auth="", +) as clerk: + + res = clerk.users.unset_password_compromised(user_id="") + + # Handle response + print(res) + +``` + +### Parameters + +| Parameter | Type | Required | Description | +| ------------------------------------------------------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------- | +| `user_id` | *str* | :heavy_check_mark: | The ID of the user to unset the compromised status for | +| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.md) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | + +### Response + +**[models.User](../../models/user.md)** + +### Errors + +| Error Type | Status Code | Content Type | +| ----------------------- | ----------------------- | ----------------------- | +| models.ClerkErrors | 400, 401, 403, 404, 422 | application/json | +| models.SDKError | 4XX, 5XX | \*/\* | + ## get_instance_organization_memberships Retrieves all organization user memberships for the given instance. diff --git a/pyproject.toml b/pyproject.toml index 978f22cd..a43bd66f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [project] name = "clerk-backend-api" -version = "4.2.0" +version = "4.2.1" description = "Python Client SDK for clerk.dev" authors = [{ name = "Clerk" },] readme = "README-PYPI.md" diff --git a/src/clerk_backend_api/_version.py b/src/clerk_backend_api/_version.py index 58ad7898..902b307a 100644 --- a/src/clerk_backend_api/_version.py +++ b/src/clerk_backend_api/_version.py @@ -3,10 +3,10 @@ import importlib.metadata __title__: str = "clerk-backend-api" -__version__: str = "4.2.0" +__version__: str = "4.2.1" __openapi_doc_version__: str = "2025-11-10" -__gen_version__: str = "2.779.2" -__user_agent__: str = "speakeasy-sdk/python 4.2.0 2.779.2 2025-11-10 clerk-backend-api" +__gen_version__: str = "2.801.2" +__user_agent__: str = "speakeasy-sdk/python 4.2.1 2.801.2 2025-11-10 clerk-backend-api" try: if __package__ is not None: diff --git a/src/clerk_backend_api/basesdk.py b/src/clerk_backend_api/basesdk.py index fb9028f4..eb488183 100644 --- a/src/clerk_backend_api/basesdk.py +++ b/src/clerk_backend_api/basesdk.py @@ -7,7 +7,12 @@ AfterSuccessContext, BeforeRequestContext, ) -from clerk_backend_api.utils import RetryConfig, SerializedRequestBody, get_body_content +from clerk_backend_api.utils import ( + RetryConfig, + SerializedRequestBody, + get_body_content, + run_sync_in_thread, +) import httpx from typing import Callable, List, Mapping, Optional, Tuple from urllib.parse import parse_qs, urlparse @@ -311,7 +316,10 @@ async def do_request_async( async def do(): http_res = None try: - req = hooks.before_request(BeforeRequestContext(hook_ctx), request) + req = await run_sync_in_thread( + hooks.before_request, BeforeRequestContext(hook_ctx), request + ) + logger.debug( "Request:\nMethod: %s\nURL: %s\nHeaders: %s\nBody: %s", req.method, @@ -325,7 +333,10 @@ async def do(): http_res = await client.send(req, stream=stream) except Exception as e: - _, e = hooks.after_error(AfterErrorContext(hook_ctx), None, e) + _, e = await run_sync_in_thread( + hooks.after_error, AfterErrorContext(hook_ctx), None, e + ) + if e is not None: logger.debug("Request Exception", exc_info=True) raise e @@ -343,9 +354,10 @@ async def do(): ) if utils.match_status_codes(error_status_codes, http_res.status_code): - result, err = hooks.after_error( - AfterErrorContext(hook_ctx), http_res, None + result, err = await run_sync_in_thread( + hooks.after_error, AfterErrorContext(hook_ctx), http_res, None ) + if err is not None: logger.debug("Request Exception", exc_info=True) raise err @@ -365,6 +377,8 @@ async def do(): http_res = await do() if not utils.match_status_codes(error_status_codes, http_res.status_code): - http_res = hooks.after_success(AfterSuccessContext(hook_ctx), http_res) + http_res = await run_sync_in_thread( + hooks.after_success, AfterSuccessContext(hook_ctx), http_res + ) return http_res diff --git a/src/clerk_backend_api/billing.py b/src/clerk_backend_api/billing.py index 129a0013..c8c42c86 100644 --- a/src/clerk_backend_api/billing.py +++ b/src/clerk_backend_api/billing.py @@ -896,6 +896,252 @@ async def extend_subscription_item_free_trial_async( raise models.SDKError("Unexpected response received", http_res) + def create_price_transition( + self, + *, + subscription_item_id: str, + from_price_id: str, + to_price_id: str, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> models.CommercePriceTransitionResponse: + r"""Create a price transition for a subscription item + + Creates a price transition for the specified subscription item. + This may create an upcoming subscription item or activate immediately depending on plan and payer rules. + + :param subscription_item_id: The ID of the subscription item to transition + :param from_price_id: The current price ID of the subscription item. + :param to_price_id: The target price ID to transition to. + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = models.CreateBillingPriceTransitionRequest( + subscription_item_id=subscription_item_id, + price_transition_request=models.PriceTransitionRequest( + from_price_id=from_price_id, + to_price_id=to_price_id, + ), + ) + + req = self._build_request( + method="POST", + path="/billing/subscription_items/{subscription_item_id}/price_transition", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=True, + request_has_path_params=True, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + security=self.sdk_configuration.security, + get_serialized_body=lambda: utils.serialize_request_body( + request.price_transition_request, + False, + False, + "json", + models.PriceTransitionRequest, + ), + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = self.do_request( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="CreateBillingPriceTransition", + oauth2_scopes=None, + security_source=self.sdk_configuration.security, + ), + request=req, + error_status_codes=[ + "400", + "401", + "403", + "404", + "409", + "422", + "4XX", + "500", + "5XX", + ], + retry_config=retry_config, + ) + + response_data: Any = None + if utils.match_response(http_res, "200", "application/json"): + return unmarshal_json_response( + models.CommercePriceTransitionResponse, http_res + ) + if utils.match_response( + http_res, ["400", "401", "403", "404", "409", "422"], "application/json" + ): + response_data = unmarshal_json_response(models.ClerkErrorsData, http_res) + raise models.ClerkErrors(response_data, http_res) + if utils.match_response(http_res, "500", "application/json"): + response_data = unmarshal_json_response(models.ClerkErrorsData, http_res) + raise models.ClerkErrors(response_data, http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise models.SDKError("API error occurred", http_res, http_res_text) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise models.SDKError("API error occurred", http_res, http_res_text) + + raise models.SDKError("Unexpected response received", http_res) + + async def create_price_transition_async( + self, + *, + subscription_item_id: str, + from_price_id: str, + to_price_id: str, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> models.CommercePriceTransitionResponse: + r"""Create a price transition for a subscription item + + Creates a price transition for the specified subscription item. + This may create an upcoming subscription item or activate immediately depending on plan and payer rules. + + :param subscription_item_id: The ID of the subscription item to transition + :param from_price_id: The current price ID of the subscription item. + :param to_price_id: The target price ID to transition to. + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = models.CreateBillingPriceTransitionRequest( + subscription_item_id=subscription_item_id, + price_transition_request=models.PriceTransitionRequest( + from_price_id=from_price_id, + to_price_id=to_price_id, + ), + ) + + req = self._build_request_async( + method="POST", + path="/billing/subscription_items/{subscription_item_id}/price_transition", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=True, + request_has_path_params=True, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + security=self.sdk_configuration.security, + get_serialized_body=lambda: utils.serialize_request_body( + request.price_transition_request, + False, + False, + "json", + models.PriceTransitionRequest, + ), + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = await self.do_request_async( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="CreateBillingPriceTransition", + oauth2_scopes=None, + security_source=self.sdk_configuration.security, + ), + request=req, + error_status_codes=[ + "400", + "401", + "403", + "404", + "409", + "422", + "4XX", + "500", + "5XX", + ], + retry_config=retry_config, + ) + + response_data: Any = None + if utils.match_response(http_res, "200", "application/json"): + return unmarshal_json_response( + models.CommercePriceTransitionResponse, http_res + ) + if utils.match_response( + http_res, ["400", "401", "403", "404", "409", "422"], "application/json" + ): + response_data = unmarshal_json_response(models.ClerkErrorsData, http_res) + raise models.ClerkErrors(response_data, http_res) + if utils.match_response(http_res, "500", "application/json"): + response_data = unmarshal_json_response(models.ClerkErrorsData, http_res) + raise models.ClerkErrors(response_data, http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise models.SDKError("API error occurred", http_res, http_res_text) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise models.SDKError("API error occurred", http_res, http_res_text) + + raise models.SDKError("Unexpected response received", http_res) + def list_statements( self, *, diff --git a/src/clerk_backend_api/instancesettings_sdk.py b/src/clerk_backend_api/instancesettings_sdk.py index 3e7391c8..9a864e4c 100644 --- a/src/clerk_backend_api/instancesettings_sdk.py +++ b/src/clerk_backend_api/instancesettings_sdk.py @@ -9,6 +9,8 @@ class InstanceSettingsSDK(BaseSDK): + r"""Modify the settings of your instance.""" + def get( self, *, @@ -1010,3 +1012,361 @@ async def update_organization_settings_async( raise models.SDKError("API error occurred", http_res, http_res_text) raise models.SDKError("Unexpected response received", http_res) + + def get_instance_protect( + self, + *, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> models.InstanceProtect: + r"""Get instance protect settings + + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + req = self._build_request( + method="GET", + path="/instance/protect", + base_url=base_url, + url_variables=url_variables, + request=None, + request_body_required=False, + request_has_path_params=False, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + security=self.sdk_configuration.security, + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = self.do_request( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="GetInstanceProtect", + oauth2_scopes=None, + security_source=self.sdk_configuration.security, + ), + request=req, + error_status_codes=["4XX", "5XX"], + retry_config=retry_config, + ) + + if utils.match_response(http_res, "200", "application/json"): + return unmarshal_json_response(models.InstanceProtect, http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise models.SDKError("API error occurred", http_res, http_res_text) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise models.SDKError("API error occurred", http_res, http_res_text) + + raise models.SDKError("Unexpected response received", http_res) + + async def get_instance_protect_async( + self, + *, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> models.InstanceProtect: + r"""Get instance protect settings + + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + req = self._build_request_async( + method="GET", + path="/instance/protect", + base_url=base_url, + url_variables=url_variables, + request=None, + request_body_required=False, + request_has_path_params=False, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + security=self.sdk_configuration.security, + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = await self.do_request_async( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="GetInstanceProtect", + oauth2_scopes=None, + security_source=self.sdk_configuration.security, + ), + request=req, + error_status_codes=["4XX", "5XX"], + retry_config=retry_config, + ) + + if utils.match_response(http_res, "200", "application/json"): + return unmarshal_json_response(models.InstanceProtect, http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise models.SDKError("API error occurred", http_res, http_res_text) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise models.SDKError("API error occurred", http_res, http_res_text) + + raise models.SDKError("Unexpected response received", http_res) + + def update_instance_protect( + self, + *, + request: Optional[ + Union[ + models.UpdateInstanceProtectRequestBody, + models.UpdateInstanceProtectRequestBodyTypedDict, + ] + ] = None, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> models.InstanceProtect: + r"""Update instance protect settings + + :param request: The request object to send. + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + if not isinstance(request, BaseModel): + request = utils.unmarshal( + request, Optional[models.UpdateInstanceProtectRequestBody] + ) + request = cast(Optional[models.UpdateInstanceProtectRequestBody], request) + + req = self._build_request( + method="PATCH", + path="/instance/protect", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=False, + request_has_path_params=False, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + security=self.sdk_configuration.security, + get_serialized_body=lambda: utils.serialize_request_body( + request, + False, + True, + "json", + Optional[models.UpdateInstanceProtectRequestBody], + ), + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = self.do_request( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="UpdateInstanceProtect", + oauth2_scopes=None, + security_source=self.sdk_configuration.security, + ), + request=req, + error_status_codes=["422", "4XX", "5XX"], + retry_config=retry_config, + ) + + response_data: Any = None + if utils.match_response(http_res, "200", "application/json"): + return unmarshal_json_response(models.InstanceProtect, http_res) + if utils.match_response(http_res, "422", "application/json"): + response_data = unmarshal_json_response(models.ClerkErrorsData, http_res) + raise models.ClerkErrors(response_data, http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise models.SDKError("API error occurred", http_res, http_res_text) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise models.SDKError("API error occurred", http_res, http_res_text) + + raise models.SDKError("Unexpected response received", http_res) + + async def update_instance_protect_async( + self, + *, + request: Optional[ + Union[ + models.UpdateInstanceProtectRequestBody, + models.UpdateInstanceProtectRequestBodyTypedDict, + ] + ] = None, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> models.InstanceProtect: + r"""Update instance protect settings + + :param request: The request object to send. + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + if not isinstance(request, BaseModel): + request = utils.unmarshal( + request, Optional[models.UpdateInstanceProtectRequestBody] + ) + request = cast(Optional[models.UpdateInstanceProtectRequestBody], request) + + req = self._build_request_async( + method="PATCH", + path="/instance/protect", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=False, + request_has_path_params=False, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + security=self.sdk_configuration.security, + get_serialized_body=lambda: utils.serialize_request_body( + request, + False, + True, + "json", + Optional[models.UpdateInstanceProtectRequestBody], + ), + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = await self.do_request_async( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="UpdateInstanceProtect", + oauth2_scopes=None, + security_source=self.sdk_configuration.security, + ), + request=req, + error_status_codes=["422", "4XX", "5XX"], + retry_config=retry_config, + ) + + response_data: Any = None + if utils.match_response(http_res, "200", "application/json"): + return unmarshal_json_response(models.InstanceProtect, http_res) + if utils.match_response(http_res, "422", "application/json"): + response_data = unmarshal_json_response(models.ClerkErrorsData, http_res) + raise models.ClerkErrors(response_data, http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise models.SDKError("API error occurred", http_res, http_res_text) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise models.SDKError("API error occurred", http_res, http_res_text) + + raise models.SDKError("Unexpected response received", http_res) diff --git a/src/clerk_backend_api/machines.py b/src/clerk_backend_api/machines.py index ac484761..4c9d6154 100644 --- a/src/clerk_backend_api/machines.py +++ b/src/clerk_backend_api/machines.py @@ -1432,7 +1432,7 @@ def create_scope( r"""Create a machine scope Creates a new machine scope, allowing the specified machine to access another machine. - Maximum of 25 scopes per machine. + Maximum of 150 scopes per machine. :param machine_id: The ID of the machine that will have access to another machine :param to_machine_id: The ID of the machine that will be scoped to the current machine @@ -1537,7 +1537,7 @@ async def create_scope_async( r"""Create a machine scope Creates a new machine scope, allowing the specified machine to access another machine. - Maximum of 25 scopes per machine. + Maximum of 150 scopes per machine. :param machine_id: The ID of the machine that will have access to another machine :param to_machine_id: The ID of the machine that will be scoped to the current machine diff --git a/src/clerk_backend_api/models/__init__.py b/src/clerk_backend_api/models/__init__.py index 36b2913c..b2051549 100644 --- a/src/clerk_backend_api/models/__init__.py +++ b/src/clerk_backend_api/models/__init__.py @@ -16,6 +16,12 @@ ActorTokenTypedDict, ) from .adddomainop import AddDomainRequestBody, AddDomainRequestBodyTypedDict + from .addrolestorolesetop import ( + AddRolesToRoleSetRequest, + AddRolesToRoleSetRequestBody, + AddRolesToRoleSetRequestBodyTypedDict, + AddRolesToRoleSetRequestTypedDict, + ) from .allowlistidentifier import ( AllowlistIdentifier, AllowlistIdentifierObject, @@ -100,6 +106,24 @@ CommercePlanObject, CommercePlanTypedDict, ) + from .commercepriceresponse import ( + CommercePriceResponse, + CommercePriceResponseObject, + CommercePriceResponseTypedDict, + ) + from .commercepricetransitiondetails import ( + CommercePriceTransitionDetails, + CommercePriceTransitionDetailsTypedDict, + EffectiveMode, + ImmediateCharge, + ImmediateChargeTypedDict, + PreviousSubscriptionItemStatus, + ) + from .commercepricetransitionresponse import ( + CommercePriceTransitionResponse, + CommercePriceTransitionResponseObject, + CommercePriceTransitionResponseTypedDict, + ) from .commercesubscription import ( CommerceSubscription, CommerceSubscriptionObject, @@ -160,6 +184,10 @@ Errors, ErrorsTypedDict, ) + from .createbillingpricetransitionop import ( + CreateBillingPriceTransitionRequest, + CreateBillingPriceTransitionRequestTypedDict, + ) from .createblocklistidentifierop import ( CreateBlocklistIdentifierRequestBody, CreateBlocklistIdentifierRequestBodyTypedDict, @@ -257,6 +285,11 @@ CreateRedirectURLRequestBody, CreateRedirectURLRequestBodyTypedDict, ) + from .createrolesetop import ( + CreateRoleSetRequestBody, + CreateRoleSetRequestBodyTypedDict, + CreateRoleSetType, + ) from .createsamlconnectionop import ( CreateSAMLConnectionRequestBody, CreateSAMLConnectionRequestBodyAttributeMapping, @@ -681,6 +714,7 @@ GetPublicInterstitialRequestTypedDict, ) from .getredirecturlop import GetRedirectURLRequest, GetRedirectURLRequestTypedDict + from .getrolesetop import GetRoleSetRequest, GetRoleSetRequestTypedDict from .getsamlconnectionop import ( GetSAMLConnectionRequest, GetSAMLConnectionRequestTypedDict, @@ -715,6 +749,11 @@ InstanceGetOrganizationMembershipsRequest, InstanceGetOrganizationMembershipsRequestTypedDict, ) + from .instanceprotect import ( + InstanceProtect, + InstanceProtectObject, + InstanceProtectTypedDict, + ) from .instancerestrictions import ( InstanceRestrictions, InstanceRestrictionsObject, @@ -813,6 +852,7 @@ ListRedirectURLsRequest, ListRedirectURLsRequestTypedDict, ) + from .listrolesetsop import ListRoleSetsRequest, ListRoleSetsRequestTypedDict from .listsamlconnectionsop import ( ListSAMLConnectionsRequest, ListSAMLConnectionsRequestTypedDict, @@ -997,6 +1037,10 @@ PreviewTemplateResponseBody, PreviewTemplateResponseBodyTypedDict, ) + from .pricetransitionrequest import ( + PriceTransitionRequest, + PriceTransitionRequestTypedDict, + ) from .proxycheck import ProxyCheck, ProxyCheckObject, ProxyCheckTypedDict from .redirecturl import RedirectURL, RedirectURLObject, RedirectURLTypedDict from .refreshsessionop import ( @@ -1014,6 +1058,18 @@ RemovePermissionFromOrganizationRoleRequest, RemovePermissionFromOrganizationRoleRequestTypedDict, ) + from .replaceroleinrolesetop import ( + ReplaceRoleInRoleSetRequest, + ReplaceRoleInRoleSetRequestBody, + ReplaceRoleInRoleSetRequestBodyTypedDict, + ReplaceRoleInRoleSetRequestTypedDict, + ) + from .replacerolesetop import ( + ReplaceRoleSetRequest, + ReplaceRoleSetRequestBody, + ReplaceRoleSetRequestBodyTypedDict, + ReplaceRoleSetRequestTypedDict, + ) from .responsevalidationerror import ResponseValidationError from .reverttemplateop import ( RevertTemplatePathParamTemplateType, @@ -1075,6 +1131,23 @@ ) from .role import Role, RoleObject, RoleTypedDict from .roles import Roles, RolesTypedDict + from .roleset import ( + CreatorRole, + CreatorRoleTypedDict, + DefaultRole, + DefaultRoleTypedDict, + RoleSet, + RoleSetCreatorRoleObject, + RoleSetDefaultRoleObject, + RoleSetMigration, + RoleSetMigrationTypedDict, + RoleSetObject, + RoleSetRoleSetMigrationObject, + RoleSetTypedDict, + Type, + ) + from .rolesetitem import RoleSetItem, RoleSetItemObject, RoleSetItemTypedDict + from .rolesets import RoleSets, RoleSetsTypedDict from .rotatemachinesecretkeyop import ( RotateMachineSecretKeyRequest, RotateMachineSecretKeyRequestBody, @@ -1121,6 +1194,11 @@ SAMLConnectionAttributeMappingTypedDict, ) from .samlconnections import SAMLConnections, SAMLConnectionsTypedDict + from .schemas_commerceplan import ( + SchemasCommercePlan, + SchemasCommercePlanObject, + SchemasCommercePlanTypedDict, + ) from .schemas_commercesubscriptionitem import ( Credit, CreditTypedDict, @@ -1186,6 +1264,12 @@ ) from .sessionrefresh import SessionRefresh, SessionRefreshTypedDict from .sessiontask import SessionTask, SessionTaskTypedDict + from .setuserpasswordcompromisedop import ( + SetUserPasswordCompromisedRequest, + SetUserPasswordCompromisedRequestBody, + SetUserPasswordCompromisedRequestBodyTypedDict, + SetUserPasswordCompromisedRequestTypedDict, + ) from .setuserprofileimageop import ( File, FileTypedDict, @@ -1233,6 +1317,10 @@ from .totalcount import TotalCount, TotalCountObject, TotalCountTypedDict from .unbanuserop import UnbanUserRequest, UnbanUserRequestTypedDict from .unlockuserop import UnlockUserRequest, UnlockUserRequestTypedDict + from .unsetuserpasswordcompromisedop import ( + UnsetUserPasswordCompromisedRequest, + UnsetUserPasswordCompromisedRequestTypedDict, + ) from .updateapikeyop import ( UpdateAPIKeyAPIKeysErrors, UpdateAPIKeyAPIKeysErrorsTypedDict, @@ -1274,6 +1362,10 @@ UpdateInstanceOrganizationSettingsRequestBody, UpdateInstanceOrganizationSettingsRequestBodyTypedDict, ) + from .updateinstanceprotectop import ( + UpdateInstanceProtectRequestBody, + UpdateInstanceProtectRequestBodyTypedDict, + ) from .updateinstancerestrictionsop import ( UpdateInstanceRestrictionsRequestBody, UpdateInstanceRestrictionsRequestBodyTypedDict, @@ -1344,6 +1436,13 @@ UpdateProductionInstanceDomainRequestBody, UpdateProductionInstanceDomainRequestBodyTypedDict, ) + from .updaterolesetop import ( + UpdateRoleSetRequest, + UpdateRoleSetRequestBody, + UpdateRoleSetRequestBodyTypedDict, + UpdateRoleSetRequestTypedDict, + UpdateRoleSetType, + ) from .updatesamlconnectionop import ( AttributeMapping, AttributeMappingTypedDict, @@ -1519,6 +1618,10 @@ "ActorTypedDict", "AddDomainRequestBody", "AddDomainRequestBodyTypedDict", + "AddRolesToRoleSetRequest", + "AddRolesToRoleSetRequestBody", + "AddRolesToRoleSetRequestBodyTypedDict", + "AddRolesToRoleSetRequestTypedDict", "Admin", "AdminTypedDict", "AllowlistIdentifier", @@ -1593,6 +1696,14 @@ "CommercePlan", "CommercePlanObject", "CommercePlanTypedDict", + "CommercePriceResponse", + "CommercePriceResponseObject", + "CommercePriceResponseTypedDict", + "CommercePriceTransitionDetails", + "CommercePriceTransitionDetailsTypedDict", + "CommercePriceTransitionResponse", + "CommercePriceTransitionResponseObject", + "CommercePriceTransitionResponseTypedDict", "CommerceSubscription", "CommerceSubscriptionCreditResponse", "CommerceSubscriptionCreditResponseTypedDict", @@ -1632,6 +1743,8 @@ "CreateActorTokenRequestBodyTypedDict", "CreateAllowlistIdentifierRequestBody", "CreateAllowlistIdentifierRequestBodyTypedDict", + "CreateBillingPriceTransitionRequest", + "CreateBillingPriceTransitionRequestTypedDict", "CreateBlocklistIdentifierRequestBody", "CreateBlocklistIdentifierRequestBodyTypedDict", "CreateBulkInvitationsTemplateSlug", @@ -1690,6 +1803,9 @@ "CreatePhoneNumberRequestBodyTypedDict", "CreateRedirectURLRequestBody", "CreateRedirectURLRequestBodyTypedDict", + "CreateRoleSetRequestBody", + "CreateRoleSetRequestBodyTypedDict", + "CreateRoleSetType", "CreateSAMLConnectionRequestBody", "CreateSAMLConnectionRequestBodyAttributeMapping", "CreateSAMLConnectionRequestBodyAttributeMappingTypedDict", @@ -1716,10 +1832,14 @@ "CreateUserRequestBodyTypedDict", "CreateWaitlistEntryRequestBody", "CreateWaitlistEntryRequestBodyTypedDict", + "CreatorRole", + "CreatorRoleTypedDict", "Credit", "CreditTypedDict", "Data", "DataTypedDict", + "DefaultRole", + "DefaultRoleTypedDict", "DeleteAPIKeyAPIKeysErrors", "DeleteAPIKeyAPIKeysErrorsTypedDict", "DeleteAPIKeyAPIKeysResponseBody", @@ -1795,6 +1915,7 @@ "Domains", "DomainsEnrollmentModes", "DomainsTypedDict", + "EffectiveMode", "EmailAddress", "EmailAddressObject", "EmailAddressTypedDict", @@ -1939,6 +2060,8 @@ "GetPublicInterstitialRequestTypedDict", "GetRedirectURLRequest", "GetRedirectURLRequestTypedDict", + "GetRoleSetRequest", + "GetRoleSetRequestTypedDict", "GetSAMLConnectionRequest", "GetSAMLConnectionRequestTypedDict", "GetSessionListRequest", @@ -1966,11 +2089,16 @@ "IdentificationLink", "IdentificationLinkTypedDict", "IdentifierType", + "ImmediateCharge", + "ImmediateChargeTypedDict", "IncludeInvalid", "Instance", "InstanceGetOrganizationMembershipsRequest", "InstanceGetOrganizationMembershipsRequestTypedDict", "InstanceObject", + "InstanceProtect", + "InstanceProtectObject", + "InstanceProtectTypedDict", "InstanceRestrictions", "InstanceRestrictionsObject", "InstanceRestrictionsTypedDict", @@ -2032,6 +2160,8 @@ "ListPendingOrganizationInvitationsRequestTypedDict", "ListRedirectURLsRequest", "ListRedirectURLsRequestTypedDict", + "ListRoleSetsRequest", + "ListRoleSetsRequestTypedDict", "ListSAMLConnectionsRequest", "ListSAMLConnectionsRequestTypedDict", "ListWaitlistEntriesQueryParamStatus", @@ -2180,6 +2310,9 @@ "PreviewTemplateRequestTypedDict", "PreviewTemplateResponseBody", "PreviewTemplateResponseBodyTypedDict", + "PreviousSubscriptionItemStatus", + "PriceTransitionRequest", + "PriceTransitionRequestTypedDict", "Protocol", "Provider", "ProxyCheck", @@ -2201,6 +2334,14 @@ "RejectWaitlistEntryRequestTypedDict", "RemovePermissionFromOrganizationRoleRequest", "RemovePermissionFromOrganizationRoleRequestTypedDict", + "ReplaceRoleInRoleSetRequest", + "ReplaceRoleInRoleSetRequestBody", + "ReplaceRoleInRoleSetRequestBodyTypedDict", + "ReplaceRoleInRoleSetRequestTypedDict", + "ReplaceRoleSetRequest", + "ReplaceRoleSetRequestBody", + "ReplaceRoleSetRequestBodyTypedDict", + "ReplaceRoleSetRequestTypedDict", "RequestBody", "RequestBody1", "RequestBody1TypedDict", @@ -2263,6 +2404,19 @@ "RevokeSignInTokenRequestTypedDict", "Role", "RoleObject", + "RoleSet", + "RoleSetCreatorRoleObject", + "RoleSetDefaultRoleObject", + "RoleSetItem", + "RoleSetItemObject", + "RoleSetItemTypedDict", + "RoleSetMigration", + "RoleSetMigrationTypedDict", + "RoleSetObject", + "RoleSetRoleSetMigrationObject", + "RoleSetTypedDict", + "RoleSets", + "RoleSetsTypedDict", "RoleTypedDict", "Roles", "RolesTypedDict", @@ -2292,6 +2446,9 @@ "SamlConnection", "SamlConnectionTypedDict", "SamlTypedDict", + "SchemasCommercePlan", + "SchemasCommercePlanObject", + "SchemasCommercePlanTypedDict", "SchemasCommerceSubscriptionItem", "SchemasCommerceSubscriptionItemAmount", "SchemasCommerceSubscriptionItemAmountTypedDict", @@ -2331,6 +2488,10 @@ "SessionTask", "SessionTaskTypedDict", "SessionTypedDict", + "SetUserPasswordCompromisedRequest", + "SetUserPasswordCompromisedRequestBody", + "SetUserPasswordCompromisedRequestBodyTypedDict", + "SetUserPasswordCompromisedRequestTypedDict", "SetUserProfileImageRequest", "SetUserProfileImageRequestBody", "SetUserProfileImageRequestBodyTypedDict", @@ -2380,10 +2541,13 @@ "TotalsTypedDict", "Two", "TwoTypedDict", + "Type", "UnbanUserRequest", "UnbanUserRequestTypedDict", "UnlockUserRequest", "UnlockUserRequestTypedDict", + "UnsetUserPasswordCompromisedRequest", + "UnsetUserPasswordCompromisedRequestTypedDict", "UpdateAPIKeyAPIKeysErrors", "UpdateAPIKeyAPIKeysErrorsTypedDict", "UpdateAPIKeyAPIKeysResponseBody", @@ -2411,6 +2575,8 @@ "UpdateInstanceAuthConfigRequestBodyTypedDict", "UpdateInstanceOrganizationSettingsRequestBody", "UpdateInstanceOrganizationSettingsRequestBodyTypedDict", + "UpdateInstanceProtectRequestBody", + "UpdateInstanceProtectRequestBodyTypedDict", "UpdateInstanceRequestBody", "UpdateInstanceRequestBodyTypedDict", "UpdateInstanceRestrictionsRequestBody", @@ -2459,6 +2625,11 @@ "UpdatePhoneNumberRequestTypedDict", "UpdateProductionInstanceDomainRequestBody", "UpdateProductionInstanceDomainRequestBodyTypedDict", + "UpdateRoleSetRequest", + "UpdateRoleSetRequestBody", + "UpdateRoleSetRequestBodyTypedDict", + "UpdateRoleSetRequestTypedDict", + "UpdateRoleSetType", "UpdateSAMLConnectionRequest", "UpdateSAMLConnectionRequestBody", "UpdateSAMLConnectionRequestBodyTypedDict", @@ -2679,6 +2850,10 @@ "ActorTokenTypedDict": ".actortoken", "AddDomainRequestBody": ".adddomainop", "AddDomainRequestBodyTypedDict": ".adddomainop", + "AddRolesToRoleSetRequest": ".addrolestorolesetop", + "AddRolesToRoleSetRequestBody": ".addrolestorolesetop", + "AddRolesToRoleSetRequestBodyTypedDict": ".addrolestorolesetop", + "AddRolesToRoleSetRequestTypedDict": ".addrolestorolesetop", "AllowlistIdentifier": ".allowlistidentifier", "AllowlistIdentifierObject": ".allowlistidentifier", "AllowlistIdentifierTypedDict": ".allowlistidentifier", @@ -2744,6 +2919,18 @@ "CommercePlan": ".commerceplan", "CommercePlanObject": ".commerceplan", "CommercePlanTypedDict": ".commerceplan", + "CommercePriceResponse": ".commercepriceresponse", + "CommercePriceResponseObject": ".commercepriceresponse", + "CommercePriceResponseTypedDict": ".commercepriceresponse", + "CommercePriceTransitionDetails": ".commercepricetransitiondetails", + "CommercePriceTransitionDetailsTypedDict": ".commercepricetransitiondetails", + "EffectiveMode": ".commercepricetransitiondetails", + "ImmediateCharge": ".commercepricetransitiondetails", + "ImmediateChargeTypedDict": ".commercepricetransitiondetails", + "PreviousSubscriptionItemStatus": ".commercepricetransitiondetails", + "CommercePriceTransitionResponse": ".commercepricetransitionresponse", + "CommercePriceTransitionResponseObject": ".commercepricetransitionresponse", + "CommercePriceTransitionResponseTypedDict": ".commercepricetransitionresponse", "CommerceSubscription": ".commercesubscription", "CommerceSubscriptionObject": ".commercesubscription", "CommerceSubscriptionStatus": ".commercesubscription", @@ -2792,6 +2979,8 @@ "CreateAPIKeyResponseBodyTypedDict": ".createapikeyop", "Errors": ".createapikeyop", "ErrorsTypedDict": ".createapikeyop", + "CreateBillingPriceTransitionRequest": ".createbillingpricetransitionop", + "CreateBillingPriceTransitionRequestTypedDict": ".createbillingpricetransitionop", "CreateBlocklistIdentifierRequestBody": ".createblocklistidentifierop", "CreateBlocklistIdentifierRequestBodyTypedDict": ".createblocklistidentifierop", "CreateBulkInvitationsTemplateSlug": ".createbulkinvitationsop", @@ -2853,6 +3042,9 @@ "CreatePhoneNumberRequestBodyTypedDict": ".createphonenumberop", "CreateRedirectURLRequestBody": ".createredirecturlop", "CreateRedirectURLRequestBodyTypedDict": ".createredirecturlop", + "CreateRoleSetRequestBody": ".createrolesetop", + "CreateRoleSetRequestBodyTypedDict": ".createrolesetop", + "CreateRoleSetType": ".createrolesetop", "CreateSAMLConnectionRequestBody": ".createsamlconnectionop", "CreateSAMLConnectionRequestBodyAttributeMapping": ".createsamlconnectionop", "CreateSAMLConnectionRequestBodyAttributeMappingTypedDict": ".createsamlconnectionop", @@ -3185,6 +3377,8 @@ "GetPublicInterstitialRequestTypedDict": ".getpublicinterstitialop", "GetRedirectURLRequest": ".getredirecturlop", "GetRedirectURLRequestTypedDict": ".getredirecturlop", + "GetRoleSetRequest": ".getrolesetop", + "GetRoleSetRequestTypedDict": ".getrolesetop", "GetSAMLConnectionRequest": ".getsamlconnectionop", "GetSAMLConnectionRequestTypedDict": ".getsamlconnectionop", "GetSessionListRequest": ".getsessionlistop", @@ -3215,6 +3409,9 @@ "InstanceTypedDict": ".instance", "InstanceGetOrganizationMembershipsRequest": ".instancegetorganizationmembershipsop", "InstanceGetOrganizationMembershipsRequestTypedDict": ".instancegetorganizationmembershipsop", + "InstanceProtect": ".instanceprotect", + "InstanceProtectObject": ".instanceprotect", + "InstanceProtectTypedDict": ".instanceprotect", "InstanceRestrictions": ".instancerestrictions", "InstanceRestrictionsObject": ".instancerestrictions", "InstanceRestrictionsTypedDict": ".instancerestrictions", @@ -3277,6 +3474,8 @@ "ListPendingOrganizationInvitationsRequestTypedDict": ".listpendingorganizationinvitationsop", "ListRedirectURLsRequest": ".listredirecturlsop", "ListRedirectURLsRequestTypedDict": ".listredirecturlsop", + "ListRoleSetsRequest": ".listrolesetsop", + "ListRoleSetsRequestTypedDict": ".listrolesetsop", "ListSAMLConnectionsRequest": ".listsamlconnectionsop", "ListSAMLConnectionsRequestTypedDict": ".listsamlconnectionsop", "ListWaitlistEntriesQueryParamStatus": ".listwaitlistentriesop", @@ -3415,6 +3614,8 @@ "PreviewTemplateRequestTypedDict": ".previewtemplateop", "PreviewTemplateResponseBody": ".previewtemplateop", "PreviewTemplateResponseBodyTypedDict": ".previewtemplateop", + "PriceTransitionRequest": ".pricetransitionrequest", + "PriceTransitionRequestTypedDict": ".pricetransitionrequest", "ProxyCheck": ".proxycheck", "ProxyCheckObject": ".proxycheck", "ProxyCheckTypedDict": ".proxycheck", @@ -3430,6 +3631,14 @@ "RejectWaitlistEntryRequestTypedDict": ".rejectwaitlistentryop", "RemovePermissionFromOrganizationRoleRequest": ".removepermissionfromorganizationroleop", "RemovePermissionFromOrganizationRoleRequestTypedDict": ".removepermissionfromorganizationroleop", + "ReplaceRoleInRoleSetRequest": ".replaceroleinrolesetop", + "ReplaceRoleInRoleSetRequestBody": ".replaceroleinrolesetop", + "ReplaceRoleInRoleSetRequestBodyTypedDict": ".replaceroleinrolesetop", + "ReplaceRoleInRoleSetRequestTypedDict": ".replaceroleinrolesetop", + "ReplaceRoleSetRequest": ".replacerolesetop", + "ReplaceRoleSetRequestBody": ".replacerolesetop", + "ReplaceRoleSetRequestBodyTypedDict": ".replacerolesetop", + "ReplaceRoleSetRequestTypedDict": ".replacerolesetop", "ResponseValidationError": ".responsevalidationerror", "RevertTemplatePathParamTemplateType": ".reverttemplateop", "RevertTemplateRequest": ".reverttemplateop", @@ -3481,6 +3690,24 @@ "RoleTypedDict": ".role", "Roles": ".roles", "RolesTypedDict": ".roles", + "CreatorRole": ".roleset", + "CreatorRoleTypedDict": ".roleset", + "DefaultRole": ".roleset", + "DefaultRoleTypedDict": ".roleset", + "RoleSet": ".roleset", + "RoleSetCreatorRoleObject": ".roleset", + "RoleSetDefaultRoleObject": ".roleset", + "RoleSetMigration": ".roleset", + "RoleSetMigrationTypedDict": ".roleset", + "RoleSetObject": ".roleset", + "RoleSetRoleSetMigrationObject": ".roleset", + "RoleSetTypedDict": ".roleset", + "Type": ".roleset", + "RoleSetItem": ".rolesetitem", + "RoleSetItemObject": ".rolesetitem", + "RoleSetItemTypedDict": ".rolesetitem", + "RoleSets": ".rolesets", + "RoleSetsTypedDict": ".rolesets", "RotateMachineSecretKeyRequest": ".rotatemachinesecretkeyop", "RotateMachineSecretKeyRequestBody": ".rotatemachinesecretkeyop", "RotateMachineSecretKeyRequestBodyTypedDict": ".rotatemachinesecretkeyop", @@ -3520,6 +3747,9 @@ "SAMLConnectionAttributeMappingTypedDict": ".samlconnectionattributemapping", "SAMLConnections": ".samlconnections", "SAMLConnectionsTypedDict": ".samlconnections", + "SchemasCommercePlan": ".schemas_commerceplan", + "SchemasCommercePlanObject": ".schemas_commerceplan", + "SchemasCommercePlanTypedDict": ".schemas_commerceplan", "Credit": ".schemas_commercesubscriptionitem", "CreditTypedDict": ".schemas_commercesubscriptionitem", "LifetimePaid": ".schemas_commercesubscriptionitem", @@ -3578,6 +3808,10 @@ "SessionRefreshTypedDict": ".sessionrefresh", "SessionTask": ".sessiontask", "SessionTaskTypedDict": ".sessiontask", + "SetUserPasswordCompromisedRequest": ".setuserpasswordcompromisedop", + "SetUserPasswordCompromisedRequestBody": ".setuserpasswordcompromisedop", + "SetUserPasswordCompromisedRequestBodyTypedDict": ".setuserpasswordcompromisedop", + "SetUserPasswordCompromisedRequestTypedDict": ".setuserpasswordcompromisedop", "File": ".setuserprofileimageop", "FileTypedDict": ".setuserprofileimageop", "SetUserProfileImageRequest": ".setuserprofileimageop", @@ -3624,6 +3858,8 @@ "UnbanUserRequestTypedDict": ".unbanuserop", "UnlockUserRequest": ".unlockuserop", "UnlockUserRequestTypedDict": ".unlockuserop", + "UnsetUserPasswordCompromisedRequest": ".unsetuserpasswordcompromisedop", + "UnsetUserPasswordCompromisedRequestTypedDict": ".unsetuserpasswordcompromisedop", "UpdateAPIKeyAPIKeysErrors": ".updateapikeyop", "UpdateAPIKeyAPIKeysErrorsTypedDict": ".updateapikeyop", "UpdateAPIKeyAPIKeysResponseBody": ".updateapikeyop", @@ -3653,6 +3889,8 @@ "UpdateInstanceRequestBodyTypedDict": ".updateinstanceop", "UpdateInstanceOrganizationSettingsRequestBody": ".updateinstanceorganizationsettingsop", "UpdateInstanceOrganizationSettingsRequestBodyTypedDict": ".updateinstanceorganizationsettingsop", + "UpdateInstanceProtectRequestBody": ".updateinstanceprotectop", + "UpdateInstanceProtectRequestBodyTypedDict": ".updateinstanceprotectop", "UpdateInstanceRestrictionsRequestBody": ".updateinstancerestrictionsop", "UpdateInstanceRestrictionsRequestBodyTypedDict": ".updateinstancerestrictionsop", "UpdateJWTTemplateClaims": ".updatejwttemplateop", @@ -3699,6 +3937,11 @@ "UpdatePhoneNumberRequestTypedDict": ".updatephonenumberop", "UpdateProductionInstanceDomainRequestBody": ".updateproductioninstancedomainop", "UpdateProductionInstanceDomainRequestBodyTypedDict": ".updateproductioninstancedomainop", + "UpdateRoleSetRequest": ".updaterolesetop", + "UpdateRoleSetRequestBody": ".updaterolesetop", + "UpdateRoleSetRequestBodyTypedDict": ".updaterolesetop", + "UpdateRoleSetRequestTypedDict": ".updaterolesetop", + "UpdateRoleSetType": ".updaterolesetop", "AttributeMapping": ".updatesamlconnectionop", "AttributeMappingTypedDict": ".updatesamlconnectionop", "UpdateSAMLConnectionRequest": ".updatesamlconnectionop", diff --git a/src/clerk_backend_api/models/actortoken.py b/src/clerk_backend_api/models/actortoken.py index 5bd5d11e..021b2528 100644 --- a/src/clerk_backend_api/models/actortoken.py +++ b/src/clerk_backend_api/models/actortoken.py @@ -1,8 +1,9 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from enum import Enum +from pydantic import model_serializer from typing import Optional from typing_extensions import NotRequired, TypedDict @@ -71,3 +72,19 @@ class ActorToken(BaseModel): token: Optional[str] = None url: Optional[str] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["token", "url"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/adddomainop.py b/src/clerk_backend_api/models/adddomainop.py index 9de66075..e6525d6f 100644 --- a/src/clerk_backend_api/models/adddomainop.py +++ b/src/clerk_backend_api/models/adddomainop.py @@ -33,30 +33,25 @@ class AddDomainRequestBody(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["proxy_url"] - nullable_fields = ["proxy_url"] - null_default_fields = [] - + optional_fields = set(["proxy_url"]) + nullable_fields = set(["proxy_url"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/addrolestorolesetop.py b/src/clerk_backend_api/models/addrolestorolesetop.py new file mode 100644 index 00000000..7abbfe22 --- /dev/null +++ b/src/clerk_backend_api/models/addrolestorolesetop.py @@ -0,0 +1,66 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL +from clerk_backend_api.utils import FieldMetadata, PathParamMetadata, RequestMetadata +from pydantic import model_serializer +from typing import List, Optional +from typing_extensions import Annotated, NotRequired, TypedDict + + +class AddRolesToRoleSetRequestBodyTypedDict(TypedDict): + role_keys: List[str] + r"""Array of role keys to add to the role set. + Must contain at least one role and no more than 10 roles. + """ + default_role_key: NotRequired[str] + r"""Optionally update the default role to one of the newly added roles.""" + creator_role_key: NotRequired[str] + r"""Optionally update the creator role to one of the newly added roles.""" + + +class AddRolesToRoleSetRequestBody(BaseModel): + role_keys: List[str] + r"""Array of role keys to add to the role set. + Must contain at least one role and no more than 10 roles. + """ + + default_role_key: Optional[str] = None + r"""Optionally update the default role to one of the newly added roles.""" + + creator_role_key: Optional[str] = None + r"""Optionally update the creator role to one of the newly added roles.""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["default_role_key", "creator_role_key"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m + + +class AddRolesToRoleSetRequestTypedDict(TypedDict): + role_set_key_or_id: str + r"""The key or ID of the role set""" + request_body: AddRolesToRoleSetRequestBodyTypedDict + + +class AddRolesToRoleSetRequest(BaseModel): + role_set_key_or_id: Annotated[ + str, FieldMetadata(path=PathParamMetadata(style="simple", explode=False)) + ] + r"""The key or ID of the role set""" + + request_body: Annotated[ + AddRolesToRoleSetRequestBody, + FieldMetadata(request=RequestMetadata(media_type="application/json")), + ] diff --git a/src/clerk_backend_api/models/allowlistidentifier.py b/src/clerk_backend_api/models/allowlistidentifier.py index 9061fa53..6fb00aa7 100644 --- a/src/clerk_backend_api/models/allowlistidentifier.py +++ b/src/clerk_backend_api/models/allowlistidentifier.py @@ -1,8 +1,9 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from enum import Enum +from pydantic import model_serializer from typing import Optional from typing_extensions import NotRequired, TypedDict @@ -74,3 +75,30 @@ class AllowlistIdentifier(BaseModel): r"""Unix timestamp of last update. """ + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + [ + "object", + "id", + "invitation_id", + "identifier", + "identifier_type", + "instance_id", + "created_at", + "updated_at", + ] + ) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/billingpaymentattempt.py b/src/clerk_backend_api/models/billingpaymentattempt.py index 34beb3bf..a5505467 100644 --- a/src/clerk_backend_api/models/billingpaymentattempt.py +++ b/src/clerk_backend_api/models/billingpaymentattempt.py @@ -154,35 +154,27 @@ class BillingPaymentAttempt(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["subscription_item_id", "subscription_item"] - nullable_fields = [ - "gateway_external_id", - "gateway_external_url", - "paid_at", - "failed_at", - ] - null_default_fields = [] - + optional_fields = set(["subscription_item_id", "subscription_item"]) + nullable_fields = set( + ["gateway_external_id", "gateway_external_url", "paid_at", "failed_at"] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/blocklistidentifier.py b/src/clerk_backend_api/models/blocklistidentifier.py index 7aa44f07..2fa3a59f 100644 --- a/src/clerk_backend_api/models/blocklistidentifier.py +++ b/src/clerk_backend_api/models/blocklistidentifier.py @@ -1,8 +1,9 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from enum import Enum +from pydantic import model_serializer from typing import Optional from typing_extensions import NotRequired, TypedDict @@ -67,3 +68,29 @@ class BlocklistIdentifier(BaseModel): r"""Unix timestamp of last update. """ + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + [ + "object", + "id", + "identifier", + "identifier_type", + "instance_id", + "created_at", + "updated_at", + ] + ) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/cancelcommercesubscriptionitemop.py b/src/clerk_backend_api/models/cancelcommercesubscriptionitemop.py index c52733ee..2a1c98fa 100644 --- a/src/clerk_backend_api/models/cancelcommercesubscriptionitemop.py +++ b/src/clerk_backend_api/models/cancelcommercesubscriptionitemop.py @@ -1,8 +1,9 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from clerk_backend_api.utils import FieldMetadata, PathParamMetadata, QueryParamMetadata +from pydantic import model_serializer from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -25,3 +26,19 @@ class CancelCommerceSubscriptionItemRequest(BaseModel): FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), ] = False r"""Whether to cancel the subscription immediately (true) or at the end of the current billing period (false, default)""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["end_now"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/changeproductioninstancedomainop.py b/src/clerk_backend_api/models/changeproductioninstancedomainop.py index e36ada3a..cbf28f56 100644 --- a/src/clerk_backend_api/models/changeproductioninstancedomainop.py +++ b/src/clerk_backend_api/models/changeproductioninstancedomainop.py @@ -1,7 +1,8 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL +from pydantic import model_serializer from typing import Optional from typing_extensions import NotRequired, TypedDict @@ -25,3 +26,19 @@ class ChangeProductionInstanceDomainRequestBody(BaseModel): will be stored as part of the domain. This is useful for supporting multiple apps (one primary and multiple secondaries) on the same root domain (eTLD+1). """ + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["home_url", "is_secondary"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/clerkerror.py b/src/clerk_backend_api/models/clerkerror.py index 9e04464d..064eb405 100644 --- a/src/clerk_backend_api/models/clerkerror.py +++ b/src/clerk_backend_api/models/clerkerror.py @@ -1,7 +1,8 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL +from pydantic import model_serializer from typing import Optional from typing_extensions import NotRequired, TypedDict @@ -29,3 +30,19 @@ class ClerkError(BaseModel): code: str meta: Optional[Meta] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["meta"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/clerkerrors.py b/src/clerk_backend_api/models/clerkerrors.py index f5b008f2..7658c12b 100644 --- a/src/clerk_backend_api/models/clerkerrors.py +++ b/src/clerk_backend_api/models/clerkerrors.py @@ -20,7 +20,6 @@ class ClerkErrorsMeta(BaseModel): class ClerkErrorsData(BaseModel): errors: List[ClerkError] - meta: Optional[ClerkErrorsMeta] = None diff --git a/src/clerk_backend_api/models/client.py b/src/clerk_backend_api/models/client.py index 32ba07af..6b8c03da 100644 --- a/src/clerk_backend_api/models/client.py +++ b/src/clerk_backend_api/models/client.py @@ -91,35 +91,14 @@ class Client(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [] - nullable_fields = [ - "sign_in_id", - "sign_up_id", - "last_active_session_id", - "last_authentication_strategy", - ] - null_default_fields = [] - serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): + if val != UNSET_SENTINEL: m[k] = val return m diff --git a/src/clerk_backend_api/models/commercepayerresponse.py b/src/clerk_backend_api/models/commercepayerresponse.py index 840330a5..ccc15f2f 100644 --- a/src/clerk_backend_api/models/commercepayerresponse.py +++ b/src/clerk_backend_api/models/commercepayerresponse.py @@ -86,47 +86,46 @@ class CommercePayerResponse(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "user_id", - "first_name", - "last_name", - "email", - "organization_id", - "organization_name", - "image_url", - "created_at", - "updated_at", - ] - nullable_fields = [ - "user_id", - "first_name", - "last_name", - "email", - "organization_id", - "organization_name", - ] - null_default_fields = [] - + optional_fields = set( + [ + "user_id", + "first_name", + "last_name", + "email", + "organization_id", + "organization_name", + "image_url", + "created_at", + "updated_at", + ] + ) + nullable_fields = set( + [ + "user_id", + "first_name", + "last_name", + "email", + "organization_id", + "organization_name", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/commercepaymentmethodresponse.py b/src/clerk_backend_api/models/commercepaymentmethodresponse.py index e94d487e..0137de4d 100644 --- a/src/clerk_backend_api/models/commercepaymentmethodresponse.py +++ b/src/clerk_backend_api/models/commercepaymentmethodresponse.py @@ -125,45 +125,44 @@ class CommercePaymentMethodResponse(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "is_default", - "wallet_type", - "expiry_year", - "expiry_month", - "created_at", - "updated_at", - "is_removable", - ] - nullable_fields = [ - "gateway_external_account_id", - "last4", - "wallet_type", - "card_type", - "expiry_year", - "expiry_month", - ] - null_default_fields = [] - + optional_fields = set( + [ + "is_default", + "wallet_type", + "expiry_year", + "expiry_month", + "created_at", + "updated_at", + "is_removable", + ] + ) + nullable_fields = set( + [ + "gateway_external_account_id", + "last4", + "wallet_type", + "card_type", + "expiry_year", + "expiry_month", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/commerceplan.py b/src/clerk_backend_api/models/commerceplan.py index f3f50047..f294f1aa 100644 --- a/src/clerk_backend_api/models/commerceplan.py +++ b/src/clerk_backend_api/models/commerceplan.py @@ -162,36 +162,33 @@ class CommercePlan(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["features"] - nullable_fields = [ - "annual_monthly_fee", - "annual_fee", - "description", - "avatar_url", - "free_trial_days", - ] - null_default_fields = [] - + optional_fields = set(["features"]) + nullable_fields = set( + [ + "annual_monthly_fee", + "annual_fee", + "description", + "avatar_url", + "free_trial_days", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/commercepriceresponse.py b/src/clerk_backend_api/models/commercepriceresponse.py new file mode 100644 index 00000000..4f6dec3d --- /dev/null +++ b/src/clerk_backend_api/models/commercepriceresponse.py @@ -0,0 +1,106 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from .commercemoneyresponse import CommerceMoneyResponse, CommerceMoneyResponseTypedDict +from clerk_backend_api.types import ( + BaseModel, + Nullable, + OptionalNullable, + UNSET, + UNSET_SENTINEL, +) +from enum import Enum +from pydantic import model_serializer +from typing_extensions import NotRequired, TypedDict + + +class CommercePriceResponseObject(str, Enum): + r"""String representing the object's type. Objects of the same type share the same value.""" + + COMMERCE_PRICE = "commerce_price" + + +class CommercePriceResponseTypedDict(TypedDict): + object: CommercePriceResponseObject + r"""String representing the object's type. Objects of the same type share the same value.""" + id: str + r"""Unique identifier for the price.""" + plan_id: str + r"""Unique identifier for the associated plan.""" + instance_id: str + r"""Unique identifier for the instance.""" + currency: str + r"""The currency code (e.g., \"USD\").""" + currency_symbol: str + r"""The currency symbol (e.g., \"$\").""" + amount: int + r"""The amount in cents for the price.""" + annual_monthly_amount: int + r"""The monthly amount in cents when billed annually.""" + fee: CommerceMoneyResponseTypedDict + annual_monthly_fee: CommerceMoneyResponseTypedDict + created_at: int + r"""Unix timestamp (milliseconds) of creation.""" + description: NotRequired[Nullable[str]] + r"""The description of the price.""" + + +class CommercePriceResponse(BaseModel): + object: CommercePriceResponseObject + r"""String representing the object's type. Objects of the same type share the same value.""" + + id: str + r"""Unique identifier for the price.""" + + plan_id: str + r"""Unique identifier for the associated plan.""" + + instance_id: str + r"""Unique identifier for the instance.""" + + currency: str + r"""The currency code (e.g., \"USD\").""" + + currency_symbol: str + r"""The currency symbol (e.g., \"$\").""" + + amount: int + r"""The amount in cents for the price.""" + + annual_monthly_amount: int + r"""The monthly amount in cents when billed annually.""" + + fee: CommerceMoneyResponse + + annual_monthly_fee: CommerceMoneyResponse + + created_at: int + r"""Unix timestamp (milliseconds) of creation.""" + + description: OptionalNullable[str] = UNSET + r"""The description of the price.""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["description"]) + nullable_fields = set(["description"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/commercepricetransitiondetails.py b/src/clerk_backend_api/models/commercepricetransitiondetails.py new file mode 100644 index 00000000..9e4c9304 --- /dev/null +++ b/src/clerk_backend_api/models/commercepricetransitiondetails.py @@ -0,0 +1,130 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from .commercepriceresponse import CommercePriceResponse, CommercePriceResponseTypedDict +from .schemas_commerceplan import SchemasCommercePlan, SchemasCommercePlanTypedDict +from clerk_backend_api.types import ( + BaseModel, + Nullable, + OptionalNullable, + UNSET, + UNSET_SENTINEL, +) +from enum import Enum +from pydantic import model_serializer +from typing_extensions import NotRequired, TypedDict + + +class EffectiveMode(str, Enum): + r"""When the new price takes effect.""" + + IMMEDIATE = "immediate" + END_OF_PERIOD = "end_of_period" + + +class ImmediateChargeTypedDict(TypedDict): + r"""Amount charged immediately, if any.""" + + amount: int + r"""The amount in cents.""" + amount_formatted: str + r"""The formatted amount as a string (e.g., \"$49.99\").""" + currency: str + r"""The currency code (e.g., \"USD\").""" + currency_symbol: str + r"""The currency symbol (e.g., \"$\").""" + + +class ImmediateCharge(BaseModel): + r"""Amount charged immediately, if any.""" + + amount: int + r"""The amount in cents.""" + + amount_formatted: str + r"""The formatted amount as a string (e.g., \"$49.99\").""" + + currency: str + r"""The currency code (e.g., \"USD\").""" + + currency_symbol: str + r"""The currency symbol (e.g., \"$\").""" + + +class PreviousSubscriptionItemStatus(str, Enum): + r"""The status of the previous subscription item after transition.""" + + CANCELED = "canceled" + ENDED = "ended" + ABANDONED = "abandoned" + + +class CommercePriceTransitionDetailsTypedDict(TypedDict): + previous_plan: SchemasCommercePlanTypedDict + previous_price: CommercePriceResponseTypedDict + effective_at: int + r"""Unix timestamp (milliseconds) when the new price takes effect.""" + effective_mode: EffectiveMode + r"""When the new price takes effect.""" + charged_immediately: bool + r"""Whether an immediate charge was made.""" + previous_subscription_item_status: PreviousSubscriptionItemStatus + r"""The status of the previous subscription item after transition.""" + previous_subscription_item_id: str + r"""The ID of the previous subscription item.""" + next_billing_date: NotRequired[Nullable[int]] + r"""Unix timestamp (milliseconds) for the next billing date.""" + immediate_charge: NotRequired[Nullable[ImmediateChargeTypedDict]] + r"""Amount charged immediately, if any.""" + + +class CommercePriceTransitionDetails(BaseModel): + previous_plan: SchemasCommercePlan + + previous_price: CommercePriceResponse + + effective_at: int + r"""Unix timestamp (milliseconds) when the new price takes effect.""" + + effective_mode: EffectiveMode + r"""When the new price takes effect.""" + + charged_immediately: bool + r"""Whether an immediate charge was made.""" + + previous_subscription_item_status: PreviousSubscriptionItemStatus + r"""The status of the previous subscription item after transition.""" + + previous_subscription_item_id: str + r"""The ID of the previous subscription item.""" + + next_billing_date: OptionalNullable[int] = UNSET + r"""Unix timestamp (milliseconds) for the next billing date.""" + + immediate_charge: OptionalNullable[ImmediateCharge] = UNSET + r"""Amount charged immediately, if any.""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["next_billing_date", "immediate_charge"]) + nullable_fields = set(["next_billing_date", "immediate_charge"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/commercepricetransitionresponse.py b/src/clerk_backend_api/models/commercepricetransitionresponse.py new file mode 100644 index 00000000..1d732f5d --- /dev/null +++ b/src/clerk_backend_api/models/commercepricetransitionresponse.py @@ -0,0 +1,40 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from .commercepricetransitiondetails import ( + CommercePriceTransitionDetails, + CommercePriceTransitionDetailsTypedDict, +) +from .schemas_commercesubscriptionitem import ( + SchemasCommerceSubscriptionItem, + SchemasCommerceSubscriptionItemTypedDict, +) +from clerk_backend_api.types import BaseModel +from enum import Enum +from typing_extensions import TypedDict + + +class CommercePriceTransitionResponseObject(str, Enum): + r"""String representing the object's type. Objects of the same type share the same value.""" + + COMMERCE_PRICE_TRANSITION = "commerce_price_transition" + + +class CommercePriceTransitionResponseTypedDict(TypedDict): + r"""A commerce price transition.""" + + object: CommercePriceTransitionResponseObject + r"""String representing the object's type. Objects of the same type share the same value.""" + subscription_item: SchemasCommerceSubscriptionItemTypedDict + transition: CommercePriceTransitionDetailsTypedDict + + +class CommercePriceTransitionResponse(BaseModel): + r"""A commerce price transition.""" + + object: CommercePriceTransitionResponseObject + r"""String representing the object's type. Objects of the same type share the same value.""" + + subscription_item: SchemasCommerceSubscriptionItem + + transition: CommercePriceTransitionDetails diff --git a/src/clerk_backend_api/models/commercesubscription.py b/src/clerk_backend_api/models/commercesubscription.py index 8d762940..56bba50a 100644 --- a/src/clerk_backend_api/models/commercesubscription.py +++ b/src/clerk_backend_api/models/commercesubscription.py @@ -101,30 +101,25 @@ class CommerceSubscription(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["next_payment", "eligible_for_free_trial"] - nullable_fields = ["active_at", "past_due_at"] - null_default_fields = [] - + optional_fields = set(["next_payment", "eligible_for_free_trial"]) + nullable_fields = set(["active_at", "past_due_at"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/commercesubscriptioncreditresponse.py b/src/clerk_backend_api/models/commercesubscriptioncreditresponse.py index 5caf5206..24678d63 100644 --- a/src/clerk_backend_api/models/commercesubscriptioncreditresponse.py +++ b/src/clerk_backend_api/models/commercesubscriptioncreditresponse.py @@ -58,30 +58,25 @@ class CommerceSubscriptionCreditResponse(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["amount", "cycle_remaining_percent"] - nullable_fields = ["amount"] - null_default_fields = [] - + optional_fields = set(["amount", "cycle_remaining_percent"]) + nullable_fields = set(["amount"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/commercesubscriptionitem.py b/src/clerk_backend_api/models/commercesubscriptionitem.py index 77a1a6ff..1d378731 100644 --- a/src/clerk_backend_api/models/commercesubscriptionitem.py +++ b/src/clerk_backend_api/models/commercesubscriptionitem.py @@ -201,37 +201,34 @@ class Plan(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["features"] - nullable_fields = [ - "annual_monthly_fee", - "annual_fee", - "description", - "avatar_url", - "free_trial_days", - ] - null_default_fields = [] - + optional_fields = set(["features"]) + nullable_fields = set( + [ + "annual_monthly_fee", + "annual_fee", + "description", + "avatar_url", + "free_trial_days", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m @@ -292,31 +289,26 @@ class NextPayment(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["amount", "date"] - nullable_fields = ["amount", "date"] - null_default_fields = [] - + optional_fields = set(["amount", "date"]) + nullable_fields = set(["amount", "date"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m @@ -349,6 +341,8 @@ class CommerceSubscriptionItemTypedDict(TypedDict): ended_at: Nullable[int] r"""Unix timestamp (in milliseconds) when the subscription item ended.""" credit: NotRequired[CommerceSubscriptionCreditResponseTypedDict] + price_id: NotRequired[str] + r"""Unique identifier for the associated price""" plan: NotRequired[Nullable[PlanTypedDict]] r"""The associated plan.""" payment_method: NotRequired[CommercePaymentMethodResponseTypedDict] @@ -406,6 +400,9 @@ class CommerceSubscriptionItem(BaseModel): credit: Optional[CommerceSubscriptionCreditResponse] = None + price_id: Optional[str] = None + r"""Unique identifier for the associated price""" + plan: OptionalNullable[Plan] = UNSET r"""The associated plan.""" @@ -429,48 +426,48 @@ class CommerceSubscriptionItem(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "credit", - "plan", - "payment_method", - "lifetime_paid", - "next_payment", - "payer", - "proration_date", - "created_at", - "updated_at", - ] - nullable_fields = [ - "plan_id", - "plan", - "next_payment", - "period_end", - "canceled_at", - "past_due_at", - "ended_at", - ] - null_default_fields = [] - + optional_fields = set( + [ + "credit", + "price_id", + "plan", + "payment_method", + "lifetime_paid", + "next_payment", + "payer", + "proration_date", + "created_at", + "updated_at", + ] + ) + nullable_fields = set( + [ + "plan_id", + "plan", + "next_payment", + "period_end", + "canceled_at", + "past_due_at", + "ended_at", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/createactortokenop.py b/src/clerk_backend_api/models/createactortokenop.py index 3cf2dd49..48e296f6 100644 --- a/src/clerk_backend_api/models/createactortokenop.py +++ b/src/clerk_backend_api/models/createactortokenop.py @@ -1,9 +1,9 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL import pydantic -from pydantic import ConfigDict +from pydantic import ConfigDict, model_serializer from typing import Any, Dict, Optional from typing_extensions import NotRequired, TypedDict @@ -74,3 +74,19 @@ class CreateActorTokenRequestBody(BaseModel): r"""The maximum duration that the session which will be created by the generated actor token should last. By default, the duration of a session created via an actor token, lasts 30 minutes. """ + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["expires_in_seconds", "session_max_duration_in_seconds"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/createallowlistidentifierop.py b/src/clerk_backend_api/models/createallowlistidentifierop.py index bc48a4c6..6e45fe42 100644 --- a/src/clerk_backend_api/models/createallowlistidentifierop.py +++ b/src/clerk_backend_api/models/createallowlistidentifierop.py @@ -1,7 +1,8 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL +from pydantic import model_serializer from typing import Optional from typing_extensions import NotRequired, TypedDict @@ -27,3 +28,19 @@ class CreateAllowlistIdentifierRequestBody(BaseModel): r"""This flag denotes whether the given identifier will receive an invitation to join the application. Note that this only works for email address and phone number identifiers. """ + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["notify"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/createapikeyop.py b/src/clerk_backend_api/models/createapikeyop.py index 4e849491..b252ed0d 100644 --- a/src/clerk_backend_api/models/createapikeyop.py +++ b/src/clerk_backend_api/models/createapikeyop.py @@ -47,43 +47,37 @@ class CreateAPIKeyRequestBody(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "type", - "description", - "claims", - "scopes", - "created_by", - "seconds_until_expiration", - ] - nullable_fields = [ - "description", - "claims", - "created_by", - "seconds_until_expiration", - ] - null_default_fields = [] - + optional_fields = set( + [ + "type", + "description", + "claims", + "scopes", + "created_by", + "seconds_until_expiration", + ] + ) + nullable_fields = set( + ["description", "claims", "created_by", "seconds_until_expiration"] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m @@ -177,10 +171,14 @@ class CreateAPIKeyResponseBodyTypedDict(TypedDict): revocation_reason: Nullable[str] expired: bool expiration: Nullable[float] + r"""The timestamp for when the API key will expire, in milliseconds""" created_by: Nullable[str] last_used_at: Nullable[float] + r"""The timestamp for when the API key was last used, in milliseconds""" created_at: float + r"""The timestamp for when the API key was created, in milliseconds""" updated_at: float + r"""The timestamp for when the API key was last updated, in milliseconds""" description: NotRequired[Nullable[str]] @@ -210,50 +208,51 @@ class CreateAPIKeyResponseBody(BaseModel): expired: bool expiration: Nullable[float] + r"""The timestamp for when the API key will expire, in milliseconds""" created_by: Nullable[str] last_used_at: Nullable[float] + r"""The timestamp for when the API key was last used, in milliseconds""" created_at: float + r"""The timestamp for when the API key was created, in milliseconds""" updated_at: float + r"""The timestamp for when the API key was last updated, in milliseconds""" description: OptionalNullable[str] = UNSET @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["description"] - nullable_fields = [ - "description", - "claims", - "revocation_reason", - "expiration", - "created_by", - "last_used_at", - ] - null_default_fields = [] - + optional_fields = set(["description"]) + nullable_fields = set( + [ + "description", + "claims", + "revocation_reason", + "expiration", + "created_by", + "last_used_at", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/createbillingpricetransitionop.py b/src/clerk_backend_api/models/createbillingpricetransitionop.py new file mode 100644 index 00000000..f4513f7a --- /dev/null +++ b/src/clerk_backend_api/models/createbillingpricetransitionop.py @@ -0,0 +1,30 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from .pricetransitionrequest import ( + PriceTransitionRequest, + PriceTransitionRequestTypedDict, +) +from clerk_backend_api.types import BaseModel +from clerk_backend_api.utils import FieldMetadata, PathParamMetadata, RequestMetadata +from typing_extensions import Annotated, TypedDict + + +class CreateBillingPriceTransitionRequestTypedDict(TypedDict): + subscription_item_id: str + r"""The ID of the subscription item to transition""" + price_transition_request: PriceTransitionRequestTypedDict + r"""Parameters for the price transition""" + + +class CreateBillingPriceTransitionRequest(BaseModel): + subscription_item_id: Annotated[ + str, FieldMetadata(path=PathParamMetadata(style="simple", explode=False)) + ] + r"""The ID of the subscription item to transition""" + + price_transition_request: Annotated[ + PriceTransitionRequest, + FieldMetadata(request=RequestMetadata(media_type="application/json")), + ] + r"""Parameters for the price transition""" diff --git a/src/clerk_backend_api/models/createbulkinvitationsop.py b/src/clerk_backend_api/models/createbulkinvitationsop.py index 576fe4d5..f75b6d2a 100644 --- a/src/clerk_backend_api/models/createbulkinvitationsop.py +++ b/src/clerk_backend_api/models/createbulkinvitationsop.py @@ -78,43 +78,42 @@ class RequestBody(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "public_metadata", - "redirect_url", - "notify", - "ignore_existing", - "expires_in_days", - "template_slug", - ] - nullable_fields = [ - "public_metadata", - "redirect_url", - "notify", - "ignore_existing", - "expires_in_days", - ] - null_default_fields = [] - + optional_fields = set( + [ + "public_metadata", + "redirect_url", + "notify", + "ignore_existing", + "expires_in_days", + "template_slug", + ] + ) + nullable_fields = set( + [ + "public_metadata", + "redirect_url", + "notify", + "ignore_existing", + "expires_in_days", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/createemailaddressop.py b/src/clerk_backend_api/models/createemailaddressop.py index 780f3946..406b8ac4 100644 --- a/src/clerk_backend_api/models/createemailaddressop.py +++ b/src/clerk_backend_api/models/createemailaddressop.py @@ -42,30 +42,25 @@ class CreateEmailAddressRequestBody(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["verified", "primary"] - nullable_fields = ["verified", "primary"] - null_default_fields = [] - + optional_fields = set(["verified", "primary"]) + nullable_fields = set(["verified", "primary"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/createinvitationop.py b/src/clerk_backend_api/models/createinvitationop.py index 0a1af705..21113731 100644 --- a/src/clerk_backend_api/models/createinvitationop.py +++ b/src/clerk_backend_api/models/createinvitationop.py @@ -80,37 +80,34 @@ class CreateInvitationRequestBody(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "public_metadata", - "redirect_url", - "notify", - "ignore_existing", - "expires_in_days", - "template_slug", - ] - nullable_fields = ["notify", "ignore_existing", "expires_in_days"] - null_default_fields = [] - + optional_fields = set( + [ + "public_metadata", + "redirect_url", + "notify", + "ignore_existing", + "expires_in_days", + "template_slug", + ] + ) + nullable_fields = set(["notify", "ignore_existing", "expires_in_days"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/createjwttemplateop.py b/src/clerk_backend_api/models/createjwttemplateop.py index a4a20093..52c65fa8 100644 --- a/src/clerk_backend_api/models/createjwttemplateop.py +++ b/src/clerk_backend_api/models/createjwttemplateop.py @@ -62,41 +62,35 @@ class CreateJWTTemplateRequestBody(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "lifetime", - "allowed_clock_skew", - "custom_signing_key", - "signing_algorithm", - "signing_key", - ] - nullable_fields = [ - "lifetime", - "allowed_clock_skew", - "signing_algorithm", - "signing_key", - ] - null_default_fields = [] - + optional_fields = set( + [ + "lifetime", + "allowed_clock_skew", + "custom_signing_key", + "signing_algorithm", + "signing_key", + ] + ) + nullable_fields = set( + ["lifetime", "allowed_clock_skew", "signing_algorithm", "signing_key"] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/createm2mtokenop.py b/src/clerk_backend_api/models/createm2mtokenop.py index ab1d8a88..56c5f284 100644 --- a/src/clerk_backend_api/models/createm2mtokenop.py +++ b/src/clerk_backend_api/models/createm2mtokenop.py @@ -29,31 +29,26 @@ class CreateM2MTokenRequestBody(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["seconds_until_expiration", "claims"] - nullable_fields = ["seconds_until_expiration", "claims"] - null_default_fields = [] - + optional_fields = set(["seconds_until_expiration", "claims"]) + nullable_fields = set(["seconds_until_expiration", "claims"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m @@ -143,9 +138,13 @@ class CreateM2MTokenResponseBodyTypedDict(TypedDict): revocation_reason: Nullable[str] expired: bool expiration: Nullable[float] + r"""The timestamp for when the token will expire, in milliseconds""" last_used_at: Nullable[float] + r"""The timestamp for when the token was last used, in milliseconds""" created_at: float + r"""The timestamp for when the token was created, in milliseconds""" updated_at: float + r"""The timestamp for when the token was last updated, in milliseconds""" claims: NotRequired[Nullable[Any]] scopes: NotRequired[List[str]] @@ -168,12 +167,16 @@ class CreateM2MTokenResponseBody(BaseModel): expired: bool expiration: Nullable[float] + r"""The timestamp for when the token will expire, in milliseconds""" last_used_at: Nullable[float] + r"""The timestamp for when the token was last used, in milliseconds""" created_at: float + r"""The timestamp for when the token was created, in milliseconds""" updated_at: float + r"""The timestamp for when the token was last updated, in milliseconds""" claims: OptionalNullable[Any] = UNSET @@ -181,30 +184,27 @@ class CreateM2MTokenResponseBody(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["claims", "scopes"] - nullable_fields = ["claims", "revocation_reason", "expiration", "last_used_at"] - null_default_fields = [] - + optional_fields = set(["claims", "scopes"]) + nullable_fields = set( + ["claims", "revocation_reason", "expiration", "last_used_at"] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/createmachineop.py b/src/clerk_backend_api/models/createmachineop.py index 3f598e00..3b4d5887 100644 --- a/src/clerk_backend_api/models/createmachineop.py +++ b/src/clerk_backend_api/models/createmachineop.py @@ -1,7 +1,8 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL +from pydantic import model_serializer from typing import List, Optional from typing_extensions import NotRequired, TypedDict @@ -10,7 +11,7 @@ class CreateMachineRequestBodyTypedDict(TypedDict): name: str r"""The name of the machine""" scoped_machines: NotRequired[List[str]] - r"""Array of machine IDs that this machine will have access to. Maximum of 25 scopes per machine.""" + r"""Array of machine IDs that this machine will have access to. Maximum of 150 scopes per machine.""" default_token_ttl: NotRequired[int] r"""The default time-to-live (TTL) in seconds for tokens created by this machine. Must be at least 1 second.""" @@ -20,7 +21,23 @@ class CreateMachineRequestBody(BaseModel): r"""The name of the machine""" scoped_machines: Optional[List[str]] = None - r"""Array of machine IDs that this machine will have access to. Maximum of 25 scopes per machine.""" + r"""Array of machine IDs that this machine will have access to. Maximum of 150 scopes per machine.""" default_token_ttl: Optional[int] = 3600 r"""The default time-to-live (TTL) in seconds for tokens created by this machine. Must be at least 1 second.""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["scoped_machines", "default_token_ttl"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/createmachinescopeop.py b/src/clerk_backend_api/models/createmachinescopeop.py index 74e14ec3..037fddfe 100644 --- a/src/clerk_backend_api/models/createmachinescopeop.py +++ b/src/clerk_backend_api/models/createmachinescopeop.py @@ -1,8 +1,9 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from clerk_backend_api.utils import FieldMetadata, PathParamMetadata, RequestMetadata +from pydantic import model_serializer from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -33,3 +34,19 @@ class CreateMachineScopeRequest(BaseModel): Optional[CreateMachineScopeRequestBody], FieldMetadata(request=RequestMetadata(media_type="application/json")), ] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["RequestBody"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/createoauthapplicationop.py b/src/clerk_backend_api/models/createoauthapplicationop.py index 41b67c5d..a1be54e0 100644 --- a/src/clerk_backend_api/models/createoauthapplicationop.py +++ b/src/clerk_backend_api/models/createoauthapplicationop.py @@ -64,44 +64,43 @@ class CreateOAuthApplicationRequestBody(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "redirect_uris", - "callback_url", - "scopes", - "consent_screen_enabled", - "pkce_required", - "public", - ] - nullable_fields = [ - "redirect_uris", - "callback_url", - "scopes", - "consent_screen_enabled", - "pkce_required", - "public", - ] - null_default_fields = [] - + optional_fields = set( + [ + "redirect_uris", + "callback_url", + "scopes", + "consent_screen_enabled", + "pkce_required", + "public", + ] + ) + nullable_fields = set( + [ + "redirect_uris", + "callback_url", + "scopes", + "consent_screen_enabled", + "pkce_required", + "public", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/createorganizationdomainop.py b/src/clerk_backend_api/models/createorganizationdomainop.py index b8db4e9f..a31ae200 100644 --- a/src/clerk_backend_api/models/createorganizationdomainop.py +++ b/src/clerk_backend_api/models/createorganizationdomainop.py @@ -35,31 +35,26 @@ class CreateOrganizationDomainRequestBody(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["name", "enrollment_mode", "verified"] - nullable_fields = ["verified"] - null_default_fields = [] - + optional_fields = set(["name", "enrollment_mode", "verified"]) + nullable_fields = set(["verified"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/createorganizationinvitationbulkop.py b/src/clerk_backend_api/models/createorganizationinvitationbulkop.py index 9994d43b..2c9e5224 100644 --- a/src/clerk_backend_api/models/createorganizationinvitationbulkop.py +++ b/src/clerk_backend_api/models/createorganizationinvitationbulkop.py @@ -35,6 +35,10 @@ class CreateOrganizationInvitationBulkRequestBodyTypedDict(TypedDict): r"""Optional URL that the invitee will be redirected to once they accept the invitation by clicking the join link in the invitation email.""" expires_in_days: NotRequired[Nullable[int]] r"""The number of days the invitation will be valid for. By default, the invitation has a 30 days expire.""" + notify: NotRequired[Nullable[bool]] + r"""Optional flag which denotes whether an email invitation should be sent to the given email address. + Defaults to `true`. + """ class CreateOrganizationInvitationBulkRequestBody(BaseModel): @@ -65,45 +69,51 @@ class CreateOrganizationInvitationBulkRequestBody(BaseModel): expires_in_days: OptionalNullable[int] = UNSET r"""The number of days the invitation will be valid for. By default, the invitation has a 30 days expire.""" + notify: OptionalNullable[bool] = True + r"""Optional flag which denotes whether an email invitation should be sent to the given email address. + Defaults to `true`. + """ + @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "inviter_user_id", - "public_metadata", - "private_metadata", - "redirect_url", - "expires_in_days", - ] - nullable_fields = [ - "inviter_user_id", - "public_metadata", - "private_metadata", - "redirect_url", - "expires_in_days", - ] - null_default_fields = [] - + optional_fields = set( + [ + "inviter_user_id", + "public_metadata", + "private_metadata", + "redirect_url", + "expires_in_days", + "notify", + ] + ) + nullable_fields = set( + [ + "inviter_user_id", + "public_metadata", + "private_metadata", + "redirect_url", + "expires_in_days", + "notify", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/createorganizationinvitationop.py b/src/clerk_backend_api/models/createorganizationinvitationop.py index 5c1e55e3..2df11af4 100644 --- a/src/clerk_backend_api/models/createorganizationinvitationop.py +++ b/src/clerk_backend_api/models/createorganizationinvitationop.py @@ -35,6 +35,10 @@ class CreateOrganizationInvitationRequestBodyTypedDict(TypedDict): r"""Optional URL that the invitee will be redirected to once they accept the invitation by clicking the join link in the invitation email.""" expires_in_days: NotRequired[Nullable[int]] r"""The number of days the invitation will be valid for. By default, the invitation has a 30 days expire.""" + notify: NotRequired[Nullable[bool]] + r"""Optional flag which denotes whether an email invitation should be sent to the given email address. + Defaults to `true`. + """ class CreateOrganizationInvitationRequestBody(BaseModel): @@ -65,45 +69,51 @@ class CreateOrganizationInvitationRequestBody(BaseModel): expires_in_days: OptionalNullable[int] = UNSET r"""The number of days the invitation will be valid for. By default, the invitation has a 30 days expire.""" + notify: OptionalNullable[bool] = True + r"""Optional flag which denotes whether an email invitation should be sent to the given email address. + Defaults to `true`. + """ + @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "inviter_user_id", - "public_metadata", - "private_metadata", - "redirect_url", - "expires_in_days", - ] - nullable_fields = [ - "inviter_user_id", - "public_metadata", - "private_metadata", - "redirect_url", - "expires_in_days", - ] - null_default_fields = [] - + optional_fields = set( + [ + "inviter_user_id", + "public_metadata", + "private_metadata", + "redirect_url", + "expires_in_days", + "notify", + ] + ) + nullable_fields = set( + [ + "inviter_user_id", + "public_metadata", + "private_metadata", + "redirect_url", + "expires_in_days", + "notify", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m @@ -124,3 +134,19 @@ class CreateOrganizationInvitationRequest(BaseModel): Optional[CreateOrganizationInvitationRequestBody], FieldMetadata(request=RequestMetadata(media_type="application/json")), ] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["RequestBody"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/createorganizationmembershipop.py b/src/clerk_backend_api/models/createorganizationmembershipop.py index f4a76f23..166ea01e 100644 --- a/src/clerk_backend_api/models/createorganizationmembershipop.py +++ b/src/clerk_backend_api/models/createorganizationmembershipop.py @@ -40,31 +40,26 @@ class CreateOrganizationMembershipRequestBody(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["public_metadata", "private_metadata"] - nullable_fields = ["public_metadata", "private_metadata"] - null_default_fields = [] - + optional_fields = set(["public_metadata", "private_metadata"]) + nullable_fields = set(["public_metadata", "private_metadata"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/createorganizationop.py b/src/clerk_backend_api/models/createorganizationop.py index 8ec880ed..e26bbf43 100644 --- a/src/clerk_backend_api/models/createorganizationop.py +++ b/src/clerk_backend_api/models/createorganizationop.py @@ -68,44 +68,43 @@ class CreateOrganizationRequestBody(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "created_by", - "private_metadata", - "public_metadata", - "slug", - "max_allowed_memberships", - "created_at", - ] - nullable_fields = [ - "created_by", - "private_metadata", - "public_metadata", - "slug", - "max_allowed_memberships", - "created_at", - ] - null_default_fields = [] - + optional_fields = set( + [ + "created_by", + "private_metadata", + "public_metadata", + "slug", + "max_allowed_memberships", + "created_at", + ] + ) + nullable_fields = set( + [ + "created_by", + "private_metadata", + "public_metadata", + "slug", + "max_allowed_memberships", + "created_at", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/createorganizationpermissionop.py b/src/clerk_backend_api/models/createorganizationpermissionop.py index 91081828..06af93cc 100644 --- a/src/clerk_backend_api/models/createorganizationpermissionop.py +++ b/src/clerk_backend_api/models/createorganizationpermissionop.py @@ -1,7 +1,8 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL +from pydantic import model_serializer from typing import Optional from typing_extensions import NotRequired, TypedDict @@ -24,3 +25,19 @@ class CreateOrganizationPermissionRequestBody(BaseModel): description: Optional[str] = None r"""A description of the permission.""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["description"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/createorganizationroleop.py b/src/clerk_backend_api/models/createorganizationroleop.py index 58d509ef..2af8899a 100644 --- a/src/clerk_backend_api/models/createorganizationroleop.py +++ b/src/clerk_backend_api/models/createorganizationroleop.py @@ -44,30 +44,29 @@ class CreateOrganizationRoleRequestBody(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["description", "permissions", "include_in_initial_role_set"] - nullable_fields = ["description", "permissions", "include_in_initial_role_set"] - null_default_fields = [] - + optional_fields = set( + ["description", "permissions", "include_in_initial_role_set"] + ) + nullable_fields = set( + ["description", "permissions", "include_in_initial_role_set"] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/createphonenumberop.py b/src/clerk_backend_api/models/createphonenumberop.py index 9e5bbf87..296b1e54 100644 --- a/src/clerk_backend_api/models/createphonenumberop.py +++ b/src/clerk_backend_api/models/createphonenumberop.py @@ -47,30 +47,25 @@ class CreatePhoneNumberRequestBody(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["verified", "primary", "reserved_for_second_factor"] - nullable_fields = ["verified", "primary", "reserved_for_second_factor"] - null_default_fields = [] - + optional_fields = set(["verified", "primary", "reserved_for_second_factor"]) + nullable_fields = set(["verified", "primary", "reserved_for_second_factor"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/createrolesetop.py b/src/clerk_backend_api/models/createrolesetop.py new file mode 100644 index 00000000..8ceabfc2 --- /dev/null +++ b/src/clerk_backend_api/models/createrolesetop.py @@ -0,0 +1,108 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from clerk_backend_api.types import ( + BaseModel, + Nullable, + OptionalNullable, + UNSET, + UNSET_SENTINEL, +) +from enum import Enum +from pydantic import model_serializer +from typing import List, Optional +from typing_extensions import NotRequired, TypedDict + + +class CreateRoleSetType(str, Enum): + r"""The type of the role set. \"initial\" role sets are the default for new organizations. + Only one role set can be \"initial\" per instance. + """ + + INITIAL = "initial" + CUSTOM = "custom" + + +class CreateRoleSetRequestBodyTypedDict(TypedDict): + name: str + r"""The name of the new role set""" + default_role_key: str + r"""The key of the role to use as the default role for new organization members. + Must be one of the roles in the `roles` array. + """ + creator_role_key: str + r"""The key of the role to assign to organization creators. + Must be one of the roles in the `roles` array. + """ + roles: List[str] + r"""Array of role keys to include in the role set. + Must contain at least one role and no more than 10 roles. + """ + key: NotRequired[str] + r"""A unique key for the role set. Must start with 'role_set:' and contain only lowercase alphanumeric characters and underscores. + If not provided, a key will be generated from the name. + """ + description: NotRequired[Nullable[str]] + r"""Optional description for the role set""" + type: NotRequired[CreateRoleSetType] + r"""The type of the role set. \"initial\" role sets are the default for new organizations. + Only one role set can be \"initial\" per instance. + """ + + +class CreateRoleSetRequestBody(BaseModel): + name: str + r"""The name of the new role set""" + + default_role_key: str + r"""The key of the role to use as the default role for new organization members. + Must be one of the roles in the `roles` array. + """ + + creator_role_key: str + r"""The key of the role to assign to organization creators. + Must be one of the roles in the `roles` array. + """ + + roles: List[str] + r"""Array of role keys to include in the role set. + Must contain at least one role and no more than 10 roles. + """ + + key: Optional[str] = None + r"""A unique key for the role set. Must start with 'role_set:' and contain only lowercase alphanumeric characters and underscores. + If not provided, a key will be generated from the name. + """ + + description: OptionalNullable[str] = UNSET + r"""Optional description for the role set""" + + type: Optional[CreateRoleSetType] = None + r"""The type of the role set. \"initial\" role sets are the default for new organizations. + Only one role set can be \"initial\" per instance. + """ + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["key", "description", "type"]) + nullable_fields = set(["description"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/createsamlconnectionop.py b/src/clerk_backend_api/models/createsamlconnectionop.py index 7fb3bcd7..ba940089 100644 --- a/src/clerk_backend_api/models/createsamlconnectionop.py +++ b/src/clerk_backend_api/models/createsamlconnectionop.py @@ -44,6 +44,22 @@ class RequestBodyAttributeMapping(BaseModel): last_name: Optional[str] = None + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["user_id", "email_address", "first_name", "last_name"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m + class RequestBody2TypedDict(TypedDict): name: str @@ -116,49 +132,48 @@ class RequestBody2(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "domain", - "idp_entity_id", - "idp_sso_url", - "idp_certificate", - "idp_metadata_url", - "idp_metadata", - "organization_id", - "attribute_mapping", - "force_authn", - ] - nullable_fields = [ - "idp_entity_id", - "idp_sso_url", - "idp_certificate", - "idp_metadata_url", - "idp_metadata", - "organization_id", - "attribute_mapping", - ] - null_default_fields = [] - + optional_fields = set( + [ + "domain", + "idp_entity_id", + "idp_sso_url", + "idp_certificate", + "idp_metadata_url", + "idp_metadata", + "organization_id", + "attribute_mapping", + "force_authn", + ] + ) + nullable_fields = set( + [ + "idp_entity_id", + "idp_sso_url", + "idp_certificate", + "idp_metadata_url", + "idp_metadata", + "organization_id", + "attribute_mapping", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m @@ -192,6 +207,22 @@ class CreateSAMLConnectionRequestBodyAttributeMapping(BaseModel): last_name: Optional[str] = None + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["user_id", "email_address", "first_name", "last_name"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m + class RequestBody1TypedDict(TypedDict): name: str @@ -268,49 +299,48 @@ class RequestBody1(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "domains", - "idp_entity_id", - "idp_sso_url", - "idp_certificate", - "idp_metadata_url", - "idp_metadata", - "organization_id", - "attribute_mapping", - "force_authn", - ] - nullable_fields = [ - "idp_entity_id", - "idp_sso_url", - "idp_certificate", - "idp_metadata_url", - "idp_metadata", - "organization_id", - "attribute_mapping", - ] - null_default_fields = [] - + optional_fields = set( + [ + "domains", + "idp_entity_id", + "idp_sso_url", + "idp_certificate", + "idp_metadata_url", + "idp_metadata", + "organization_id", + "attribute_mapping", + "force_authn", + ] + ) + nullable_fields = set( + [ + "idp_entity_id", + "idp_sso_url", + "idp_certificate", + "idp_metadata_url", + "idp_metadata", + "organization_id", + "attribute_mapping", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/createsessionop.py b/src/clerk_backend_api/models/createsessionop.py index a626c15f..f89e69a5 100644 --- a/src/clerk_backend_api/models/createsessionop.py +++ b/src/clerk_backend_api/models/createsessionop.py @@ -1,7 +1,8 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL +from pydantic import model_serializer from typing import Optional from typing_extensions import NotRequired, TypedDict @@ -19,3 +20,19 @@ class CreateSessionRequestBody(BaseModel): active_organization_id: Optional[str] = None r"""The ID of the organization to set as active for this session""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["active_organization_id"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/createsessiontokenfromtemplateop.py b/src/clerk_backend_api/models/createsessiontokenfromtemplateop.py index 756cb9eb..7f5a807d 100644 --- a/src/clerk_backend_api/models/createsessiontokenfromtemplateop.py +++ b/src/clerk_backend_api/models/createsessiontokenfromtemplateop.py @@ -26,31 +26,26 @@ class CreateSessionTokenFromTemplateRequestBody(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["expires_in_seconds"] - nullable_fields = ["expires_in_seconds"] - null_default_fields = [] - + optional_fields = set(["expires_in_seconds"]) + nullable_fields = set(["expires_in_seconds"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m @@ -79,6 +74,22 @@ class CreateSessionTokenFromTemplateRequest(BaseModel): FieldMetadata(request=RequestMetadata(media_type="application/json")), ] = None + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["RequestBody"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m + class CreateSessionTokenFromTemplateObject(str, Enum): TOKEN = "token" @@ -97,3 +108,19 @@ class CreateSessionTokenFromTemplateResponseBody(BaseModel): object: Optional[CreateSessionTokenFromTemplateObject] = None jwt: Optional[str] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["object", "jwt"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/createsessiontokenop.py b/src/clerk_backend_api/models/createsessiontokenop.py index 01c5b0ed..20e94f2d 100644 --- a/src/clerk_backend_api/models/createsessiontokenop.py +++ b/src/clerk_backend_api/models/createsessiontokenop.py @@ -26,31 +26,26 @@ class CreateSessionTokenRequestBody(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["expires_in_seconds"] - nullable_fields = ["expires_in_seconds"] - null_default_fields = [] - + optional_fields = set(["expires_in_seconds"]) + nullable_fields = set(["expires_in_seconds"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m @@ -72,6 +67,22 @@ class CreateSessionTokenRequest(BaseModel): FieldMetadata(request=RequestMetadata(media_type="application/json")), ] = None + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["RequestBody"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m + class CreateSessionTokenObject(str, Enum): TOKEN = "token" @@ -90,3 +101,19 @@ class CreateSessionTokenResponseBody(BaseModel): object: Optional[CreateSessionTokenObject] = None jwt: Optional[str] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["object", "jwt"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/createsignintokenop.py b/src/clerk_backend_api/models/createsignintokenop.py index 4b45ca7a..b665cfde 100644 --- a/src/clerk_backend_api/models/createsignintokenop.py +++ b/src/clerk_backend_api/models/createsignintokenop.py @@ -31,30 +31,25 @@ class CreateSignInTokenRequestBody(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["expires_in_seconds"] - nullable_fields = ["expires_in_seconds"] - null_default_fields = [] - + optional_fields = set(["expires_in_seconds"]) + nullable_fields = set(["expires_in_seconds"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/createuserop.py b/src/clerk_backend_api/models/createuserop.py index b2a17314..f205ba78 100644 --- a/src/clerk_backend_api/models/createuserop.py +++ b/src/clerk_backend_api/models/createuserop.py @@ -58,7 +58,7 @@ class CreateUserRequestBodyTypedDict(TypedDict): The algorithms we support at the moment are [`bcrypt`](https://en.wikipedia.org/wiki/Bcrypt), [`bcrypt_sha256_django`](https://docs.djangoproject.com/en/4.0/topics/auth/passwords/), [`md5`](https://en.wikipedia.org/wiki/MD5), `pbkdf2_sha1`, `pbkdf2_sha256`, [`pbkdf2_sha256_django`](https://docs.djangoproject.com/en/4.0/topics/auth/passwords/), [`phpass`](https://www.openwall.com/phpass/), `md5_phpass`, [`scrypt_firebase`](https://firebaseopensource.com/projects/firebase/scrypt/), [`scrypt_werkzeug`](https://werkzeug.palletsprojects.com/en/3.0.x/utils/#werkzeug.security.generate_password_hash), [`sha256`](https://en.wikipedia.org/wiki/SHA-2), - [`ldap_ssha`](https://www.openldap.org/faq/data/cache/347.html) and the [`argon2`](https://argon2.online/) variants: `argon2i` and `argon2id`. + [`ldap_ssha`](https://www.openldap.org/faq/data/cache/347.html), the [`argon2`](https://argon2.online/) variants: `argon2i` and `argon2id`, and `sha512_symfony`, the SHA-512 variant of the [Symfony](https://symfony.com/doc/current/security/passwords.html) legacy hasher. Each of the supported hashers expects the incoming digest to be in a particular format. See the [Clerk docs](https://clerk.com/docs/references/backend/user/create-user) for more information. """ @@ -101,6 +101,12 @@ class CreateUserRequestBodyTypedDict(TypedDict): r"""When set to `true` all legal checks are skipped. It is not recommended to skip legal checks unless you are migrating a user to Clerk. """ + skip_user_requirement: NotRequired[Nullable[bool]] + r"""When set to `true`, identification types are not enforced. + At least one identification type must be enabled and provided on your instance (email, phone, web3 wallet, or username). + Users created without required identification types cannot use those authentication strategies + It is not recommended to use this flag unless you need to allow Clerk UI components to prompt for required fields while BAPI creates users with minimal data, or for migration a user to Clerk. + """ create_organization_enabled: NotRequired[Nullable[bool]] r"""If enabled, user can create organizations via FAPI. @@ -170,7 +176,7 @@ class CreateUserRequestBody(BaseModel): The algorithms we support at the moment are [`bcrypt`](https://en.wikipedia.org/wiki/Bcrypt), [`bcrypt_sha256_django`](https://docs.djangoproject.com/en/4.0/topics/auth/passwords/), [`md5`](https://en.wikipedia.org/wiki/MD5), `pbkdf2_sha1`, `pbkdf2_sha256`, [`pbkdf2_sha256_django`](https://docs.djangoproject.com/en/4.0/topics/auth/passwords/), [`phpass`](https://www.openwall.com/phpass/), `md5_phpass`, [`scrypt_firebase`](https://firebaseopensource.com/projects/firebase/scrypt/), [`scrypt_werkzeug`](https://werkzeug.palletsprojects.com/en/3.0.x/utils/#werkzeug.security.generate_password_hash), [`sha256`](https://en.wikipedia.org/wiki/SHA-2), - [`ldap_ssha`](https://www.openldap.org/faq/data/cache/347.html) and the [`argon2`](https://argon2.online/) variants: `argon2i` and `argon2id`. + [`ldap_ssha`](https://www.openldap.org/faq/data/cache/347.html), the [`argon2`](https://argon2.online/) variants: `argon2i` and `argon2id`, and `sha512_symfony`, the SHA-512 variant of the [Symfony](https://symfony.com/doc/current/security/passwords.html) legacy hasher. Each of the supported hashers expects the incoming digest to be in a particular format. See the [Clerk docs](https://clerk.com/docs/references/backend/user/create-user) for more information. """ @@ -224,6 +230,13 @@ class CreateUserRequestBody(BaseModel): It is not recommended to skip legal checks unless you are migrating a user to Clerk. """ + skip_user_requirement: OptionalNullable[bool] = UNSET + r"""When set to `true`, identification types are not enforced. + At least one identification type must be enabled and provided on your instance (email, phone, web3 wallet, or username). + Users created without required identification types cannot use those authentication strategies + It is not recommended to use this flag unless you need to allow Clerk UI components to prompt for required fields while BAPI creates users with minimal data, or for migration a user to Clerk. + """ + create_organization_enabled: OptionalNullable[bool] = UNSET r"""If enabled, user can create organizations via FAPI. @@ -242,74 +255,75 @@ class CreateUserRequestBody(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "external_id", - "first_name", - "last_name", - "locale", - "email_address", - "phone_number", - "web3_wallet", - "username", - "password", - "password_digest", - "password_hasher", - "skip_password_checks", - "skip_password_requirement", - "totp_secret", - "backup_codes", - "public_metadata", - "private_metadata", - "unsafe_metadata", - "delete_self_enabled", - "legal_accepted_at", - "skip_legal_checks", - "create_organization_enabled", - "create_organizations_limit", - "created_at", - "bypass_client_trust", - ] - nullable_fields = [ - "external_id", - "first_name", - "last_name", - "locale", - "username", - "password", - "password_digest", - "skip_password_checks", - "skip_password_requirement", - "totp_secret", - "delete_self_enabled", - "legal_accepted_at", - "skip_legal_checks", - "create_organization_enabled", - "create_organizations_limit", - "created_at", - "bypass_client_trust", - ] - null_default_fields = [] - + optional_fields = set( + [ + "external_id", + "first_name", + "last_name", + "locale", + "email_address", + "phone_number", + "web3_wallet", + "username", + "password", + "password_digest", + "password_hasher", + "skip_password_checks", + "skip_password_requirement", + "totp_secret", + "backup_codes", + "public_metadata", + "private_metadata", + "unsafe_metadata", + "delete_self_enabled", + "legal_accepted_at", + "skip_legal_checks", + "skip_user_requirement", + "create_organization_enabled", + "create_organizations_limit", + "created_at", + "bypass_client_trust", + ] + ) + nullable_fields = set( + [ + "external_id", + "first_name", + "last_name", + "locale", + "username", + "password", + "password_digest", + "skip_password_checks", + "skip_password_requirement", + "totp_secret", + "delete_self_enabled", + "legal_accepted_at", + "skip_legal_checks", + "skip_user_requirement", + "create_organization_enabled", + "create_organizations_limit", + "created_at", + "bypass_client_trust", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/createwaitlistentryop.py b/src/clerk_backend_api/models/createwaitlistentryop.py index 37bc8f34..e84a44ec 100644 --- a/src/clerk_backend_api/models/createwaitlistentryop.py +++ b/src/clerk_backend_api/models/createwaitlistentryop.py @@ -31,30 +31,25 @@ class CreateWaitlistEntryRequestBody(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["notify"] - nullable_fields = ["notify"] - null_default_fields = [] - + optional_fields = set(["notify"]) + nullable_fields = set(["notify"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/deletebackupcodeop.py b/src/clerk_backend_api/models/deletebackupcodeop.py index 777650fa..2565eb34 100644 --- a/src/clerk_backend_api/models/deletebackupcodeop.py +++ b/src/clerk_backend_api/models/deletebackupcodeop.py @@ -1,8 +1,9 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from clerk_backend_api.utils import FieldMetadata, PathParamMetadata +from pydantic import model_serializer from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -29,3 +30,19 @@ class DeleteBackupCodeResponseBody(BaseModel): r"""Successful operation.""" user_id: Optional[str] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["user_id"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/deletedobject.py b/src/clerk_backend_api/models/deletedobject.py index 12336a6d..b877d03b 100644 --- a/src/clerk_backend_api/models/deletedobject.py +++ b/src/clerk_backend_api/models/deletedobject.py @@ -1,7 +1,8 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL +from pydantic import model_serializer from typing import Optional from typing_extensions import NotRequired, TypedDict @@ -28,3 +29,19 @@ class DeletedObject(BaseModel): slug: Optional[str] = None external_id: Optional[str] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["id", "slug", "external_id"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/deletetotpop.py b/src/clerk_backend_api/models/deletetotpop.py index 183cbef0..0115c3e7 100644 --- a/src/clerk_backend_api/models/deletetotpop.py +++ b/src/clerk_backend_api/models/deletetotpop.py @@ -1,8 +1,9 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from clerk_backend_api.utils import FieldMetadata, PathParamMetadata +from pydantic import model_serializer from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -29,3 +30,19 @@ class DeleteTOTPResponseBody(BaseModel): r"""Successful operation.""" user_id: Optional[str] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["user_id"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/disablemfaop.py b/src/clerk_backend_api/models/disablemfaop.py index 0a4a54d4..fdbf2213 100644 --- a/src/clerk_backend_api/models/disablemfaop.py +++ b/src/clerk_backend_api/models/disablemfaop.py @@ -1,8 +1,9 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from clerk_backend_api.utils import FieldMetadata, PathParamMetadata +from pydantic import model_serializer from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -29,3 +30,19 @@ class DisableMFAResponseBody(BaseModel): r"""Successful operation.""" user_id: Optional[str] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["user_id"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/domain.py b/src/clerk_backend_api/models/domain.py index a6cf35f3..45080d0c 100644 --- a/src/clerk_backend_api/models/domain.py +++ b/src/clerk_backend_api/models/domain.py @@ -58,30 +58,25 @@ class Domain(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["accounts_portal_url", "proxy_url", "cname_targets"] - nullable_fields = ["accounts_portal_url", "proxy_url", "cname_targets"] - null_default_fields = [] - + optional_fields = set(["accounts_portal_url", "proxy_url", "cname_targets"]) + nullable_fields = set(["accounts_portal_url", "proxy_url", "cname_targets"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/emailaddress.py b/src/clerk_backend_api/models/emailaddress.py index db627c66..ebc26505 100644 --- a/src/clerk_backend_api/models/emailaddress.py +++ b/src/clerk_backend_api/models/emailaddress.py @@ -10,10 +10,9 @@ UNSET, UNSET_SENTINEL, ) -from clerk_backend_api.utils import get_discriminator, validate_open_enum +from clerk_backend_api.utils import get_discriminator from enum import Enum from pydantic import Discriminator, Tag, field_serializer, model_serializer -from pydantic.functional_validators import PlainValidator from typing import List, Optional, Union from typing_extensions import Annotated, NotRequired, TypeAliasType, TypedDict @@ -63,31 +62,26 @@ class EmailLink(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["object", "verified_at_client"] - nullable_fields = ["attempts", "expire_at", "verified_at_client"] - null_default_fields = [] - + optional_fields = set(["object", "verified_at_client"]) + nullable_fields = set(["attempts", "expire_at", "verified_at_client"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m @@ -132,6 +126,22 @@ class VerificationSamlErrorClerkError(BaseModel): meta: Optional[ClerkErrorErrorMeta] = None + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["meta"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m + VerificationErrorTypedDict = VerificationSamlErrorClerkErrorTypedDict @@ -169,43 +179,42 @@ class Saml(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "object", - "external_verification_redirect_url", - "error", - "expire_at", - "verified_at_client", - ] - nullable_fields = [ - "external_verification_redirect_url", - "error", - "expire_at", - "attempts", - "verified_at_client", - ] - null_default_fields = [] - + optional_fields = set( + [ + "object", + "external_verification_redirect_url", + "error", + "expire_at", + "verified_at_client", + ] + ) + nullable_fields = set( + [ + "external_verification_redirect_url", + "error", + "expire_at", + "attempts", + "verified_at_client", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m @@ -236,10 +245,7 @@ class TicketTypedDict(TypedDict): class Ticket(BaseModel): status: VerificationTicketVerificationStatus - strategy: Annotated[ - VerificationTicketVerificationStrategy, - PlainValidator(validate_open_enum(False)), - ] + strategy: VerificationTicketVerificationStrategy attempts: Nullable[int] @@ -260,31 +266,26 @@ def serialize_strategy(self, value): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["object", "verified_at_client"] - nullable_fields = ["attempts", "expire_at", "verified_at_client"] - null_default_fields = [] - + optional_fields = set(["object", "verified_at_client"]) + nullable_fields = set(["attempts", "expire_at", "verified_at_client"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m @@ -322,6 +323,22 @@ class ErrorClerkError(BaseModel): meta: Optional[ErrorMeta] = None + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["meta"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m + ErrorTypedDict = ErrorClerkErrorTypedDict @@ -356,31 +373,26 @@ class FromOAuth(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["object", "error", "verified_at_client"] - nullable_fields = ["error", "expire_at", "attempts", "verified_at_client"] - null_default_fields = [] - + optional_fields = set(["object", "error", "verified_at_client"]) + nullable_fields = set(["error", "expire_at", "attempts", "verified_at_client"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m @@ -409,7 +421,7 @@ class AdminTypedDict(TypedDict): class Admin(BaseModel): status: VerificationAdminVerificationStatus - strategy: Annotated[VerificationStrategy, PlainValidator(validate_open_enum(False))] + strategy: VerificationStrategy attempts: Nullable[int] @@ -430,31 +442,26 @@ def serialize_strategy(self, value): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["object", "verified_at_client"] - nullable_fields = ["attempts", "expire_at", "verified_at_client"] - null_default_fields = [] - + optional_fields = set(["object", "verified_at_client"]) + nullable_fields = set(["attempts", "expire_at", "verified_at_client"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m @@ -488,7 +495,7 @@ class OtpTypedDict(TypedDict): class Otp(BaseModel): status: VerificationStatus - strategy: Annotated[Strategy, PlainValidator(validate_open_enum(False))] + strategy: Strategy attempts: Nullable[int] @@ -509,31 +516,26 @@ def serialize_strategy(self, value): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["object", "verified_at_client"] - nullable_fields = ["attempts", "expire_at", "verified_at_client"] - null_default_fields = [] - + optional_fields = set(["object", "verified_at_client"]) + nullable_fields = set(["attempts", "expire_at", "verified_at_client"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m @@ -593,7 +595,7 @@ class EmailAddressTypedDict(TypedDict): class EmailAddress(BaseModel): r"""Success""" - object: Annotated[EmailAddressObject, PlainValidator(validate_open_enum(False))] + object: EmailAddressObject r"""String representing the object's type. Objects of the same type share the same value. """ @@ -634,30 +636,25 @@ def serialize_object(self, value): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["id", "matches_sso_connection"] - nullable_fields = ["verification"] - null_default_fields = [] - + optional_fields = set(["id", "matches_sso_connection"]) + nullable_fields = set(["verification"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/enterpriseaccount.py b/src/clerk_backend_api/models/enterpriseaccount.py index 0a4dbad2..2582c3c2 100644 --- a/src/clerk_backend_api/models/enterpriseaccount.py +++ b/src/clerk_backend_api/models/enterpriseaccount.py @@ -9,11 +9,10 @@ UNSET, UNSET_SENTINEL, ) -from clerk_backend_api.utils import get_discriminator, validate_open_enum +from clerk_backend_api.utils import get_discriminator from enum import Enum import pydantic from pydantic import Discriminator, Tag, field_serializer, model_serializer -from pydantic.functional_validators import PlainValidator from typing import Any, Dict, List, Optional, Union from typing_extensions import Annotated, NotRequired, TypeAliasType, TypedDict @@ -69,6 +68,22 @@ class VerificationOauthErrorEnterpriseAccountClerkError(BaseModel): meta: Optional[ClerkErrorErrorEnterpriseAccountVerificationMeta] = None + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["meta"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m + VerificationOauthVerificationEnterpriseAccountErrorTypedDict = ( VerificationOauthErrorEnterpriseAccountClerkErrorTypedDict @@ -94,10 +109,7 @@ class VerificationOauthTypedDict(TypedDict): class VerificationOauth(BaseModel): - status: Annotated[ - VerificationOauthVerificationEnterpriseAccountStatus, - PlainValidator(validate_open_enum(False)), - ] + status: VerificationOauthVerificationEnterpriseAccountStatus strategy: str @@ -126,36 +138,33 @@ def serialize_status(self, value): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "object", - "external_verification_redirect_url", - "error", - "verified_at_client", - ] - nullable_fields = ["error", "attempts", "verified_at_client"] - null_default_fields = [] - + optional_fields = set( + [ + "object", + "external_verification_redirect_url", + "error", + "verified_at_client", + ] + ) + nullable_fields = set(["error", "attempts", "verified_at_client"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m @@ -200,6 +209,22 @@ class VerificationSamlErrorEnterpriseAccountClerkError(BaseModel): meta: Optional[ClerkErrorErrorEnterpriseAccountMeta] = None + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["meta"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m + VerificationSamlVerificationEnterpriseAccountErrorTypedDict = ( VerificationSamlErrorEnterpriseAccountClerkErrorTypedDict @@ -243,43 +268,42 @@ class VerificationSAMLVerificationSAML(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "object", - "external_verification_redirect_url", - "error", - "expire_at", - "verified_at_client", - ] - nullable_fields = [ - "external_verification_redirect_url", - "error", - "expire_at", - "attempts", - "verified_at_client", - ] - null_default_fields = [] - + optional_fields = set( + [ + "object", + "external_verification_redirect_url", + "error", + "expire_at", + "verified_at_client", + ] + ) + nullable_fields = set( + [ + "external_verification_redirect_url", + "error", + "expire_at", + "attempts", + "verified_at_client", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m @@ -312,10 +336,7 @@ class VerificationTicketVerificationTicketTypedDict(TypedDict): class VerificationTicketVerificationTicket(BaseModel): status: VerificationTicketVerificationEnterpriseAccountStatus - strategy: Annotated[ - VerificationTicketVerificationEnterpriseAccountStrategy, - PlainValidator(validate_open_enum(False)), - ] + strategy: VerificationTicketVerificationEnterpriseAccountStrategy attempts: Nullable[int] @@ -338,31 +359,26 @@ def serialize_strategy(self, value): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["object", "verified_at_client"] - nullable_fields = ["attempts", "expire_at", "verified_at_client"] - null_default_fields = [] - + optional_fields = set(["object", "verified_at_client"]) + nullable_fields = set(["attempts", "expire_at", "verified_at_client"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m @@ -452,31 +468,26 @@ class EnterpriseConnection2(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["domain"] - nullable_fields = ["logo_public_url"] - null_default_fields = [] - + optional_fields = set(["domain"]) + nullable_fields = set(["logo_public_url"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m @@ -546,31 +557,26 @@ class EnterpriseConnection1(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["domains"] - nullable_fields = ["logo_public_url"] - null_default_fields = [] - + optional_fields = set(["domains"]) + nullable_fields = set(["logo_public_url"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m @@ -661,47 +667,46 @@ class EnterpriseAccount(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "protocol", - "first_name", - "last_name", - "provider_user_id", - "enterprise_connection_id", - "public_metadata", - "enterprise_connection", - "last_authenticated_at", - ] - nullable_fields = [ - "first_name", - "last_name", - "provider_user_id", - "enterprise_connection_id", - "verification", - "enterprise_connection", - "last_authenticated_at", - ] - null_default_fields = [] - + optional_fields = set( + [ + "protocol", + "first_name", + "last_name", + "provider_user_id", + "enterprise_connection_id", + "public_metadata", + "enterprise_connection", + "last_authenticated_at", + ] + ) + nullable_fields = set( + [ + "first_name", + "last_name", + "provider_user_id", + "enterprise_connection_id", + "verification", + "enterprise_connection", + "last_authenticated_at", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/externalaccountwithverification.py b/src/clerk_backend_api/models/externalaccountwithverification.py index 3ebecff5..dcf3d3eb 100644 --- a/src/clerk_backend_api/models/externalaccountwithverification.py +++ b/src/clerk_backend_api/models/externalaccountwithverification.py @@ -9,11 +9,10 @@ UNSET, UNSET_SENTINEL, ) -from clerk_backend_api.utils import get_discriminator, validate_open_enum +from clerk_backend_api.utils import get_discriminator from enum import Enum import pydantic from pydantic import ConfigDict, Discriminator, Tag, field_serializer, model_serializer -from pydantic.functional_validators import PlainValidator from typing import Any, Dict, Optional, Union from typing_extensions import Annotated, NotRequired, TypeAliasType, TypedDict @@ -69,6 +68,22 @@ class VerificationGoogleOneTapErrorClerkError(BaseModel): None ) + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["meta"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m + VerificationGoogleOneTapVerificationErrorTypedDict = ( VerificationGoogleOneTapErrorClerkErrorTypedDict @@ -105,31 +120,26 @@ class GoogleOneTap(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["object", "verified_at_client", "error"] - nullable_fields = ["expire_at", "attempts", "verified_at_client", "error"] - null_default_fields = [] - + optional_fields = set(["object", "verified_at_client", "error"]) + nullable_fields = set(["expire_at", "attempts", "verified_at_client", "error"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m @@ -170,6 +180,22 @@ class VerificationOauthErrorClerkError(BaseModel): meta: Optional[ClerkErrorErrorExternalAccountWithVerificationMeta] = None + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["meta"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m + VerificationOauthVerificationErrorTypedDict = VerificationOauthErrorClerkErrorTypedDict @@ -189,9 +215,7 @@ class OauthTypedDict(TypedDict): class Oauth(BaseModel): - status: Annotated[ - VerificationOauthVerificationStatus, PlainValidator(validate_open_enum(False)) - ] + status: VerificationOauthVerificationStatus strategy: str @@ -218,36 +242,33 @@ def serialize_status(self, value): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "object", - "external_verification_redirect_url", - "error", - "verified_at_client", - ] - nullable_fields = ["error", "attempts", "verified_at_client"] - null_default_fields = [] - + optional_fields = set( + [ + "object", + "external_verification_redirect_url", + "error", + "verified_at_client", + ] + ) + nullable_fields = set(["error", "attempts", "verified_at_client"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m @@ -363,44 +384,31 @@ def additional_properties(self, value): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "avatar_url", - "image_url", - "username", - "phone_number", - "label", - ] - nullable_fields = [ - "image_url", - "username", - "phone_number", - "label", - "verification", - ] - null_default_fields = [] - + optional_fields = set( + ["avatar_url", "image_url", "username", "phone_number", "label"] + ) + nullable_fields = set( + ["image_url", "username", "phone_number", "label", "verification"] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val - + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val for k, v in serialized.items(): m[k] = v diff --git a/src/clerk_backend_api/models/featureresponse.py b/src/clerk_backend_api/models/featureresponse.py index 15df0bb3..0843f3e3 100644 --- a/src/clerk_backend_api/models/featureresponse.py +++ b/src/clerk_backend_api/models/featureresponse.py @@ -49,30 +49,14 @@ class FeatureResponse(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [] - nullable_fields = ["description", "avatar_url"] - null_default_fields = [] - serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): + if val != UNSET_SENTINEL: m[k] = val return m diff --git a/src/clerk_backend_api/models/getapikeyop.py b/src/clerk_backend_api/models/getapikeyop.py index 05b6abd4..25db1110 100644 --- a/src/clerk_backend_api/models/getapikeyop.py +++ b/src/clerk_backend_api/models/getapikeyop.py @@ -119,10 +119,14 @@ class GetAPIKeyResponseBodyTypedDict(TypedDict): revocation_reason: Nullable[str] expired: bool expiration: Nullable[float] + r"""The timestamp for when the API key will expire, in milliseconds""" created_by: Nullable[str] last_used_at: Nullable[float] + r"""The timestamp for when the API key was last used, in milliseconds""" created_at: float + r"""The timestamp for when the API key was created, in milliseconds""" updated_at: float + r"""The timestamp for when the API key was last updated, in milliseconds""" description: NotRequired[Nullable[str]] @@ -150,50 +154,51 @@ class GetAPIKeyResponseBody(BaseModel): expired: bool expiration: Nullable[float] + r"""The timestamp for when the API key will expire, in milliseconds""" created_by: Nullable[str] last_used_at: Nullable[float] + r"""The timestamp for when the API key was last used, in milliseconds""" created_at: float + r"""The timestamp for when the API key was created, in milliseconds""" updated_at: float + r"""The timestamp for when the API key was last updated, in milliseconds""" description: OptionalNullable[str] = UNSET @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["description"] - nullable_fields = [ - "description", - "claims", - "revocation_reason", - "expiration", - "created_by", - "last_used_at", - ] - null_default_fields = [] - + optional_fields = set(["description"]) + nullable_fields = set( + [ + "description", + "claims", + "revocation_reason", + "expiration", + "created_by", + "last_used_at", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/getapikeysop.py b/src/clerk_backend_api/models/getapikeysop.py index fedc2900..e96843c7 100644 --- a/src/clerk_backend_api/models/getapikeysop.py +++ b/src/clerk_backend_api/models/getapikeysop.py @@ -64,31 +64,26 @@ class GetAPIKeysRequest(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["type", "include_invalid", "limit", "offset", "query"] - nullable_fields = ["offset"] - null_default_fields = [] - + optional_fields = set(["type", "include_invalid", "limit", "offset", "query"]) + nullable_fields = set(["offset"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m @@ -179,10 +174,14 @@ class DataTypedDict(TypedDict): revocation_reason: Nullable[str] expired: bool expiration: Nullable[float] + r"""The timestamp for when the API key will expire, in milliseconds""" created_by: Nullable[str] last_used_at: Nullable[float] + r"""The timestamp for when the API key was last used, in milliseconds""" created_at: float + r"""The timestamp for when the API key was created, in milliseconds""" updated_at: float + r"""The timestamp for when the API key was last updated, in milliseconds""" description: NotRequired[Nullable[str]] @@ -208,51 +207,52 @@ class Data(BaseModel): expired: bool expiration: Nullable[float] + r"""The timestamp for when the API key will expire, in milliseconds""" created_by: Nullable[str] last_used_at: Nullable[float] + r"""The timestamp for when the API key was last used, in milliseconds""" created_at: float + r"""The timestamp for when the API key was created, in milliseconds""" updated_at: float + r"""The timestamp for when the API key was last updated, in milliseconds""" description: OptionalNullable[str] = UNSET @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["description"] - nullable_fields = [ - "description", - "claims", - "revocation_reason", - "expiration", - "created_by", - "last_used_at", - ] - null_default_fields = [] - + optional_fields = set(["description"]) + nullable_fields = set( + [ + "description", + "claims", + "revocation_reason", + "expiration", + "created_by", + "last_used_at", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/getbillingstatementlistop.py b/src/clerk_backend_api/models/getbillingstatementlistop.py index 208bbbbd..00de5ed1 100644 --- a/src/clerk_backend_api/models/getbillingstatementlistop.py +++ b/src/clerk_backend_api/models/getbillingstatementlistop.py @@ -1,8 +1,9 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from clerk_backend_api.utils import FieldMetadata, QueryParamMetadata +from pydantic import model_serializer from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -50,3 +51,19 @@ class GetBillingStatementListRequest(BaseModel): Needs to be an integer greater or equal to zero. To be used in conjunction with `limit`. """ + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["paginated", "limit", "offset"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/getbillingstatementpaymentattemptsop.py b/src/clerk_backend_api/models/getbillingstatementpaymentattemptsop.py index 85394ee2..030342fc 100644 --- a/src/clerk_backend_api/models/getbillingstatementpaymentattemptsop.py +++ b/src/clerk_backend_api/models/getbillingstatementpaymentattemptsop.py @@ -1,9 +1,10 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from clerk_backend_api.utils import FieldMetadata, PathParamMetadata, QueryParamMetadata import pydantic +from pydantic import model_serializer from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -60,3 +61,19 @@ class GetBillingStatementPaymentAttemptsRequest(BaseModel): Needs to be an integer greater or equal to zero. To be used in conjunction with `limit`. """ + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["paginated", "limit", "offset"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/getclientlistop.py b/src/clerk_backend_api/models/getclientlistop.py index 9ac64876..dccb9264 100644 --- a/src/clerk_backend_api/models/getclientlistop.py +++ b/src/clerk_backend_api/models/getclientlistop.py @@ -1,8 +1,9 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from clerk_backend_api.utils import FieldMetadata, QueryParamMetadata +from pydantic import model_serializer from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -50,3 +51,19 @@ class GetClientListRequest(BaseModel): Needs to be an integer greater or equal to zero. To be used in conjunction with `limit`. """ + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["paginated", "limit", "offset"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/getcommerceplanlistop.py b/src/clerk_backend_api/models/getcommerceplanlistop.py index b50d2357..26ca1096 100644 --- a/src/clerk_backend_api/models/getcommerceplanlistop.py +++ b/src/clerk_backend_api/models/getcommerceplanlistop.py @@ -1,9 +1,10 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from clerk_backend_api.utils import FieldMetadata, QueryParamMetadata from enum import Enum +from pydantic import model_serializer from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -66,3 +67,19 @@ class GetCommercePlanListRequest(BaseModel): FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), ] = None r"""Filter plans by payer type""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["paginated", "limit", "offset", "payer_type"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/getcommercesubscriptionitemlistop.py b/src/clerk_backend_api/models/getcommercesubscriptionitemlistop.py index 35354d99..fa30888e 100644 --- a/src/clerk_backend_api/models/getcommercesubscriptionitemlistop.py +++ b/src/clerk_backend_api/models/getcommercesubscriptionitemlistop.py @@ -1,9 +1,10 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from clerk_backend_api.utils import FieldMetadata, QueryParamMetadata from enum import Enum +from pydantic import model_serializer from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -108,3 +109,30 @@ class GetCommerceSubscriptionItemListRequest(BaseModel): FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), ] = None r"""Search query to filter subscription items""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + [ + "paginated", + "limit", + "offset", + "status", + "payer_type", + "plan_id", + "include_free", + "query", + ] + ) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/getm2mtokensop.py b/src/clerk_backend_api/models/getm2mtokensop.py index da9614fe..b8f3d7c8 100644 --- a/src/clerk_backend_api/models/getm2mtokensop.py +++ b/src/clerk_backend_api/models/getm2mtokensop.py @@ -53,31 +53,26 @@ class GetM2MTokensRequest(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["revoked", "expired", "limit", "offset"] - nullable_fields = ["revoked", "expired", "offset"] - null_default_fields = [] - + optional_fields = set(["revoked", "expired", "limit", "offset"]) + nullable_fields = set(["revoked", "expired", "offset"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m @@ -199,9 +194,13 @@ class M2mTokensTypedDict(TypedDict): revocation_reason: Nullable[str] expired: bool expiration: Nullable[float] + r"""The timestamp for when the token will expire, in milliseconds""" last_used_at: Nullable[float] + r"""The timestamp for when the token was last used, in milliseconds""" created_at: float + r"""The timestamp for when the token was created, in milliseconds""" updated_at: float + r"""The timestamp for when the token was last updated, in milliseconds""" claims: NotRequired[Nullable[Any]] scopes: NotRequired[List[str]] @@ -220,12 +219,16 @@ class M2mTokens(BaseModel): expired: bool expiration: Nullable[float] + r"""The timestamp for when the token will expire, in milliseconds""" last_used_at: Nullable[float] + r"""The timestamp for when the token was last used, in milliseconds""" created_at: float + r"""The timestamp for when the token was created, in milliseconds""" updated_at: float + r"""The timestamp for when the token was last updated, in milliseconds""" claims: OptionalNullable[Any] = UNSET @@ -233,31 +236,28 @@ class M2mTokens(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["claims", "scopes"] - nullable_fields = ["claims", "revocation_reason", "expiration", "last_used_at"] - null_default_fields = [] - + optional_fields = set(["claims", "scopes"]) + nullable_fields = set( + ["claims", "revocation_reason", "expiration", "last_used_at"] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/getoauthaccesstokenop.py b/src/clerk_backend_api/models/getoauthaccesstokenop.py index 714025ba..7d841693 100644 --- a/src/clerk_backend_api/models/getoauthaccesstokenop.py +++ b/src/clerk_backend_api/models/getoauthaccesstokenop.py @@ -1,8 +1,9 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from clerk_backend_api.utils import FieldMetadata, PathParamMetadata, QueryParamMetadata +from pydantic import model_serializer from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -64,3 +65,19 @@ class GetOAuthAccessTokenRequest(BaseModel): Needs to be an integer greater or equal to zero. To be used in conjunction with `limit`. """ + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["paginated", "limit", "offset"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/getorganizationop.py b/src/clerk_backend_api/models/getorganizationop.py index c6db0f2b..89708f86 100644 --- a/src/clerk_backend_api/models/getorganizationop.py +++ b/src/clerk_backend_api/models/getorganizationop.py @@ -1,8 +1,9 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from clerk_backend_api.utils import FieldMetadata, PathParamMetadata, QueryParamMetadata +from pydantic import model_serializer from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -33,3 +34,24 @@ class GetOrganizationRequest(BaseModel): FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), ] = None r"""Flag to denote whether or not to include a member with elevated permissions who is not currently a member of the organization.""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + [ + "include_members_count", + "include_missing_member_with_elevated_permissions", + ] + ) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/getpublicinterstitialop.py b/src/clerk_backend_api/models/getpublicinterstitialop.py index eab66069..bbe1fc01 100644 --- a/src/clerk_backend_api/models/getpublicinterstitialop.py +++ b/src/clerk_backend_api/models/getpublicinterstitialop.py @@ -1,9 +1,10 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from clerk_backend_api.utils import FieldMetadata, QueryParamMetadata import pydantic +from pydantic import model_serializer from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -72,3 +73,29 @@ class GetPublicInterstitialRequest(BaseModel): FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), ] = None r"""Whether to use the domain for the script URL""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + [ + "frontendApiQueryParameter", + "frontend_apiQueryParameter1", + "publishable_key", + "proxy_url", + "domain", + "sign_in_url", + "use_domain_for_script", + ] + ) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/getrolesetop.py b/src/clerk_backend_api/models/getrolesetop.py new file mode 100644 index 00000000..4e1f452b --- /dev/null +++ b/src/clerk_backend_api/models/getrolesetop.py @@ -0,0 +1,18 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from clerk_backend_api.types import BaseModel +from clerk_backend_api.utils import FieldMetadata, PathParamMetadata +from typing_extensions import Annotated, TypedDict + + +class GetRoleSetRequestTypedDict(TypedDict): + role_set_key_or_id: str + r"""The key or ID of the role set""" + + +class GetRoleSetRequest(BaseModel): + role_set_key_or_id: Annotated[ + str, FieldMetadata(path=PathParamMetadata(style="simple", explode=False)) + ] + r"""The key or ID of the role set""" diff --git a/src/clerk_backend_api/models/getsessionlistop.py b/src/clerk_backend_api/models/getsessionlistop.py index 5b8d0255..7c072fed 100644 --- a/src/clerk_backend_api/models/getsessionlistop.py +++ b/src/clerk_backend_api/models/getsessionlistop.py @@ -1,9 +1,10 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from clerk_backend_api.utils import FieldMetadata, QueryParamMetadata from enum import Enum +from pydantic import model_serializer from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -87,3 +88,21 @@ class GetSessionListRequest(BaseModel): Needs to be an integer greater or equal to zero. To be used in conjunction with `limit`. """ + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + ["client_id", "user_id", "status", "paginated", "limit", "offset"] + ) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/gettemplatelistop.py b/src/clerk_backend_api/models/gettemplatelistop.py index e8d77fcb..22b0b526 100644 --- a/src/clerk_backend_api/models/gettemplatelistop.py +++ b/src/clerk_backend_api/models/gettemplatelistop.py @@ -1,9 +1,10 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from clerk_backend_api.utils import FieldMetadata, PathParamMetadata, QueryParamMetadata from enum import Enum +from pydantic import model_serializer from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -66,3 +67,19 @@ class GetTemplateListRequest(BaseModel): Needs to be an integer greater or equal to zero. To be used in conjunction with `limit`. """ + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["paginated", "limit", "offset"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/getuserlistop.py b/src/clerk_backend_api/models/getuserlistop.py index 9d8e72de..acc21a93 100644 --- a/src/clerk_backend_api/models/getuserlistop.py +++ b/src/clerk_backend_api/models/getuserlistop.py @@ -1,9 +1,10 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from clerk_backend_api.utils import FieldMetadata, QueryParamMetadata import pydantic +from pydantic import model_serializer from typing import List, Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -310,3 +311,43 @@ class GetUserListRequest(BaseModel): If you don't use `+` or `-`, then `+` is implied. We only support one `order_by` parameter, and if multiple `order_by` parameters are provided, we will only keep the first one. For example, if you pass `order_by=username&order_by=created_at`, we will consider only the first `order_by` parameter, which is `username`. The `created_at` parameter will be ignored in this case. """ + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + [ + "email_address", + "phone_number", + "external_id", + "username", + "web3_wallet", + "user_id", + "organization_id", + "query", + "email_address_query", + "phone_number_query", + "username_query", + "name_query", + "banned", + "last_active_at_before", + "last_active_at_after", + "last_active_at_since", + "created_at_before", + "created_at_after", + "limit", + "offset", + "order_by", + ] + ) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/getuserscountop.py b/src/clerk_backend_api/models/getuserscountop.py index a44be932..af71e4d3 100644 --- a/src/clerk_backend_api/models/getuserscountop.py +++ b/src/clerk_backend_api/models/getuserscountop.py @@ -1,9 +1,10 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from clerk_backend_api.utils import FieldMetadata, QueryParamMetadata import pydantic +from pydantic import model_serializer from typing import List, Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -246,3 +247,40 @@ class GetUsersCountRequest(BaseModel): r"""Returns users who have been created after the given date (with millisecond precision). Example: use 1730160000000 to retrieve users who have been created after 2024-10-29. """ + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + [ + "email_address", + "phone_number", + "external_id", + "username", + "web3_wallet", + "user_id", + "organization_id", + "query", + "email_address_query", + "phone_number_query", + "username_query", + "name_query", + "banned", + "last_active_at_before", + "last_active_at_after", + "last_active_at_since", + "created_at_before", + "created_at_after", + ] + ) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/instance.py b/src/clerk_backend_api/models/instance.py index b2228de5..ca9f4776 100644 --- a/src/clerk_backend_api/models/instance.py +++ b/src/clerk_backend_api/models/instance.py @@ -38,30 +38,14 @@ class Instance(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [] - nullable_fields = ["allowed_origins"] - null_default_fields = [] - serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): + if val != UNSET_SENTINEL: m[k] = val return m diff --git a/src/clerk_backend_api/models/instancegetorganizationmembershipsop.py b/src/clerk_backend_api/models/instancegetorganizationmembershipsop.py index 8c1c3a2f..348c617e 100644 --- a/src/clerk_backend_api/models/instancegetorganizationmembershipsop.py +++ b/src/clerk_backend_api/models/instancegetorganizationmembershipsop.py @@ -1,8 +1,9 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from clerk_backend_api.utils import FieldMetadata, QueryParamMetadata +from pydantic import model_serializer from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -50,3 +51,19 @@ class InstanceGetOrganizationMembershipsRequest(BaseModel): Needs to be an integer greater or equal to zero. To be used in conjunction with `limit`. """ + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["order_by", "limit", "offset"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/instanceprotect.py b/src/clerk_backend_api/models/instanceprotect.py new file mode 100644 index 00000000..42e583b3 --- /dev/null +++ b/src/clerk_backend_api/models/instanceprotect.py @@ -0,0 +1,28 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from clerk_backend_api.types import BaseModel +from enum import Enum +from typing_extensions import TypedDict + + +class InstanceProtectObject(str, Enum): + INSTANCE_PROTECT = "instance_protect" + + +class InstanceProtectTypedDict(TypedDict): + r"""Success""" + + object: InstanceProtectObject + rules_enabled: bool + specter_enabled: bool + + +class InstanceProtect(BaseModel): + r"""Success""" + + object: InstanceProtectObject + + rules_enabled: bool + + specter_enabled: bool diff --git a/src/clerk_backend_api/models/instancesettings.py b/src/clerk_backend_api/models/instancesettings.py index de9302e1..17df4caf 100644 --- a/src/clerk_backend_api/models/instancesettings.py +++ b/src/clerk_backend_api/models/instancesettings.py @@ -1,8 +1,9 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from enum import Enum +from pydantic import model_serializer from typing import Optional from typing_extensions import NotRequired, TypedDict @@ -40,3 +41,28 @@ class InstanceSettings(BaseModel): progressive_sign_up: Optional[bool] = None enhanced_email_deliverability: Optional[bool] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + [ + "object", + "id", + "restricted_to_allowlist", + "from_email_address", + "progressive_sign_up", + "enhanced_email_deliverability", + ] + ) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/invitation.py b/src/clerk_backend_api/models/invitation.py index f7e91dca..fce61985 100644 --- a/src/clerk_backend_api/models/invitation.py +++ b/src/clerk_backend_api/models/invitation.py @@ -83,30 +83,25 @@ class Invitation(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["revoked", "url", "expires_at"] - nullable_fields = ["expires_at"] - null_default_fields = [] - + optional_fields = set(["revoked", "url", "expires_at"]) + nullable_fields = set(["expires_at"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/invitation_revoked.py b/src/clerk_backend_api/models/invitation_revoked.py index 2f86b96a..de7e1b09 100644 --- a/src/clerk_backend_api/models/invitation_revoked.py +++ b/src/clerk_backend_api/models/invitation_revoked.py @@ -80,30 +80,25 @@ class InvitationRevoked(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["revoked", "url", "expires_at"] - nullable_fields = ["expires_at"] - null_default_fields = [] - + optional_fields = set(["revoked", "url", "expires_at"]) + nullable_fields = set(["expires_at"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/invitewaitlistentryop.py b/src/clerk_backend_api/models/invitewaitlistentryop.py index e28aea11..3fe14c1c 100644 --- a/src/clerk_backend_api/models/invitewaitlistentryop.py +++ b/src/clerk_backend_api/models/invitewaitlistentryop.py @@ -24,31 +24,26 @@ class InviteWaitlistEntryRequestBody(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["ignore_existing"] - nullable_fields = ["ignore_existing"] - null_default_fields = [] - + optional_fields = set(["ignore_existing"]) + nullable_fields = set(["ignore_existing"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m @@ -69,3 +64,19 @@ class InviteWaitlistEntryRequest(BaseModel): Optional[InviteWaitlistEntryRequestBody], FieldMetadata(request=RequestMetadata(media_type="application/json")), ] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["RequestBody"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/jwks.py b/src/clerk_backend_api/models/jwks.py index 75ef182a..6e5a4071 100644 --- a/src/clerk_backend_api/models/jwks.py +++ b/src/clerk_backend_api/models/jwks.py @@ -1,7 +1,8 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL +from pydantic import model_serializer from typing import List, Optional from typing_extensions import NotRequired, TypedDict @@ -34,6 +35,22 @@ class Keys(BaseModel): crv: Optional[str] = None + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["use", "kty", "kid", "alg", "n", "e", "x", "crv"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m + class JwksTypedDict(TypedDict): r"""Get the JSON Web Key Set""" @@ -45,3 +62,19 @@ class Jwks(BaseModel): r"""Get the JSON Web Key Set""" keys: Optional[List[Keys]] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["keys"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/listallorganizationdomainsop.py b/src/clerk_backend_api/models/listallorganizationdomainsop.py index da5228ab..c6651dca 100644 --- a/src/clerk_backend_api/models/listallorganizationdomainsop.py +++ b/src/clerk_backend_api/models/listallorganizationdomainsop.py @@ -1,9 +1,10 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from clerk_backend_api.utils import FieldMetadata, QueryParamMetadata from enum import Enum +from pydantic import model_serializer from typing import List, Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -116,3 +117,29 @@ class ListAllOrganizationDomainsRequest(BaseModel): r"""Applies a limit to the number of results returned. Can be used for paginating the results together with `offset`. """ + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + [ + "organization_id", + "verified", + "enrollment_mode", + "query", + "order_by", + "offset", + "limit", + ] + ) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/listallowlistidentifiersop.py b/src/clerk_backend_api/models/listallowlistidentifiersop.py index 10f12243..ee8bb681 100644 --- a/src/clerk_backend_api/models/listallowlistidentifiersop.py +++ b/src/clerk_backend_api/models/listallowlistidentifiersop.py @@ -1,8 +1,9 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from clerk_backend_api.utils import FieldMetadata, QueryParamMetadata +from pydantic import model_serializer from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -50,3 +51,19 @@ class ListAllowlistIdentifiersRequest(BaseModel): Needs to be an integer greater or equal to zero. To be used in conjunction with `limit`. """ + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["paginated", "limit", "offset"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/listinstanceorganizationinvitationsop.py b/src/clerk_backend_api/models/listinstanceorganizationinvitationsop.py index d2c14488..921c92e8 100644 --- a/src/clerk_backend_api/models/listinstanceorganizationinvitationsop.py +++ b/src/clerk_backend_api/models/listinstanceorganizationinvitationsop.py @@ -1,9 +1,10 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from clerk_backend_api.utils import FieldMetadata, QueryParamMetadata from enum import Enum +from pydantic import model_serializer from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -81,3 +82,19 @@ class ListInstanceOrganizationInvitationsRequest(BaseModel): Needs to be an integer greater or equal to zero. To be used in conjunction with `limit`. """ + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["order_by", "status", "query", "limit", "offset"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/listinvitationsop.py b/src/clerk_backend_api/models/listinvitationsop.py index a688edac..c4e6786d 100644 --- a/src/clerk_backend_api/models/listinvitationsop.py +++ b/src/clerk_backend_api/models/listinvitationsop.py @@ -1,9 +1,10 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from clerk_backend_api.utils import FieldMetadata, QueryParamMetadata from enum import Enum +from pydantic import model_serializer from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -96,3 +97,21 @@ class ListInvitationsRequest(BaseModel): Needs to be an integer greater or equal to zero. To be used in conjunction with `limit`. """ + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + ["status", "query", "order_by", "paginated", "limit", "offset"] + ) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/listjwttemplatesop.py b/src/clerk_backend_api/models/listjwttemplatesop.py index c4d098fb..71c57a80 100644 --- a/src/clerk_backend_api/models/listjwttemplatesop.py +++ b/src/clerk_backend_api/models/listjwttemplatesop.py @@ -1,8 +1,9 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from clerk_backend_api.utils import FieldMetadata, QueryParamMetadata +from pydantic import model_serializer from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -50,3 +51,19 @@ class ListJWTTemplatesRequest(BaseModel): Needs to be an integer greater or equal to zero. To be used in conjunction with `limit`. """ + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["paginated", "limit", "offset"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/listmachinesop.py b/src/clerk_backend_api/models/listmachinesop.py index 8376e843..ce0a3189 100644 --- a/src/clerk_backend_api/models/listmachinesop.py +++ b/src/clerk_backend_api/models/listmachinesop.py @@ -1,8 +1,9 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from clerk_backend_api.utils import FieldMetadata, QueryParamMetadata +from pydantic import model_serializer from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -64,3 +65,19 @@ class ListMachinesRequest(BaseModel): If you don't use `+` or `-`, then `+` is implied. Defaults to `-created_at`. """ + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["limit", "offset", "query", "order_by"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/listoauthapplicationsop.py b/src/clerk_backend_api/models/listoauthapplicationsop.py index e79aafe8..86ab8f49 100644 --- a/src/clerk_backend_api/models/listoauthapplicationsop.py +++ b/src/clerk_backend_api/models/listoauthapplicationsop.py @@ -1,8 +1,9 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from clerk_backend_api.utils import FieldMetadata, QueryParamMetadata +from pydantic import model_serializer from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -64,3 +65,19 @@ class ListOAuthApplicationsRequest(BaseModel): FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), ] = None r"""Returns OAuth applications with names that match the given query, via case-insensitive partial match.""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["limit", "offset", "order_by", "name_query"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/listorganizationdomainsop.py b/src/clerk_backend_api/models/listorganizationdomainsop.py index 6c631f5e..74aec04d 100644 --- a/src/clerk_backend_api/models/listorganizationdomainsop.py +++ b/src/clerk_backend_api/models/listorganizationdomainsop.py @@ -1,8 +1,9 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from clerk_backend_api.utils import FieldMetadata, PathParamMetadata, QueryParamMetadata +from pydantic import model_serializer from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -59,3 +60,19 @@ class ListOrganizationDomainsRequest(BaseModel): Needs to be an integer greater or equal to zero. To be used in conjunction with `limit`. """ + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["verified", "enrollment_mode", "limit", "offset"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/listorganizationinvitationsop.py b/src/clerk_backend_api/models/listorganizationinvitationsop.py index 360a78c1..2ac1a0f9 100644 --- a/src/clerk_backend_api/models/listorganizationinvitationsop.py +++ b/src/clerk_backend_api/models/listorganizationinvitationsop.py @@ -1,9 +1,10 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from clerk_backend_api.utils import FieldMetadata, PathParamMetadata, QueryParamMetadata from enum import Enum +from pydantic import model_serializer from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -88,3 +89,21 @@ class ListOrganizationInvitationsRequest(BaseModel): Needs to be an integer greater or equal to zero. To be used in conjunction with `limit`. """ + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + ["status", "email_address", "order_by", "limit", "offset"] + ) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/listorganizationmembershipsop.py b/src/clerk_backend_api/models/listorganizationmembershipsop.py index 2e4eb2f5..216a09f9 100644 --- a/src/clerk_backend_api/models/listorganizationmembershipsop.py +++ b/src/clerk_backend_api/models/listorganizationmembershipsop.py @@ -1,8 +1,9 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from clerk_backend_api.utils import FieldMetadata, PathParamMetadata, QueryParamMetadata +from pydantic import model_serializer from typing import List, Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -227,3 +228,40 @@ class ListOrganizationMembershipsRequest(BaseModel): Needs to be an integer greater or equal to zero. To be used in conjunction with `limit`. """ + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + [ + "order_by", + "user_id", + "email_address", + "phone_number", + "username", + "web3_wallet", + "role", + "query", + "email_address_query", + "phone_number_query", + "username_query", + "name_query", + "last_active_at_before", + "last_active_at_after", + "created_at_before", + "created_at_after", + "limit", + "offset", + ] + ) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/listorganizationpermissionsop.py b/src/clerk_backend_api/models/listorganizationpermissionsop.py index a8db981b..8dc919ec 100644 --- a/src/clerk_backend_api/models/listorganizationpermissionsop.py +++ b/src/clerk_backend_api/models/listorganizationpermissionsop.py @@ -1,8 +1,9 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from clerk_backend_api.utils import FieldMetadata, QueryParamMetadata +from pydantic import model_serializer from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -64,3 +65,19 @@ class ListOrganizationPermissionsRequest(BaseModel): Needs to be an integer greater or equal to zero. To be used in conjunction with `limit`. """ + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["query", "order_by", "limit", "offset"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/listorganizationrolesop.py b/src/clerk_backend_api/models/listorganizationrolesop.py index c44d28ed..73d80962 100644 --- a/src/clerk_backend_api/models/listorganizationrolesop.py +++ b/src/clerk_backend_api/models/listorganizationrolesop.py @@ -1,8 +1,9 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from clerk_backend_api.utils import FieldMetadata, QueryParamMetadata +from pydantic import model_serializer from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -68,3 +69,19 @@ class ListOrganizationRolesRequest(BaseModel): Needs to be an integer greater or equal to zero. To be used in conjunction with `limit`. """ + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["query", "order_by", "limit", "offset"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/listorganizationsop.py b/src/clerk_backend_api/models/listorganizationsop.py index 4e841d91..2d5518a4 100644 --- a/src/clerk_backend_api/models/listorganizationsop.py +++ b/src/clerk_backend_api/models/listorganizationsop.py @@ -1,8 +1,9 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from clerk_backend_api.utils import FieldMetadata, QueryParamMetadata +from pydantic import model_serializer from typing import List, Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -114,3 +115,30 @@ class ListOrganizationsRequest(BaseModel): Needs to be an integer greater or equal to zero. To be used in conjunction with `limit`. """ + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + [ + "include_members_count", + "include_missing_member_with_elevated_permissions", + "query", + "user_id", + "organization_id", + "order_by", + "limit", + "offset", + ] + ) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/listpendingorganizationinvitationsop.py b/src/clerk_backend_api/models/listpendingorganizationinvitationsop.py index e64d8461..e72d6b5b 100644 --- a/src/clerk_backend_api/models/listpendingorganizationinvitationsop.py +++ b/src/clerk_backend_api/models/listpendingorganizationinvitationsop.py @@ -1,8 +1,9 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from clerk_backend_api.utils import FieldMetadata, PathParamMetadata, QueryParamMetadata +from pydantic import model_serializer from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -43,3 +44,19 @@ class ListPendingOrganizationInvitationsRequest(BaseModel): Needs to be an integer greater or equal to zero. To be used in conjunction with `limit`. """ + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["limit", "offset"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/listredirecturlsop.py b/src/clerk_backend_api/models/listredirecturlsop.py index 8d6508ad..feff6069 100644 --- a/src/clerk_backend_api/models/listredirecturlsop.py +++ b/src/clerk_backend_api/models/listredirecturlsop.py @@ -1,8 +1,9 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from clerk_backend_api.utils import FieldMetadata, QueryParamMetadata +from pydantic import model_serializer from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -50,3 +51,19 @@ class ListRedirectURLsRequest(BaseModel): Needs to be an integer greater or equal to zero. To be used in conjunction with `limit`. """ + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["paginated", "limit", "offset"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/listrolesetsop.py b/src/clerk_backend_api/models/listrolesetsop.py new file mode 100644 index 00000000..2911be6b --- /dev/null +++ b/src/clerk_backend_api/models/listrolesetsop.py @@ -0,0 +1,87 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL +from clerk_backend_api.utils import FieldMetadata, QueryParamMetadata +from pydantic import model_serializer +from typing import Optional +from typing_extensions import Annotated, NotRequired, TypedDict + + +class ListRoleSetsRequestTypedDict(TypedDict): + query: NotRequired[str] + r"""Returns role sets with ID, name, or key that match the given query. + Uses exact match for role set ID and partial match for name and key. + """ + order_by: NotRequired[str] + r"""Allows to return role sets in a particular order. + At the moment, you can order the returned role sets by their `created_at`, `name`, or `key`. + In order to specify the direction, you can use the `+/-` symbols prepended in the property to order by. + For example, if you want role sets to be returned in descending order according to their `created_at` property, you can use `-created_at`. + If you don't use `+` or `-`, then `+` is implied. + Defaults to `-created_at`. + """ + limit: NotRequired[int] + r"""Applies a limit to the number of results returned. + Can be used for paginating the results together with `offset`. + """ + offset: NotRequired[int] + r"""Skip the first `offset` results when paginating. + Needs to be an integer greater or equal to zero. + To be used in conjunction with `limit`. + """ + + +class ListRoleSetsRequest(BaseModel): + query: Annotated[ + Optional[str], + FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), + ] = None + r"""Returns role sets with ID, name, or key that match the given query. + Uses exact match for role set ID and partial match for name and key. + """ + + order_by: Annotated[ + Optional[str], + FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), + ] = "-created_at" + r"""Allows to return role sets in a particular order. + At the moment, you can order the returned role sets by their `created_at`, `name`, or `key`. + In order to specify the direction, you can use the `+/-` symbols prepended in the property to order by. + For example, if you want role sets to be returned in descending order according to their `created_at` property, you can use `-created_at`. + If you don't use `+` or `-`, then `+` is implied. + Defaults to `-created_at`. + """ + + limit: Annotated[ + Optional[int], + FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), + ] = 10 + r"""Applies a limit to the number of results returned. + Can be used for paginating the results together with `offset`. + """ + + offset: Annotated[ + Optional[int], + FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), + ] = 0 + r"""Skip the first `offset` results when paginating. + Needs to be an integer greater or equal to zero. + To be used in conjunction with `limit`. + """ + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["query", "order_by", "limit", "offset"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/listsamlconnectionsop.py b/src/clerk_backend_api/models/listsamlconnectionsop.py index 898c34c3..efdbc3c1 100644 --- a/src/clerk_backend_api/models/listsamlconnectionsop.py +++ b/src/clerk_backend_api/models/listsamlconnectionsop.py @@ -1,8 +1,9 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from clerk_backend_api.utils import FieldMetadata, QueryParamMetadata +from pydantic import model_serializer from typing import List, Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -80,3 +81,21 @@ class ListSAMLConnectionsRequest(BaseModel): excluded from the result set. Accepts up to 100 organization IDs. """ + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + ["limit", "offset", "query", "order_by", "organization_id"] + ) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/listwaitlistentriesop.py b/src/clerk_backend_api/models/listwaitlistentriesop.py index 5c88d455..9f338f94 100644 --- a/src/clerk_backend_api/models/listwaitlistentriesop.py +++ b/src/clerk_backend_api/models/listwaitlistentriesop.py @@ -1,9 +1,10 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from clerk_backend_api.utils import FieldMetadata, QueryParamMetadata from enum import Enum +from pydantic import model_serializer from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -82,3 +83,19 @@ class ListWaitlistEntriesRequest(BaseModel): Use `+` for ascending or `-` for descending order. Defaults to `-created_at`. """ + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["limit", "offset", "query", "status", "order_by"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/machine.py b/src/clerk_backend_api/models/machine.py index 127d3436..ecc64c8f 100644 --- a/src/clerk_backend_api/models/machine.py +++ b/src/clerk_backend_api/models/machine.py @@ -5,8 +5,9 @@ MachineWithoutScopedMachines, MachineWithoutScopedMachinesTypedDict, ) -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from enum import Enum +from pydantic import model_serializer from typing import List, Optional from typing_extensions import NotRequired, TypedDict @@ -56,3 +57,19 @@ class Machine(BaseModel): default_token_ttl: Optional[int] = 3600 r"""The default time-to-live (TTL) in seconds for tokens created by this machine.""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["default_token_ttl"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/machine_created.py b/src/clerk_backend_api/models/machine_created.py index 65fb363d..c0c0ad8e 100644 --- a/src/clerk_backend_api/models/machine_created.py +++ b/src/clerk_backend_api/models/machine_created.py @@ -5,8 +5,9 @@ MachineWithoutScopedMachines, MachineWithoutScopedMachinesTypedDict, ) -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from enum import Enum +from pydantic import model_serializer from typing import List, Optional from typing_extensions import NotRequired, TypedDict @@ -65,3 +66,19 @@ class MachineCreated(BaseModel): default_token_ttl: Optional[int] = 3600 r"""The default time-to-live (TTL) in seconds for tokens created by this machine.""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["default_token_ttl"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/machinewithoutscopedmachines.py b/src/clerk_backend_api/models/machinewithoutscopedmachines.py index e681edbe..d409a13d 100644 --- a/src/clerk_backend_api/models/machinewithoutscopedmachines.py +++ b/src/clerk_backend_api/models/machinewithoutscopedmachines.py @@ -1,8 +1,9 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from enum import Enum +from pydantic import model_serializer from typing import Optional from typing_extensions import NotRequired, TypedDict @@ -47,3 +48,19 @@ class MachineWithoutScopedMachines(BaseModel): default_token_ttl: Optional[int] = 3600 r"""The default time-to-live (TTL) in seconds for tokens created by this machine.""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["default_token_ttl"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/mergeorganizationmetadataop.py b/src/clerk_backend_api/models/mergeorganizationmetadataop.py index e6a889de..23d3fef4 100644 --- a/src/clerk_backend_api/models/mergeorganizationmetadataop.py +++ b/src/clerk_backend_api/models/mergeorganizationmetadataop.py @@ -1,8 +1,9 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from clerk_backend_api.utils import FieldMetadata, PathParamMetadata, RequestMetadata +from pydantic import model_serializer from typing import Any, Dict, Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -29,6 +30,22 @@ class MergeOrganizationMetadataRequestBody(BaseModel): The new object will be merged with the existing value. """ + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["public_metadata", "private_metadata"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m + class MergeOrganizationMetadataRequestTypedDict(TypedDict): organization_id: str diff --git a/src/clerk_backend_api/models/oauthaccesstoken.py b/src/clerk_backend_api/models/oauthaccesstoken.py index 50e8bf2f..69d3f958 100644 --- a/src/clerk_backend_api/models/oauthaccesstoken.py +++ b/src/clerk_backend_api/models/oauthaccesstoken.py @@ -30,6 +30,8 @@ class OAuthAccessTokenTypedDict(TypedDict): label: Nullable[str] scopes: NotRequired[List[str]] r"""The list of scopes that the token is valid for. Only present for OAuth 2.0 tokens.""" + id_token: NotRequired[str] + r"""The ID token retrieved from the OIDC provider. Only present for OIDC-compliant OAuth 2.0 providers when available.""" token_secret: NotRequired[str] r"""The token secret. Only present for OAuth 1.0 tokens.""" @@ -61,35 +63,33 @@ class OAuthAccessToken(BaseModel): scopes: Optional[List[str]] = None r"""The list of scopes that the token is valid for. Only present for OAuth 2.0 tokens.""" + id_token: Optional[str] = None + r"""The ID token retrieved from the OIDC provider. Only present for OIDC-compliant OAuth 2.0 providers when available.""" + token_secret: Optional[str] = None r"""The token secret. Only present for OAuth 1.0 tokens.""" @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["scopes", "token_secret"] - nullable_fields = ["expires_at", "label"] - null_default_fields = [] - + optional_fields = set(["scopes", "id_token", "token_secret"]) + nullable_fields = set(["expires_at", "label"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/oauthapplication.py b/src/clerk_backend_api/models/oauthapplication.py index acb94149..99d09327 100644 --- a/src/clerk_backend_api/models/oauthapplication.py +++ b/src/clerk_backend_api/models/oauthapplication.py @@ -105,30 +105,14 @@ class OAuthApplication(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [] - nullable_fields = ["client_uri", "client_image_url"] - null_default_fields = [] - serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): + if val != UNSET_SENTINEL: m[k] = val return m diff --git a/src/clerk_backend_api/models/oauthapplicationwithsecret.py b/src/clerk_backend_api/models/oauthapplicationwithsecret.py index dac5cd10..6b9d38ce 100644 --- a/src/clerk_backend_api/models/oauthapplicationwithsecret.py +++ b/src/clerk_backend_api/models/oauthapplicationwithsecret.py @@ -114,30 +114,25 @@ class OAuthApplicationWithSecret(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["client_secret"] - nullable_fields = ["client_uri", "client_image_url"] - null_default_fields = [] - + optional_fields = set(["client_secret"]) + nullable_fields = set(["client_uri", "client_image_url"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/organization.py b/src/clerk_backend_api/models/organization.py index 64a04cf5..50eafb8f 100644 --- a/src/clerk_backend_api/models/organization.py +++ b/src/clerk_backend_api/models/organization.py @@ -1,8 +1,9 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from enum import Enum +from pydantic import model_serializer from typing import Any, Dict, Optional from typing_extensions import NotRequired, TypedDict @@ -83,3 +84,29 @@ class Organization(BaseModel): r"""Unix timestamp of last activity. """ + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + [ + "image_url", + "members_count", + "missing_member_with_elevated_permissions", + "pending_invitations_count", + "private_metadata", + "created_by", + "last_active_at", + ] + ) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/organizationdomain.py b/src/clerk_backend_api/models/organizationdomain.py index bf1765db..e5a85b23 100644 --- a/src/clerk_backend_api/models/organizationdomain.py +++ b/src/clerk_backend_api/models/organizationdomain.py @@ -65,30 +65,14 @@ class OrganizationDomainVerification(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [] - nullable_fields = ["attempts", "expire_at"] - null_default_fields = [] - serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): + if val != UNSET_SENTINEL: m[k] = val return m @@ -117,6 +101,22 @@ class PublicOrganizationData(BaseModel): image_url: Optional[str] = None + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["image_url"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m + class OrganizationDomainTypedDict(TypedDict): r"""An organization domain""" @@ -192,34 +192,27 @@ class OrganizationDomain(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["public_organization_data"] - nullable_fields = [ - "affiliation_email_address", - "verification", - "public_organization_data", - ] - null_default_fields = [] - + optional_fields = set(["public_organization_data"]) + nullable_fields = set( + ["affiliation_email_address", "verification", "public_organization_data"] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/organizationinvitation.py b/src/clerk_backend_api/models/organizationinvitation.py index d09d25b8..bb562787 100644 --- a/src/clerk_backend_api/models/organizationinvitation.py +++ b/src/clerk_backend_api/models/organizationinvitation.py @@ -87,30 +87,27 @@ class OrganizationInvitation(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["organization_id", "status", "private_metadata"] - nullable_fields = ["inviter_id", "public_inviter_data", "url", "expires_at"] - null_default_fields = [] - + optional_fields = set(["organization_id", "status", "private_metadata"]) + nullable_fields = set( + ["inviter_id", "public_inviter_data", "url", "expires_at"] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/organizationinvitationpublicorganizationdata.py b/src/clerk_backend_api/models/organizationinvitationpublicorganizationdata.py index 74979897..14174a92 100644 --- a/src/clerk_backend_api/models/organizationinvitationpublicorganizationdata.py +++ b/src/clerk_backend_api/models/organizationinvitationpublicorganizationdata.py @@ -1,7 +1,8 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL +from pydantic import model_serializer from typing import Optional from typing_extensions import NotRequired, TypedDict @@ -24,3 +25,19 @@ class OrganizationInvitationPublicOrganizationData(BaseModel): has_image: bool image_url: Optional[str] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["image_url"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/organizationinvitationpublicuserdata.py b/src/clerk_backend_api/models/organizationinvitationpublicuserdata.py index c67130b9..1bcc9a7a 100644 --- a/src/clerk_backend_api/models/organizationinvitationpublicuserdata.py +++ b/src/clerk_backend_api/models/organizationinvitationpublicuserdata.py @@ -34,30 +34,14 @@ class OrganizationInvitationPublicUserData(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [] - nullable_fields = ["first_name", "last_name"] - null_default_fields = [] - serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): + if val != UNSET_SENTINEL: m[k] = val return m diff --git a/src/clerk_backend_api/models/organizationinvitationwithpublicorganizationdata.py b/src/clerk_backend_api/models/organizationinvitationwithpublicorganizationdata.py index b34be584..8b5b670b 100644 --- a/src/clerk_backend_api/models/organizationinvitationwithpublicorganizationdata.py +++ b/src/clerk_backend_api/models/organizationinvitationwithpublicorganizationdata.py @@ -98,35 +98,34 @@ class OrganizationInvitationWithPublicOrganizationData(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "organization_id", - "status", - "private_metadata", - "public_organization_data", - ] - nullable_fields = ["inviter_id", "public_inviter_data", "url", "expires_at"] - null_default_fields = [] - + optional_fields = set( + [ + "organization_id", + "status", + "private_metadata", + "public_organization_data", + ] + ) + nullable_fields = set( + ["inviter_id", "public_inviter_data", "url", "expires_at"] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/organizationmembership.py b/src/clerk_backend_api/models/organizationmembership.py index 72d3e3f4..8ab12af9 100644 --- a/src/clerk_backend_api/models/organizationmembership.py +++ b/src/clerk_backend_api/models/organizationmembership.py @@ -95,6 +95,32 @@ class OrganizationMembershipOrganization(BaseModel): """ + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + [ + "image_url", + "members_count", + "missing_member_with_elevated_permissions", + "pending_invitations_count", + "private_metadata", + "created_by", + "last_active_at", + ] + ) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m + class OrganizationMembershipTypedDict(TypedDict): r"""Hello world""" @@ -155,30 +181,25 @@ class OrganizationMembership(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["role_name", "private_metadata", "public_user_data"] - nullable_fields = ["permissions"] - null_default_fields = [] - + optional_fields = set(["role_name", "private_metadata", "public_user_data"]) + nullable_fields = set(["permissions"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/organizationmembershippublicuserdata.py b/src/clerk_backend_api/models/organizationmembershippublicuserdata.py index 9997b147..61ec55d0 100644 --- a/src/clerk_backend_api/models/organizationmembershippublicuserdata.py +++ b/src/clerk_backend_api/models/organizationmembershippublicuserdata.py @@ -52,36 +52,27 @@ class OrganizationMembershipPublicUserData(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["identifier", "username"] - nullable_fields = [ - "first_name", - "last_name", - "profile_image_url", - "identifier", - "username", - ] - null_default_fields = [] - + optional_fields = set(["identifier", "username"]) + nullable_fields = set( + ["first_name", "last_name", "profile_image_url", "identifier", "username"] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/organizationsettings.py b/src/clerk_backend_api/models/organizationsettings.py index 6d6462e9..fcc57344 100644 --- a/src/clerk_backend_api/models/organizationsettings.py +++ b/src/clerk_backend_api/models/organizationsettings.py @@ -93,35 +93,32 @@ class OrganizationSettings(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "max_role_sets_allowed", - "max_allowed_permissions", - "slug_disabled", - "initial_role_set_key", - ] - nullable_fields = ["initial_role_set_key"] - null_default_fields = [] - + optional_fields = set( + [ + "max_role_sets_allowed", + "max_allowed_permissions", + "slug_disabled", + "initial_role_set_key", + ] + ) + nullable_fields = set(["initial_role_set_key"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/organizationwithlogo.py b/src/clerk_backend_api/models/organizationwithlogo.py index 26ef758c..3610c3fd 100644 --- a/src/clerk_backend_api/models/organizationwithlogo.py +++ b/src/clerk_backend_api/models/organizationwithlogo.py @@ -1,9 +1,10 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from enum import Enum import pydantic +from pydantic import model_serializer from typing import Any, Dict, Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -92,3 +93,29 @@ class OrganizationWithLogo(BaseModel): deprecated="warning: ** DEPRECATED ** - This will be removed in a future release, please migrate away from it as soon as possible." ), ] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + [ + "members_count", + "missing_member_with_elevated_permissions", + "pending_invitations_count", + "private_metadata", + "created_by", + "last_active_at", + "logo_url", + ] + ) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/passkey.py b/src/clerk_backend_api/models/passkey.py index 0cd3ee9f..e5e379fc 100644 --- a/src/clerk_backend_api/models/passkey.py +++ b/src/clerk_backend_api/models/passkey.py @@ -66,31 +66,28 @@ class VerificationPasskey(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["object", "nonce", "message", "verified_at_client"] - nullable_fields = ["message", "attempts", "expire_at", "verified_at_client"] - null_default_fields = [] - + optional_fields = set(["object", "nonce", "message", "verified_at_client"]) + nullable_fields = set( + ["message", "attempts", "expire_at", "verified_at_client"] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m @@ -134,30 +131,25 @@ class Passkey(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["id"] - nullable_fields = ["verification"] - null_default_fields = [] - + optional_fields = set(["id"]) + nullable_fields = set(["verification"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/phonenumber.py b/src/clerk_backend_api/models/phonenumber.py index 12f5fc73..775ecbba 100644 --- a/src/clerk_backend_api/models/phonenumber.py +++ b/src/clerk_backend_api/models/phonenumber.py @@ -10,10 +10,9 @@ UNSET, UNSET_SENTINEL, ) -from clerk_backend_api.utils import get_discriminator, validate_open_enum +from clerk_backend_api.utils import get_discriminator from enum import Enum from pydantic import Discriminator, Tag, field_serializer, model_serializer -from pydantic.functional_validators import PlainValidator from typing import List, Optional, Union from typing_extensions import Annotated, NotRequired, TypeAliasType, TypedDict @@ -48,9 +47,7 @@ class VerificationAdminTypedDict(TypedDict): class VerificationAdmin(BaseModel): status: VerificationAdminVerificationPhoneNumberStatus - strategy: Annotated[ - VerificationAdminVerificationStrategy, PlainValidator(validate_open_enum(False)) - ] + strategy: VerificationAdminVerificationStrategy attempts: Nullable[int] @@ -71,31 +68,26 @@ def serialize_strategy(self, value): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["object", "verified_at_client"] - nullable_fields = ["attempts", "expire_at", "verified_at_client"] - null_default_fields = [] - + optional_fields = set(["object", "verified_at_client"]) + nullable_fields = set(["attempts", "expire_at", "verified_at_client"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m @@ -129,9 +121,7 @@ class VerificationOTPTypedDict(TypedDict): class VerificationOTP(BaseModel): status: VerificationOtpVerificationStatus - strategy: Annotated[ - VerificationOtpVerificationStrategy, PlainValidator(validate_open_enum(False)) - ] + strategy: VerificationOtpVerificationStrategy attempts: Nullable[int] @@ -152,31 +142,26 @@ def serialize_strategy(self, value): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["object", "verified_at_client"] - nullable_fields = ["attempts", "expire_at", "verified_at_client"] - null_default_fields = [] - + optional_fields = set(["object", "verified_at_client"]) + nullable_fields = set(["attempts", "expire_at", "verified_at_client"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m @@ -257,35 +242,32 @@ class PhoneNumber(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "id", - "reserved_for_second_factor", - "default_second_factor", - "backup_codes", - ] - nullable_fields = ["verification", "backup_codes"] - null_default_fields = [] - + optional_fields = set( + [ + "id", + "reserved_for_second_factor", + "default_second_factor", + "backup_codes", + ] + ) + nullable_fields = set(["verification", "backup_codes"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/previewtemplateop.py b/src/clerk_backend_api/models/previewtemplateop.py index c1c2e4c7..1b390881 100644 --- a/src/clerk_backend_api/models/previewtemplateop.py +++ b/src/clerk_backend_api/models/previewtemplateop.py @@ -60,31 +60,28 @@ class PreviewTemplateRequestBody(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["subject", "body", "from_email_name", "reply_to_email_name"] - nullable_fields = ["subject"] - null_default_fields = [] - + optional_fields = set( + ["subject", "body", "from_email_name", "reply_to_email_name"] + ) + nullable_fields = set(["subject"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m @@ -115,6 +112,22 @@ class PreviewTemplateRequest(BaseModel): ] = None r"""Required parameters""" + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["RequestBody"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m + class PreviewTemplateResponseBodyTypedDict(TypedDict): r"""OK""" diff --git a/src/clerk_backend_api/models/pricetransitionrequest.py b/src/clerk_backend_api/models/pricetransitionrequest.py new file mode 100644 index 00000000..7561e538 --- /dev/null +++ b/src/clerk_backend_api/models/pricetransitionrequest.py @@ -0,0 +1,20 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from clerk_backend_api.types import BaseModel +from typing_extensions import TypedDict + + +class PriceTransitionRequestTypedDict(TypedDict): + from_price_id: str + r"""The current price ID of the subscription item.""" + to_price_id: str + r"""The target price ID to transition to.""" + + +class PriceTransitionRequest(BaseModel): + from_price_id: str + r"""The current price ID of the subscription item.""" + + to_price_id: str + r"""The target price ID to transition to.""" diff --git a/src/clerk_backend_api/models/proxycheck.py b/src/clerk_backend_api/models/proxycheck.py index 428941dc..22d2634a 100644 --- a/src/clerk_backend_api/models/proxycheck.py +++ b/src/clerk_backend_api/models/proxycheck.py @@ -63,30 +63,14 @@ class ProxyCheck(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [] - nullable_fields = ["last_run_at"] - null_default_fields = [] - serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): + if val != UNSET_SENTINEL: m[k] = val return m diff --git a/src/clerk_backend_api/models/refreshsessionop.py b/src/clerk_backend_api/models/refreshsessionop.py index 3a966e5d..afc04703 100644 --- a/src/clerk_backend_api/models/refreshsessionop.py +++ b/src/clerk_backend_api/models/refreshsessionop.py @@ -69,31 +69,26 @@ class RefreshSessionRequestBody(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["request_headers", "format", "request_originating_ip"] - nullable_fields = ["request_headers", "format", "request_originating_ip"] - null_default_fields = [] - + optional_fields = set(["request_headers", "format", "request_originating_ip"]) + nullable_fields = set(["request_headers", "format", "request_originating_ip"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m @@ -116,3 +111,19 @@ class RefreshSessionRequest(BaseModel): FieldMetadata(request=RequestMetadata(media_type="application/json")), ] = None r"""Refresh session parameters""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["RequestBody"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/replaceroleinrolesetop.py b/src/clerk_backend_api/models/replaceroleinrolesetop.py new file mode 100644 index 00000000..939bea74 --- /dev/null +++ b/src/clerk_backend_api/models/replaceroleinrolesetop.py @@ -0,0 +1,39 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from clerk_backend_api.types import BaseModel +from clerk_backend_api.utils import FieldMetadata, PathParamMetadata, RequestMetadata +from typing_extensions import Annotated, TypedDict + + +class ReplaceRoleInRoleSetRequestBodyTypedDict(TypedDict): + role_key: str + r"""The key of the role to remove from the role set""" + to_role_key: str + r"""The key of the role to reassign members to""" + + +class ReplaceRoleInRoleSetRequestBody(BaseModel): + role_key: str + r"""The key of the role to remove from the role set""" + + to_role_key: str + r"""The key of the role to reassign members to""" + + +class ReplaceRoleInRoleSetRequestTypedDict(TypedDict): + role_set_key_or_id: str + r"""The key or ID of the role set""" + request_body: ReplaceRoleInRoleSetRequestBodyTypedDict + + +class ReplaceRoleInRoleSetRequest(BaseModel): + role_set_key_or_id: Annotated[ + str, FieldMetadata(path=PathParamMetadata(style="simple", explode=False)) + ] + r"""The key or ID of the role set""" + + request_body: Annotated[ + ReplaceRoleInRoleSetRequestBody, + FieldMetadata(request=RequestMetadata(media_type="application/json")), + ] diff --git a/src/clerk_backend_api/models/replacerolesetop.py b/src/clerk_backend_api/models/replacerolesetop.py new file mode 100644 index 00000000..d114cc0f --- /dev/null +++ b/src/clerk_backend_api/models/replacerolesetop.py @@ -0,0 +1,61 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL +from clerk_backend_api.utils import FieldMetadata, PathParamMetadata, RequestMetadata +from pydantic import model_serializer +from typing import Dict, Optional +from typing_extensions import Annotated, NotRequired, TypedDict + + +class ReplaceRoleSetRequestBodyTypedDict(TypedDict): + dest_role_set_key: str + r"""The key of the destination role set""" + reassignment_mappings: NotRequired[Dict[str, str]] + r"""Mappings from source role keys to destination role keys. + Required if members have roles that need to be reassigned. + """ + + +class ReplaceRoleSetRequestBody(BaseModel): + dest_role_set_key: str + r"""The key of the destination role set""" + + reassignment_mappings: Optional[Dict[str, str]] = None + r"""Mappings from source role keys to destination role keys. + Required if members have roles that need to be reassigned. + """ + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["reassignment_mappings"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m + + +class ReplaceRoleSetRequestTypedDict(TypedDict): + role_set_key_or_id: str + r"""The key or ID of the role set to replace""" + request_body: ReplaceRoleSetRequestBodyTypedDict + + +class ReplaceRoleSetRequest(BaseModel): + role_set_key_or_id: Annotated[ + str, FieldMetadata(path=PathParamMetadata(style="simple", explode=False)) + ] + r"""The key or ID of the role set to replace""" + + request_body: Annotated[ + ReplaceRoleSetRequestBody, + FieldMetadata(request=RequestMetadata(media_type="application/json")), + ] diff --git a/src/clerk_backend_api/models/revokeapikeyop.py b/src/clerk_backend_api/models/revokeapikeyop.py index b21166ed..5dbb10df 100644 --- a/src/clerk_backend_api/models/revokeapikeyop.py +++ b/src/clerk_backend_api/models/revokeapikeyop.py @@ -28,31 +28,26 @@ class RevokeAPIKeyRequestBody(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["revocation_reason"] - nullable_fields = ["revocation_reason"] - null_default_fields = [] - + optional_fields = set(["revocation_reason"]) + nullable_fields = set(["revocation_reason"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m @@ -163,10 +158,14 @@ class RevokeAPIKeyResponseBodyTypedDict(TypedDict): revocation_reason: Nullable[str] expired: bool expiration: Nullable[float] + r"""The timestamp for when the API key will expire, in milliseconds""" created_by: Nullable[str] last_used_at: Nullable[float] + r"""The timestamp for when the API key was last used, in milliseconds""" created_at: float + r"""The timestamp for when the API key was created, in milliseconds""" updated_at: float + r"""The timestamp for when the API key was last updated, in milliseconds""" description: NotRequired[Nullable[str]] @@ -194,50 +193,51 @@ class RevokeAPIKeyResponseBody(BaseModel): expired: bool expiration: Nullable[float] + r"""The timestamp for when the API key will expire, in milliseconds""" created_by: Nullable[str] last_used_at: Nullable[float] + r"""The timestamp for when the API key was last used, in milliseconds""" created_at: float + r"""The timestamp for when the API key was created, in milliseconds""" updated_at: float + r"""The timestamp for when the API key was last updated, in milliseconds""" description: OptionalNullable[str] = UNSET @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["description"] - nullable_fields = [ - "description", - "claims", - "revocation_reason", - "expiration", - "created_by", - "last_used_at", - ] - null_default_fields = [] - + optional_fields = set(["description"]) + nullable_fields = set( + [ + "description", + "claims", + "revocation_reason", + "expiration", + "created_by", + "last_used_at", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/revokem2mtokenop.py b/src/clerk_backend_api/models/revokem2mtokenop.py index 3dbe737d..8cfbf58c 100644 --- a/src/clerk_backend_api/models/revokem2mtokenop.py +++ b/src/clerk_backend_api/models/revokem2mtokenop.py @@ -27,31 +27,26 @@ class RevokeM2MTokenRequestBody(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["revocation_reason"] - nullable_fields = ["revocation_reason"] - null_default_fields = [] - + optional_fields = set(["revocation_reason"]) + nullable_fields = set(["revocation_reason"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m @@ -156,9 +151,13 @@ class RevokeM2MTokenResponseBodyTypedDict(TypedDict): revocation_reason: Nullable[str] expired: bool expiration: Nullable[float] + r"""The timestamp for when the token will expire, in milliseconds""" last_used_at: Nullable[float] + r"""The timestamp for when the token was last used, in milliseconds""" created_at: float + r"""The timestamp for when the token was created, in milliseconds""" updated_at: float + r"""The timestamp for when the token was last updated, in milliseconds""" claims: NotRequired[Nullable[Any]] scopes: NotRequired[List[str]] @@ -179,12 +178,16 @@ class RevokeM2MTokenResponseBody(BaseModel): expired: bool expiration: Nullable[float] + r"""The timestamp for when the token will expire, in milliseconds""" last_used_at: Nullable[float] + r"""The timestamp for when the token was last used, in milliseconds""" created_at: float + r"""The timestamp for when the token was created, in milliseconds""" updated_at: float + r"""The timestamp for when the token was last updated, in milliseconds""" claims: OptionalNullable[Any] = UNSET @@ -192,30 +195,27 @@ class RevokeM2MTokenResponseBody(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["claims", "scopes"] - nullable_fields = ["claims", "revocation_reason", "expiration", "last_used_at"] - null_default_fields = [] - + optional_fields = set(["claims", "scopes"]) + nullable_fields = set( + ["claims", "revocation_reason", "expiration", "last_used_at"] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/revokeorganizationinvitationop.py b/src/clerk_backend_api/models/revokeorganizationinvitationop.py index bc340c7a..64d6c11a 100644 --- a/src/clerk_backend_api/models/revokeorganizationinvitationop.py +++ b/src/clerk_backend_api/models/revokeorganizationinvitationop.py @@ -29,31 +29,26 @@ class RevokeOrganizationInvitationRequestBody(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["requesting_user_id"] - nullable_fields = ["requesting_user_id"] - null_default_fields = [] - + optional_fields = set(["requesting_user_id"]) + nullable_fields = set(["requesting_user_id"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m @@ -81,3 +76,19 @@ class RevokeOrganizationInvitationRequest(BaseModel): Optional[RevokeOrganizationInvitationRequestBody], FieldMetadata(request=RequestMetadata(media_type="application/json")), ] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["RequestBody"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/role.py b/src/clerk_backend_api/models/role.py index 00608310..254cab2c 100644 --- a/src/clerk_backend_api/models/role.py +++ b/src/clerk_backend_api/models/role.py @@ -60,30 +60,14 @@ class Role(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [] - nullable_fields = ["description"] - null_default_fields = [] - serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): + if val != UNSET_SENTINEL: m[k] = val return m diff --git a/src/clerk_backend_api/models/roleset.py b/src/clerk_backend_api/models/roleset.py new file mode 100644 index 00000000..49dbde03 --- /dev/null +++ b/src/clerk_backend_api/models/roleset.py @@ -0,0 +1,404 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from .rolesetitem import RoleSetItem, RoleSetItemTypedDict +from clerk_backend_api.types import ( + BaseModel, + Nullable, + OptionalNullable, + UNSET, + UNSET_SENTINEL, +) +from enum import Enum +from pydantic import model_serializer +from typing import Dict, List +from typing_extensions import NotRequired, TypedDict + + +class RoleSetObject(str, Enum): + ROLE_SET = "role_set" + + +class RoleSetDefaultRoleObject(str, Enum): + ROLE_SET_ITEM = "role_set_item" + + +class DefaultRoleTypedDict(TypedDict): + r"""The default role assigned to new organization members""" + + object: RoleSetDefaultRoleObject + id: str + r"""The unique identifier of the role""" + name: str + r"""The name of the role""" + key: str + r"""The key of the role (e.g., \"org:admin\", \"org:member\")""" + description: Nullable[str] + r"""Optional description of the role""" + created_at: int + r"""Unix timestamp of role creation""" + updated_at: int + r"""Unix timestamp of last role update""" + members_count: NotRequired[Nullable[int]] + r"""The number of members assigned to this role within the role set""" + has_members: NotRequired[Nullable[bool]] + r"""Whether this role has any members assigned within the role set""" + + +class DefaultRole(BaseModel): + r"""The default role assigned to new organization members""" + + object: RoleSetDefaultRoleObject + + id: str + r"""The unique identifier of the role""" + + name: str + r"""The name of the role""" + + key: str + r"""The key of the role (e.g., \"org:admin\", \"org:member\")""" + + description: Nullable[str] + r"""Optional description of the role""" + + created_at: int + r"""Unix timestamp of role creation""" + + updated_at: int + r"""Unix timestamp of last role update""" + + members_count: OptionalNullable[int] = UNSET + r"""The number of members assigned to this role within the role set""" + + has_members: OptionalNullable[bool] = UNSET + r"""Whether this role has any members assigned within the role set""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["members_count", "has_members"]) + nullable_fields = set(["description", "members_count", "has_members"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val + + return m + + +class RoleSetCreatorRoleObject(str, Enum): + ROLE_SET_ITEM = "role_set_item" + + +class CreatorRoleTypedDict(TypedDict): + r"""The role assigned to the creator of an organization""" + + object: RoleSetCreatorRoleObject + id: str + r"""The unique identifier of the role""" + name: str + r"""The name of the role""" + key: str + r"""The key of the role (e.g., \"org:admin\", \"org:member\")""" + description: Nullable[str] + r"""Optional description of the role""" + created_at: int + r"""Unix timestamp of role creation""" + updated_at: int + r"""Unix timestamp of last role update""" + members_count: NotRequired[Nullable[int]] + r"""The number of members assigned to this role within the role set""" + has_members: NotRequired[Nullable[bool]] + r"""Whether this role has any members assigned within the role set""" + + +class CreatorRole(BaseModel): + r"""The role assigned to the creator of an organization""" + + object: RoleSetCreatorRoleObject + + id: str + r"""The unique identifier of the role""" + + name: str + r"""The name of the role""" + + key: str + r"""The key of the role (e.g., \"org:admin\", \"org:member\")""" + + description: Nullable[str] + r"""Optional description of the role""" + + created_at: int + r"""Unix timestamp of role creation""" + + updated_at: int + r"""Unix timestamp of last role update""" + + members_count: OptionalNullable[int] = UNSET + r"""The number of members assigned to this role within the role set""" + + has_members: OptionalNullable[bool] = UNSET + r"""Whether this role has any members assigned within the role set""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["members_count", "has_members"]) + nullable_fields = set(["description", "members_count", "has_members"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val + + return m + + +class Type(str, Enum): + r"""The type of the role set (\"initial\" or \"custom\")""" + + INITIAL = "initial" + CUSTOM = "custom" + + +class RoleSetRoleSetMigrationObject(str, Enum): + ROLE_SET_MIGRATION = "role_set_migration" + + +class RoleSetMigrationTypedDict(TypedDict): + r"""Active migration information, only present when status is \"enqueued\" or \"in_progress\" """ + + object: RoleSetRoleSetMigrationObject + id: str + r"""The unique identifier of the migration""" + instance_id: str + r"""The instance ID this migration belongs to""" + source_role_set_id: str + r"""The ID of the source role set being migrated from""" + trigger_type: str + r"""What triggered this migration (e.g., \"role_set_deletion\", \"role_removal\")""" + status: str + r"""Current status of the migration (e.g., \"enqueued\", \"in_progress\", \"completed\")""" + migrated_members: int + r"""Number of members that have been migrated so far""" + created_at: int + r"""Unix timestamp of migration creation""" + updated_at: int + r"""Unix timestamp of last migration update""" + organization_id: NotRequired[Nullable[str]] + r"""The organization ID if the migration is scoped to a specific organization""" + dest_role_set_id: NotRequired[Nullable[str]] + r"""The ID of the destination role set being migrated to""" + mappings: NotRequired[Nullable[Dict[str, str]]] + r"""Role key mappings from source to destination roles""" + started_at: NotRequired[Nullable[int]] + r"""Unix timestamp when the migration started""" + completed_at: NotRequired[Nullable[int]] + r"""Unix timestamp when the migration completed""" + + +class RoleSetMigration(BaseModel): + r"""Active migration information, only present when status is \"enqueued\" or \"in_progress\" """ + + object: RoleSetRoleSetMigrationObject + + id: str + r"""The unique identifier of the migration""" + + instance_id: str + r"""The instance ID this migration belongs to""" + + source_role_set_id: str + r"""The ID of the source role set being migrated from""" + + trigger_type: str + r"""What triggered this migration (e.g., \"role_set_deletion\", \"role_removal\")""" + + status: str + r"""Current status of the migration (e.g., \"enqueued\", \"in_progress\", \"completed\")""" + + migrated_members: int + r"""Number of members that have been migrated so far""" + + created_at: int + r"""Unix timestamp of migration creation""" + + updated_at: int + r"""Unix timestamp of last migration update""" + + organization_id: OptionalNullable[str] = UNSET + r"""The organization ID if the migration is scoped to a specific organization""" + + dest_role_set_id: OptionalNullable[str] = UNSET + r"""The ID of the destination role set being migrated to""" + + mappings: OptionalNullable[Dict[str, str]] = UNSET + r"""Role key mappings from source to destination roles""" + + started_at: OptionalNullable[int] = UNSET + r"""Unix timestamp when the migration started""" + + completed_at: OptionalNullable[int] = UNSET + r"""Unix timestamp when the migration completed""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + [ + "organization_id", + "dest_role_set_id", + "mappings", + "started_at", + "completed_at", + ] + ) + nullable_fields = set( + [ + "organization_id", + "dest_role_set_id", + "mappings", + "started_at", + "completed_at", + ] + ) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val + + return m + + +class RoleSetTypedDict(TypedDict): + r"""A role set defines a collection of roles that can be assigned to organization members""" + + object: RoleSetObject + id: str + r"""The unique identifier of the role set""" + name: str + r"""The name of the role set""" + key: str + r"""A unique key for the role set (e.g., \"role_set:default\")""" + description: Nullable[str] + r"""Optional description of the role set""" + roles: List[RoleSetItemTypedDict] + r"""The list of roles in this role set""" + type: Type + r"""The type of the role set (\"initial\" or \"custom\")""" + created_at: int + r"""Unix timestamp of role set creation""" + updated_at: int + r"""Unix timestamp of last role set update""" + default_role: NotRequired[Nullable[DefaultRoleTypedDict]] + r"""The default role assigned to new organization members""" + creator_role: NotRequired[Nullable[CreatorRoleTypedDict]] + r"""The role assigned to the creator of an organization""" + role_set_migration: NotRequired[Nullable[RoleSetMigrationTypedDict]] + r"""Active migration information, only present when status is \"enqueued\" or \"in_progress\" """ + + +class RoleSet(BaseModel): + r"""A role set defines a collection of roles that can be assigned to organization members""" + + object: RoleSetObject + + id: str + r"""The unique identifier of the role set""" + + name: str + r"""The name of the role set""" + + key: str + r"""A unique key for the role set (e.g., \"role_set:default\")""" + + description: Nullable[str] + r"""Optional description of the role set""" + + roles: List[RoleSetItem] + r"""The list of roles in this role set""" + + type: Type + r"""The type of the role set (\"initial\" or \"custom\")""" + + created_at: int + r"""Unix timestamp of role set creation""" + + updated_at: int + r"""Unix timestamp of last role set update""" + + default_role: OptionalNullable[DefaultRole] = UNSET + r"""The default role assigned to new organization members""" + + creator_role: OptionalNullable[CreatorRole] = UNSET + r"""The role assigned to the creator of an organization""" + + role_set_migration: OptionalNullable[RoleSetMigration] = UNSET + r"""Active migration information, only present when status is \"enqueued\" or \"in_progress\" """ + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["default_role", "creator_role", "role_set_migration"]) + nullable_fields = set( + ["description", "default_role", "creator_role", "role_set_migration"] + ) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/rolesetitem.py b/src/clerk_backend_api/models/rolesetitem.py new file mode 100644 index 00000000..7f3e8754 --- /dev/null +++ b/src/clerk_backend_api/models/rolesetitem.py @@ -0,0 +1,94 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from clerk_backend_api.types import ( + BaseModel, + Nullable, + OptionalNullable, + UNSET, + UNSET_SENTINEL, +) +from enum import Enum +from pydantic import model_serializer +from typing_extensions import NotRequired, TypedDict + + +class RoleSetItemObject(str, Enum): + ROLE_SET_ITEM = "role_set_item" + + +class RoleSetItemTypedDict(TypedDict): + r"""A role within a role set""" + + object: RoleSetItemObject + id: str + r"""The unique identifier of the role""" + name: str + r"""The name of the role""" + key: str + r"""The key of the role (e.g., \"org:admin\", \"org:member\")""" + description: Nullable[str] + r"""Optional description of the role""" + created_at: int + r"""Unix timestamp of role creation""" + updated_at: int + r"""Unix timestamp of last role update""" + members_count: NotRequired[Nullable[int]] + r"""The number of members assigned to this role within the role set""" + has_members: NotRequired[Nullable[bool]] + r"""Whether this role has any members assigned within the role set""" + + +class RoleSetItem(BaseModel): + r"""A role within a role set""" + + object: RoleSetItemObject + + id: str + r"""The unique identifier of the role""" + + name: str + r"""The name of the role""" + + key: str + r"""The key of the role (e.g., \"org:admin\", \"org:member\")""" + + description: Nullable[str] + r"""Optional description of the role""" + + created_at: int + r"""Unix timestamp of role creation""" + + updated_at: int + r"""Unix timestamp of last role update""" + + members_count: OptionalNullable[int] = UNSET + r"""The number of members assigned to this role within the role set""" + + has_members: OptionalNullable[bool] = UNSET + r"""Whether this role has any members assigned within the role set""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["members_count", "has_members"]) + nullable_fields = set(["description", "members_count", "has_members"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/rolesets.py b/src/clerk_backend_api/models/rolesets.py new file mode 100644 index 00000000..dfaba990 --- /dev/null +++ b/src/clerk_backend_api/models/rolesets.py @@ -0,0 +1,24 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from .roleset import RoleSet, RoleSetTypedDict +from clerk_backend_api.types import BaseModel +from typing import List +from typing_extensions import TypedDict + + +class RoleSetsTypedDict(TypedDict): + r"""Success""" + + data: List[RoleSetTypedDict] + total_count: int + r"""Total number of role sets""" + + +class RoleSets(BaseModel): + r"""Success""" + + data: List[RoleSet] + + total_count: int + r"""Total number of role sets""" diff --git a/src/clerk_backend_api/models/samlaccount.py b/src/clerk_backend_api/models/samlaccount.py index 54565c20..bd590c3d 100644 --- a/src/clerk_backend_api/models/samlaccount.py +++ b/src/clerk_backend_api/models/samlaccount.py @@ -9,11 +9,10 @@ UNSET, UNSET_SENTINEL, ) -from clerk_backend_api.utils import get_discriminator, validate_open_enum +from clerk_backend_api.utils import get_discriminator from enum import Enum import pydantic from pydantic import Discriminator, Tag, field_serializer, model_serializer -from pydantic.functional_validators import PlainValidator from typing import Any, Dict, List, Optional, Union from typing_extensions import Annotated, NotRequired, TypeAliasType, TypedDict @@ -52,10 +51,7 @@ class VerificationTicketTypedDict(TypedDict): class VerificationTicket(BaseModel): status: VerificationTicketVerificationSAMLAccountStatus - strategy: Annotated[ - VerificationTicketVerificationSAMLAccountStrategy, - PlainValidator(validate_open_enum(False)), - ] + strategy: VerificationTicketVerificationSAMLAccountStrategy attempts: Nullable[int] @@ -76,31 +72,26 @@ def serialize_strategy(self, value): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["object", "verified_at_client"] - nullable_fields = ["attempts", "expire_at", "verified_at_client"] - null_default_fields = [] - + optional_fields = set(["object", "verified_at_client"]) + nullable_fields = set(["attempts", "expire_at", "verified_at_client"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m @@ -145,6 +136,22 @@ class VerificationSAMLErrorSAMLAccountClerkError(BaseModel): meta: Optional[ClerkErrorErrorSAMLAccountMeta] = None + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["meta"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m + VerificationSamlVerificationErrorTypedDict = ( VerificationSAMLErrorSAMLAccountClerkErrorTypedDict @@ -184,43 +191,42 @@ class VerificationSAML(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "object", - "external_verification_redirect_url", - "error", - "expire_at", - "verified_at_client", - ] - nullable_fields = [ - "external_verification_redirect_url", - "error", - "expire_at", - "attempts", - "verified_at_client", - ] - null_default_fields = [] - + optional_fields = set( + [ + "object", + "external_verification_redirect_url", + "error", + "expire_at", + "verified_at_client", + ] + ) + nullable_fields = set( + [ + "external_verification_redirect_url", + "error", + "expire_at", + "attempts", + "verified_at_client", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m @@ -297,6 +303,29 @@ class SAMLConnection2(BaseModel): disable_additional_identifications: Optional[bool] = None + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + [ + "domain", + "allow_subdomains", + "allow_idp_initiated", + "disable_additional_identifications", + ] + ) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m + class SAMLConnection1TypedDict(TypedDict): id: str @@ -355,6 +384,29 @@ class SAMLConnection1(BaseModel): disable_additional_identifications: Optional[bool] = None + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + [ + "domains", + "allow_subdomains", + "allow_idp_initiated", + "disable_additional_identifications", + ] + ) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m + SAMLConnectionSAMLConnectionTypedDict = TypeAliasType( "SAMLConnectionSAMLConnectionTypedDict", @@ -427,44 +479,43 @@ class SAMLAccount(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "first_name", - "last_name", - "provider_user_id", - "last_authenticated_at", - "public_metadata", - "saml_connection", - ] - nullable_fields = [ - "first_name", - "last_name", - "provider_user_id", - "last_authenticated_at", - "verification", - "saml_connection", - ] - null_default_fields = [] - + optional_fields = set( + [ + "first_name", + "last_name", + "provider_user_id", + "last_authenticated_at", + "public_metadata", + "saml_connection", + ] + ) + nullable_fields = set( + [ + "first_name", + "last_name", + "provider_user_id", + "last_authenticated_at", + "verification", + "saml_connection", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/schemas_commerceplan.py b/src/clerk_backend_api/models/schemas_commerceplan.py new file mode 100644 index 00000000..153423e2 --- /dev/null +++ b/src/clerk_backend_api/models/schemas_commerceplan.py @@ -0,0 +1,196 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from .commercemoneyresponse import CommerceMoneyResponse, CommerceMoneyResponseTypedDict +from .schemas_featureresponse import ( + SchemasFeatureResponse, + SchemasFeatureResponseTypedDict, +) +from clerk_backend_api.types import ( + BaseModel, + Nullable, + OptionalNullable, + UNSET, + UNSET_SENTINEL, +) +from enum import Enum +from pydantic import model_serializer +from typing import List, Optional +from typing_extensions import NotRequired, TypedDict + + +class SchemasCommercePlanObject(str, Enum): + r"""String representing the object's type. Objects of the same type share the same value.""" + + COMMERCE_PLAN = "commerce_plan" + + +class SchemasCommercePlanTypedDict(TypedDict): + object: SchemasCommercePlanObject + r"""String representing the object's type. Objects of the same type share the same value.""" + id: str + r"""Unique identifier for the commerce plan.""" + name: str + r"""The name of the commerce plan.""" + fee: CommerceMoneyResponseTypedDict + annual_monthly_fee: CommerceMoneyResponseTypedDict + annual_fee: CommerceMoneyResponseTypedDict + amount: int + r"""The amount in cents for the plan.""" + amount_formatted: str + r"""The formatted amount as a string (e.g., \"$49.99\").""" + annual_monthly_amount: int + r"""The monthly amount in cents when billed annually.""" + annual_monthly_amount_formatted: str + r"""The formatted annual monthly amount as a string.""" + annual_amount: int + r"""The total annual amount in cents.""" + annual_amount_formatted: str + r"""The formatted annual amount as a string.""" + currency_symbol: str + r"""The currency symbol (e.g., \"$\").""" + currency: str + r"""The currency code (e.g., \"USD\").""" + description: str + r"""The description of the commerce plan.""" + product_id: str + r"""The ID of the product this plan belongs to.""" + is_default: bool + r"""Whether this is the default plan.""" + is_recurring: bool + r"""Whether this is a recurring plan.""" + publicly_visible: bool + r"""Whether this plan is publicly visible.""" + has_base_fee: bool + r"""Whether this plan has a base fee.""" + payer_type: List[str] + r"""The types of payers that can use this plan.""" + for_payer_type: str + r"""The payer type this plan is designed for.""" + slug: str + r"""The URL-friendly slug for the plan.""" + avatar_url: str + r"""The URL of the plan's avatar image.""" + features: List[SchemasFeatureResponseTypedDict] + r"""The features included in this plan.""" + period: NotRequired[str] + r"""The billing period for the plan.""" + interval: NotRequired[int] + r"""The billing interval.""" + free_trial_enabled: NotRequired[bool] + r"""Whether free trial is enabled for this plan.""" + free_trial_days: NotRequired[Nullable[int]] + r"""Number of free trial days for this plan.""" + + +class SchemasCommercePlan(BaseModel): + object: SchemasCommercePlanObject + r"""String representing the object's type. Objects of the same type share the same value.""" + + id: str + r"""Unique identifier for the commerce plan.""" + + name: str + r"""The name of the commerce plan.""" + + fee: CommerceMoneyResponse + + annual_monthly_fee: CommerceMoneyResponse + + annual_fee: CommerceMoneyResponse + + amount: int + r"""The amount in cents for the plan.""" + + amount_formatted: str + r"""The formatted amount as a string (e.g., \"$49.99\").""" + + annual_monthly_amount: int + r"""The monthly amount in cents when billed annually.""" + + annual_monthly_amount_formatted: str + r"""The formatted annual monthly amount as a string.""" + + annual_amount: int + r"""The total annual amount in cents.""" + + annual_amount_formatted: str + r"""The formatted annual amount as a string.""" + + currency_symbol: str + r"""The currency symbol (e.g., \"$\").""" + + currency: str + r"""The currency code (e.g., \"USD\").""" + + description: str + r"""The description of the commerce plan.""" + + product_id: str + r"""The ID of the product this plan belongs to.""" + + is_default: bool + r"""Whether this is the default plan.""" + + is_recurring: bool + r"""Whether this is a recurring plan.""" + + publicly_visible: bool + r"""Whether this plan is publicly visible.""" + + has_base_fee: bool + r"""Whether this plan has a base fee.""" + + payer_type: List[str] + r"""The types of payers that can use this plan.""" + + for_payer_type: str + r"""The payer type this plan is designed for.""" + + slug: str + r"""The URL-friendly slug for the plan.""" + + avatar_url: str + r"""The URL of the plan's avatar image.""" + + features: List[SchemasFeatureResponse] + r"""The features included in this plan.""" + + period: Optional[str] = None + r"""The billing period for the plan.""" + + interval: Optional[int] = None + r"""The billing interval.""" + + free_trial_enabled: Optional[bool] = None + r"""Whether free trial is enabled for this plan.""" + + free_trial_days: OptionalNullable[int] = UNSET + r"""Number of free trial days for this plan.""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + ["period", "interval", "free_trial_enabled", "free_trial_days"] + ) + nullable_fields = set(["free_trial_days"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/schemas_commercesubscriptionitem.py b/src/clerk_backend_api/models/schemas_commercesubscriptionitem.py index a94dbd5e..c226cf0f 100644 --- a/src/clerk_backend_api/models/schemas_commercesubscriptionitem.py +++ b/src/clerk_backend_api/models/schemas_commercesubscriptionitem.py @@ -86,31 +86,26 @@ class Credit(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["amount", "cycle_remaining_percent"] - nullable_fields = ["amount"] - null_default_fields = [] - + optional_fields = set(["amount", "cycle_remaining_percent"]) + nullable_fields = set(["amount"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m @@ -270,36 +265,28 @@ class SchemasCommerceSubscriptionItemPlan(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "period", - "interval", - "free_trial_enabled", - "free_trial_days", - ] - nullable_fields = ["free_trial_days"] - null_default_fields = [] - + optional_fields = set( + ["period", "interval", "free_trial_enabled", "free_trial_days"] + ) + nullable_fields = set(["free_trial_days"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m @@ -427,37 +414,36 @@ class PaymentSource(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "is_default", - "gateway_external_account_id", - "expiry_year", - "expiry_month", - "is_removable", - ] - nullable_fields = ["is_default", "gateway_external_account_id", "is_removable"] - null_default_fields = [] - + optional_fields = set( + [ + "is_default", + "gateway_external_account_id", + "expiry_year", + "expiry_month", + "is_removable", + ] + ) + nullable_fields = set( + ["is_default", "gateway_external_account_id", "is_removable"] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m @@ -571,31 +557,26 @@ class NextInvoice(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["amount", "date"] - nullable_fields = ["amount", "date"] - null_default_fields = [] - + optional_fields = set(["amount", "date"]) + nullable_fields = set(["amount", "date"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m @@ -651,31 +632,26 @@ class SchemasCommerceSubscriptionItemNextPayment(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["amount", "date"] - nullable_fields = ["amount", "date"] - null_default_fields = [] - + optional_fields = set(["amount", "date"]) + nullable_fields = set(["amount", "date"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m @@ -754,6 +730,22 @@ class Payer(BaseModel): organization_name: Optional[str] = None r"""Organization name for org-type payers.""" + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["user_id", "organization_id", "organization_name"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m + class SchemasCommerceSubscriptionItemTypedDict(TypedDict): r"""A commerce subscription item.""" @@ -786,6 +778,8 @@ class SchemasCommerceSubscriptionItemTypedDict(TypedDict): r"""Unix timestamp (in milliseconds) when the subscription was last updated.""" credit: NotRequired[Nullable[CreditTypedDict]] r"""Credit information (only available in PaymentAttempt events).""" + price_id: NotRequired[str] + r"""Unique identifier for the associated price""" payment_source: NotRequired[Nullable[PaymentSourceTypedDict]] r"""The payment source associated with this subscription.""" lifetime_paid: NotRequired[Nullable[LifetimePaidTypedDict]] @@ -857,6 +851,9 @@ class SchemasCommerceSubscriptionItem(BaseModel): credit: OptionalNullable[Credit] = UNSET r"""Credit information (only available in PaymentAttempt events).""" + price_id: Optional[str] = None + r"""Unique identifier for the associated price""" + payment_source: OptionalNullable[PaymentSource] = UNSET r"""The payment source associated with this subscription.""" @@ -892,57 +889,57 @@ class SchemasCommerceSubscriptionItem(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "credit", - "payment_source", - "lifetime_paid", - "amount", - "next_invoice", - "next_payment", - "payer", - "period_start", - "period_end", - "canceled_at", - "past_due_at", - "ended_at", - ] - nullable_fields = [ - "credit", - "plan", - "payment_source", - "lifetime_paid", - "amount", - "next_invoice", - "next_payment", - "payer", - "period_start", - "period_end", - "canceled_at", - "past_due_at", - "ended_at", - ] - null_default_fields = [] - + optional_fields = set( + [ + "credit", + "price_id", + "payment_source", + "lifetime_paid", + "amount", + "next_invoice", + "next_payment", + "payer", + "period_start", + "period_end", + "canceled_at", + "past_due_at", + "ended_at", + ] + ) + nullable_fields = set( + [ + "credit", + "plan", + "payment_source", + "lifetime_paid", + "amount", + "next_invoice", + "next_payment", + "payer", + "period_start", + "period_end", + "canceled_at", + "past_due_at", + "ended_at", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/schemas_samlconnection.py b/src/clerk_backend_api/models/schemas_samlconnection.py index 19bf7cdc..9c4e1b3f 100644 --- a/src/clerk_backend_api/models/schemas_samlconnection.py +++ b/src/clerk_backend_api/models/schemas_samlconnection.py @@ -126,46 +126,45 @@ class Two(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "domain", - "idp_metadata_url", - "idp_metadata", - "organization_id", - "attribute_mapping", - "enterprise_connection_id", - ] - nullable_fields = [ - "idp_entity_id", - "idp_sso_url", - "idp_certificate", - "idp_metadata_url", - "idp_metadata", - "organization_id", - "enterprise_connection_id", - ] - null_default_fields = [] - + optional_fields = set( + [ + "domain", + "idp_metadata_url", + "idp_metadata", + "organization_id", + "attribute_mapping", + "enterprise_connection_id", + ] + ) + nullable_fields = set( + [ + "idp_entity_id", + "idp_sso_url", + "idp_certificate", + "idp_metadata_url", + "idp_metadata", + "organization_id", + "enterprise_connection_id", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m @@ -277,46 +276,45 @@ class One(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "domains", - "idp_metadata_url", - "idp_metadata", - "organization_id", - "attribute_mapping", - "enterprise_connection_id", - ] - nullable_fields = [ - "idp_entity_id", - "idp_sso_url", - "idp_certificate", - "idp_metadata_url", - "idp_metadata", - "organization_id", - "enterprise_connection_id", - ] - null_default_fields = [] - + optional_fields = set( + [ + "domains", + "idp_metadata_url", + "idp_metadata", + "organization_id", + "attribute_mapping", + "enterprise_connection_id", + ] + ) + nullable_fields = set( + [ + "idp_entity_id", + "idp_sso_url", + "idp_certificate", + "idp_metadata_url", + "idp_metadata", + "organization_id", + "enterprise_connection_id", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/security.py b/src/clerk_backend_api/models/security.py index cdcd78ce..fc2d014c 100644 --- a/src/clerk_backend_api/models/security.py +++ b/src/clerk_backend_api/models/security.py @@ -1,8 +1,9 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from clerk_backend_api.utils import FieldMetadata, SecurityMetadata +from pydantic import model_serializer from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -23,3 +24,19 @@ class Security(BaseModel): ) ), ] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["bearerAuth"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/session.py b/src/clerk_backend_api/models/session.py index 66ecc7e7..3f6cc39a 100644 --- a/src/clerk_backend_api/models/session.py +++ b/src/clerk_backend_api/models/session.py @@ -122,40 +122,29 @@ class Session(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "actor", - "last_active_organization_id", - "latest_activity", - "tasks", - ] - nullable_fields = [ - "actor", - "last_active_organization_id", - "latest_activity", - "tasks", - ] - null_default_fields = [] - + optional_fields = set( + ["actor", "last_active_organization_id", "latest_activity", "tasks"] + ) + nullable_fields = set( + ["actor", "last_active_organization_id", "latest_activity", "tasks"] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/sessionactivityresponse.py b/src/clerk_backend_api/models/sessionactivityresponse.py index 0352399e..46833ff7 100644 --- a/src/clerk_backend_api/models/sessionactivityresponse.py +++ b/src/clerk_backend_api/models/sessionactivityresponse.py @@ -1,7 +1,8 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL +from pydantic import model_serializer from typing import Optional from typing_extensions import NotRequired, TypedDict @@ -36,3 +37,28 @@ class SessionActivityResponse(BaseModel): city: Optional[str] = None country: Optional[str] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + [ + "device_type", + "browser_name", + "browser_version", + "ip_address", + "city", + "country", + ] + ) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/setuserpasswordcompromisedop.py b/src/clerk_backend_api/models/setuserpasswordcompromisedop.py new file mode 100644 index 00000000..3eb632d4 --- /dev/null +++ b/src/clerk_backend_api/models/setuserpasswordcompromisedop.py @@ -0,0 +1,81 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from clerk_backend_api.types import ( + BaseModel, + Nullable, + OptionalNullable, + UNSET, + UNSET_SENTINEL, +) +from clerk_backend_api.utils import FieldMetadata, PathParamMetadata, RequestMetadata +from pydantic import model_serializer +from typing import Optional +from typing_extensions import Annotated, NotRequired, TypedDict + + +class SetUserPasswordCompromisedRequestBodyTypedDict(TypedDict): + revoke_all_sessions: NotRequired[Nullable[bool]] + + +class SetUserPasswordCompromisedRequestBody(BaseModel): + revoke_all_sessions: OptionalNullable[bool] = UNSET + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["revoke_all_sessions"]) + nullable_fields = set(["revoke_all_sessions"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val + + return m + + +class SetUserPasswordCompromisedRequestTypedDict(TypedDict): + user_id: str + r"""The ID of the user to set the password as compromised""" + request_body: NotRequired[SetUserPasswordCompromisedRequestBodyTypedDict] + + +class SetUserPasswordCompromisedRequest(BaseModel): + user_id: Annotated[ + str, FieldMetadata(path=PathParamMetadata(style="simple", explode=False)) + ] + r"""The ID of the user to set the password as compromised""" + + request_body: Annotated[ + Optional[SetUserPasswordCompromisedRequestBody], + FieldMetadata(request=RequestMetadata(media_type="application/json")), + ] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["RequestBody"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/setuserprofileimageop.py b/src/clerk_backend_api/models/setuserprofileimageop.py index a38de6b2..30e02493 100644 --- a/src/clerk_backend_api/models/setuserprofileimageop.py +++ b/src/clerk_backend_api/models/setuserprofileimageop.py @@ -1,7 +1,7 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from clerk_backend_api.utils import ( FieldMetadata, MultipartFormMetadata, @@ -10,6 +10,7 @@ ) import io import pydantic +from pydantic import model_serializer from typing import IO, Optional, Union from typing_extensions import Annotated, NotRequired, TypedDict @@ -37,6 +38,22 @@ class File(BaseModel): FieldMetadata(multipart=True), ] = None + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["contentType"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m + class SetUserProfileImageRequestBodyTypedDict(TypedDict): file: NotRequired[FileTypedDict] @@ -47,6 +64,22 @@ class SetUserProfileImageRequestBody(BaseModel): Optional[File], FieldMetadata(multipart=MultipartFormMetadata(file=True)) ] = None + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["file"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m + class SetUserProfileImageRequestTypedDict(TypedDict): user_id: str diff --git a/src/clerk_backend_api/models/signintoken.py b/src/clerk_backend_api/models/signintoken.py index b03c5f60..657cb69c 100644 --- a/src/clerk_backend_api/models/signintoken.py +++ b/src/clerk_backend_api/models/signintoken.py @@ -70,30 +70,25 @@ class SignInToken(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["token", "url"] - nullable_fields = ["url"] - null_default_fields = [] - + optional_fields = set(["token", "url"]) + nullable_fields = set(["url"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/signup.py b/src/clerk_backend_api/models/signup.py index a61345ec..e5e3485c 100644 --- a/src/clerk_backend_api/models/signup.py +++ b/src/clerk_backend_api/models/signup.py @@ -144,47 +144,41 @@ class SignUp(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "unsafe_metadata", - "public_metadata", - "locale", - "external_account", - ] - nullable_fields = [ - "username", - "email_address", - "phone_number", - "web3_wallet", - "first_name", - "last_name", - "external_id", - "created_session_id", - "created_user_id", - "legal_accepted_at", - "locale", - ] - null_default_fields = [] - + optional_fields = set( + ["unsafe_metadata", "public_metadata", "locale", "external_account"] + ) + nullable_fields = set( + [ + "username", + "email_address", + "phone_number", + "web3_wallet", + "first_name", + "last_name", + "external_id", + "created_session_id", + "created_user_id", + "legal_accepted_at", + "locale", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/signupverification.py b/src/clerk_backend_api/models/signupverification.py index 8d8e7743..31c36a8e 100644 --- a/src/clerk_backend_api/models/signupverification.py +++ b/src/clerk_backend_api/models/signupverification.py @@ -1,10 +1,10 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from enum import Enum import pydantic -from pydantic import ConfigDict +from pydantic import ConfigDict, model_serializer from typing import Any, Dict, List, Optional from typing_extensions import NotRequired, TypedDict @@ -37,3 +37,22 @@ def additional_properties(self): @additional_properties.setter def additional_properties(self, value): self.__pydantic_extra__ = value # pyright: ignore[reportIncompatibleVariableOverride] + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["next_action", "supported_strategies"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + serialized.pop(k, None) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + for k, v in serialized.items(): + m[k] = v + + return m diff --git a/src/clerk_backend_api/models/signupverifications.py b/src/clerk_backend_api/models/signupverifications.py index d0e6d99d..fa578bf2 100644 --- a/src/clerk_backend_api/models/signupverifications.py +++ b/src/clerk_backend_api/models/signupverifications.py @@ -33,35 +33,14 @@ class SignUpVerifications(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [] - nullable_fields = [ - "email_address", - "phone_number", - "web3_wallet", - "external_account", - ] - null_default_fields = [] - serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): + if val != UNSET_SENTINEL: m[k] = val return m diff --git a/src/clerk_backend_api/models/template.py b/src/clerk_backend_api/models/template.py index a7da7621..e31a293d 100644 --- a/src/clerk_backend_api/models/template.py +++ b/src/clerk_backend_api/models/template.py @@ -150,55 +150,52 @@ class Template(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "id", - "object", - "instance_id", - "resource_type", - "template_type", - "name", - "slug", - "position", - "can_revert", - "can_delete", - "can_edit_body", - "can_toggle", - "subject", - "markup", - "body", - "available_variables", - "required_variables", - "from_email_name", - "reply_to_email_name", - "delivered_by_clerk", - "enabled", - "flagged_as_suspicious", - "updated_at", - "created_at", - ] - nullable_fields = ["instance_id", "subject"] - null_default_fields = [] - + optional_fields = set( + [ + "id", + "object", + "instance_id", + "resource_type", + "template_type", + "name", + "slug", + "position", + "can_revert", + "can_delete", + "can_edit_body", + "can_toggle", + "subject", + "markup", + "body", + "available_variables", + "required_variables", + "from_email_name", + "reply_to_email_name", + "delivered_by_clerk", + "enabled", + "flagged_as_suspicious", + "updated_at", + "created_at", + ] + ) + nullable_fields = set(["instance_id", "subject"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/toggletemplatedeliveryop.py b/src/clerk_backend_api/models/toggletemplatedeliveryop.py index a9b7d156..46b71769 100644 --- a/src/clerk_backend_api/models/toggletemplatedeliveryop.py +++ b/src/clerk_backend_api/models/toggletemplatedeliveryop.py @@ -1,9 +1,10 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from clerk_backend_api.utils import FieldMetadata, PathParamMetadata, RequestMetadata from enum import Enum +from pydantic import model_serializer from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -24,6 +25,22 @@ class ToggleTemplateDeliveryRequestBody(BaseModel): delivered_by_clerk: Optional[bool] = None r"""Whether Clerk should deliver emails or SMS messages based on the current template""" + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["delivered_by_clerk"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m + class ToggleTemplateDeliveryRequestTypedDict(TypedDict): template_type: ToggleTemplateDeliveryPathParamTemplateType @@ -49,3 +66,19 @@ class ToggleTemplateDeliveryRequest(BaseModel): Optional[ToggleTemplateDeliveryRequestBody], FieldMetadata(request=RequestMetadata(media_type="application/json")), ] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["RequestBody"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/unsetuserpasswordcompromisedop.py b/src/clerk_backend_api/models/unsetuserpasswordcompromisedop.py new file mode 100644 index 00000000..17ebdc05 --- /dev/null +++ b/src/clerk_backend_api/models/unsetuserpasswordcompromisedop.py @@ -0,0 +1,18 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from clerk_backend_api.types import BaseModel +from clerk_backend_api.utils import FieldMetadata, PathParamMetadata +from typing_extensions import Annotated, TypedDict + + +class UnsetUserPasswordCompromisedRequestTypedDict(TypedDict): + user_id: str + r"""The ID of the user to unset the compromised status for""" + + +class UnsetUserPasswordCompromisedRequest(BaseModel): + user_id: Annotated[ + str, FieldMetadata(path=PathParamMetadata(style="simple", explode=False)) + ] + r"""The ID of the user to unset the compromised status for""" diff --git a/src/clerk_backend_api/models/updateapikeyop.py b/src/clerk_backend_api/models/updateapikeyop.py index c2f0e49b..36d8c05c 100644 --- a/src/clerk_backend_api/models/updateapikeyop.py +++ b/src/clerk_backend_api/models/updateapikeyop.py @@ -40,37 +40,28 @@ class UpdateAPIKeyRequestBody(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "claims", - "scopes", - "description", - "subject", - "seconds_until_expiration", - ] - nullable_fields = ["claims", "description", "seconds_until_expiration"] - null_default_fields = [] - + optional_fields = set( + ["claims", "scopes", "description", "subject", "seconds_until_expiration"] + ) + nullable_fields = set(["claims", "description", "seconds_until_expiration"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m @@ -181,10 +172,14 @@ class UpdateAPIKeyResponseBodyTypedDict(TypedDict): revocation_reason: Nullable[str] expired: bool expiration: Nullable[float] + r"""The timestamp for when the API key will expire, in milliseconds""" created_by: Nullable[str] last_used_at: Nullable[float] + r"""The timestamp for when the API key was last used, in milliseconds""" created_at: float + r"""The timestamp for when the API key was created, in milliseconds""" updated_at: float + r"""The timestamp for when the API key was last updated, in milliseconds""" description: NotRequired[Nullable[str]] @@ -212,50 +207,51 @@ class UpdateAPIKeyResponseBody(BaseModel): expired: bool expiration: Nullable[float] + r"""The timestamp for when the API key will expire, in milliseconds""" created_by: Nullable[str] last_used_at: Nullable[float] + r"""The timestamp for when the API key was last used, in milliseconds""" created_at: float + r"""The timestamp for when the API key was created, in milliseconds""" updated_at: float + r"""The timestamp for when the API key was last updated, in milliseconds""" description: OptionalNullable[str] = UNSET @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["description"] - nullable_fields = [ - "description", - "claims", - "revocation_reason", - "expiration", - "created_by", - "last_used_at", - ] - null_default_fields = [] - + optional_fields = set(["description"]) + nullable_fields = set( + [ + "description", + "claims", + "revocation_reason", + "expiration", + "created_by", + "last_used_at", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/updatedomainop.py b/src/clerk_backend_api/models/updatedomainop.py index 30b04c19..5461eff3 100644 --- a/src/clerk_backend_api/models/updatedomainop.py +++ b/src/clerk_backend_api/models/updatedomainop.py @@ -50,31 +50,26 @@ class UpdateDomainRequestBody(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["name", "proxy_url", "is_secondary"] - nullable_fields = ["name", "proxy_url", "is_secondary"] - null_default_fields = [] - + optional_fields = set(["name", "proxy_url", "is_secondary"]) + nullable_fields = set(["name", "proxy_url", "is_secondary"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/updateemailaddressop.py b/src/clerk_backend_api/models/updateemailaddressop.py index baaf8d16..72b76f23 100644 --- a/src/clerk_backend_api/models/updateemailaddressop.py +++ b/src/clerk_backend_api/models/updateemailaddressop.py @@ -30,31 +30,26 @@ class UpdateEmailAddressRequestBody(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["verified", "primary"] - nullable_fields = ["verified", "primary"] - null_default_fields = [] - + optional_fields = set(["verified", "primary"]) + nullable_fields = set(["verified", "primary"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m @@ -75,3 +70,19 @@ class UpdateEmailAddressRequest(BaseModel): Optional[UpdateEmailAddressRequestBody], FieldMetadata(request=RequestMetadata(media_type="application/json")), ] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["RequestBody"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/updateinstanceauthconfigop.py b/src/clerk_backend_api/models/updateinstanceauthconfigop.py index 8ec758c3..f249e8e8 100644 --- a/src/clerk_backend_api/models/updateinstanceauthconfigop.py +++ b/src/clerk_backend_api/models/updateinstanceauthconfigop.py @@ -48,40 +48,39 @@ class UpdateInstanceAuthConfigRequestBody(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "restricted_to_allowlist", - "from_email_address", - "progressive_sign_up", - "test_mode", - ] - nullable_fields = [ - "restricted_to_allowlist", - "from_email_address", - "progressive_sign_up", - "test_mode", - ] - null_default_fields = [] - + optional_fields = set( + [ + "restricted_to_allowlist", + "from_email_address", + "progressive_sign_up", + "test_mode", + ] + ) + nullable_fields = set( + [ + "restricted_to_allowlist", + "from_email_address", + "progressive_sign_up", + "test_mode", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/updateinstanceop.py b/src/clerk_backend_api/models/updateinstanceop.py index b8bf6a3b..81a9dbe0 100644 --- a/src/clerk_backend_api/models/updateinstanceop.py +++ b/src/clerk_backend_api/models/updateinstanceop.py @@ -67,47 +67,46 @@ class UpdateInstanceRequestBody(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "test_mode", - "hibp", - "support_email", - "clerk_js_version", - "development_origin", - "allowed_origins", - "cookieless_dev", - "url_based_session_syncing", - ] - nullable_fields = [ - "test_mode", - "hibp", - "support_email", - "clerk_js_version", - "development_origin", - "cookieless_dev", - "url_based_session_syncing", - ] - null_default_fields = [] - + optional_fields = set( + [ + "test_mode", + "hibp", + "support_email", + "clerk_js_version", + "development_origin", + "allowed_origins", + "cookieless_dev", + "url_based_session_syncing", + ] + ) + nullable_fields = set( + [ + "test_mode", + "hibp", + "support_email", + "clerk_js_version", + "development_origin", + "cookieless_dev", + "url_based_session_syncing", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/updateinstanceorganizationsettingsop.py b/src/clerk_backend_api/models/updateinstanceorganizationsettingsop.py index 72fc23f8..6a838b78 100644 --- a/src/clerk_backend_api/models/updateinstanceorganizationsettingsop.py +++ b/src/clerk_backend_api/models/updateinstanceorganizationsettingsop.py @@ -53,47 +53,46 @@ class UpdateInstanceOrganizationSettingsRequestBody(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "enabled", - "max_allowed_memberships", - "admin_delete_enabled", - "domains_enabled", - "slug_disabled", - "domains_enrollment_modes", - "creator_role_id", - "domains_default_role_id", - ] - nullable_fields = [ - "enabled", - "max_allowed_memberships", - "admin_delete_enabled", - "domains_enabled", - "slug_disabled", - "creator_role_id", - "domains_default_role_id", - ] - null_default_fields = [] - + optional_fields = set( + [ + "enabled", + "max_allowed_memberships", + "admin_delete_enabled", + "domains_enabled", + "slug_disabled", + "domains_enrollment_modes", + "creator_role_id", + "domains_default_role_id", + ] + ) + nullable_fields = set( + [ + "enabled", + "max_allowed_memberships", + "admin_delete_enabled", + "domains_enabled", + "slug_disabled", + "creator_role_id", + "domains_default_role_id", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/updateinstanceprotectop.py b/src/clerk_backend_api/models/updateinstanceprotectop.py new file mode 100644 index 00000000..fbef8386 --- /dev/null +++ b/src/clerk_backend_api/models/updateinstanceprotectop.py @@ -0,0 +1,48 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from clerk_backend_api.types import ( + BaseModel, + Nullable, + OptionalNullable, + UNSET, + UNSET_SENTINEL, +) +from pydantic import model_serializer +from typing_extensions import NotRequired, TypedDict + + +class UpdateInstanceProtectRequestBodyTypedDict(TypedDict): + rules_enabled: NotRequired[Nullable[bool]] + specter_enabled: NotRequired[Nullable[bool]] + + +class UpdateInstanceProtectRequestBody(BaseModel): + rules_enabled: OptionalNullable[bool] = UNSET + + specter_enabled: OptionalNullable[bool] = UNSET + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["rules_enabled", "specter_enabled"]) + nullable_fields = set(["rules_enabled", "specter_enabled"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/updateinstancerestrictionsop.py b/src/clerk_backend_api/models/updateinstancerestrictionsop.py index d6488651..656ee66b 100644 --- a/src/clerk_backend_api/models/updateinstancerestrictionsop.py +++ b/src/clerk_backend_api/models/updateinstancerestrictionsop.py @@ -33,42 +33,41 @@ class UpdateInstanceRestrictionsRequestBody(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "allowlist", - "blocklist", - "allowlist_blocklist_disabled_on_sign_in", - "block_email_subaddresses", - "block_disposable_email_domains", - ] - nullable_fields = [ - "allowlist", - "blocklist", - "allowlist_blocklist_disabled_on_sign_in", - "block_email_subaddresses", - "block_disposable_email_domains", - ] - null_default_fields = [] - + optional_fields = set( + [ + "allowlist", + "blocklist", + "allowlist_blocklist_disabled_on_sign_in", + "block_email_subaddresses", + "block_disposable_email_domains", + ] + ) + nullable_fields = set( + [ + "allowlist", + "blocklist", + "allowlist_blocklist_disabled_on_sign_in", + "block_email_subaddresses", + "block_disposable_email_domains", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/updatejwttemplateop.py b/src/clerk_backend_api/models/updatejwttemplateop.py index cadc0d1f..0d91d0c5 100644 --- a/src/clerk_backend_api/models/updatejwttemplateop.py +++ b/src/clerk_backend_api/models/updatejwttemplateop.py @@ -63,42 +63,36 @@ class UpdateJWTTemplateRequestBody(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "lifetime", - "allowed_clock_skew", - "custom_signing_key", - "signing_algorithm", - "signing_key", - ] - nullable_fields = [ - "lifetime", - "allowed_clock_skew", - "signing_algorithm", - "signing_key", - ] - null_default_fields = [] - + optional_fields = set( + [ + "lifetime", + "allowed_clock_skew", + "custom_signing_key", + "signing_algorithm", + "signing_key", + ] + ) + nullable_fields = set( + ["lifetime", "allowed_clock_skew", "signing_algorithm", "signing_key"] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m @@ -119,3 +113,19 @@ class UpdateJWTTemplateRequest(BaseModel): Optional[UpdateJWTTemplateRequestBody], FieldMetadata(request=RequestMetadata(media_type="application/json")), ] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["RequestBody"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/updatemachineop.py b/src/clerk_backend_api/models/updatemachineop.py index 072efd10..a92c575b 100644 --- a/src/clerk_backend_api/models/updatemachineop.py +++ b/src/clerk_backend_api/models/updatemachineop.py @@ -1,8 +1,9 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from clerk_backend_api.utils import FieldMetadata, PathParamMetadata, RequestMetadata +from pydantic import model_serializer from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -21,6 +22,22 @@ class UpdateMachineRequestBody(BaseModel): default_token_ttl: Optional[int] = None r"""The default time-to-live (TTL) in seconds for tokens created by this machine. Must be at least 1 second.""" + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["name", "default_token_ttl"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m + class UpdateMachineRequestTypedDict(TypedDict): machine_id: str @@ -38,3 +55,19 @@ class UpdateMachineRequest(BaseModel): Optional[UpdateMachineRequestBody], FieldMetadata(request=RequestMetadata(media_type="application/json")), ] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["RequestBody"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/updateoauthapplicationop.py b/src/clerk_backend_api/models/updateoauthapplicationop.py index d586255e..0419fb4a 100644 --- a/src/clerk_backend_api/models/updateoauthapplicationop.py +++ b/src/clerk_backend_api/models/updateoauthapplicationop.py @@ -65,47 +65,46 @@ class UpdateOAuthApplicationRequestBody(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "name", - "redirect_uris", - "callback_url", - "scopes", - "consent_screen_enabled", - "pkce_required", - "public", - ] - nullable_fields = [ - "name", - "redirect_uris", - "callback_url", - "scopes", - "consent_screen_enabled", - "pkce_required", - "public", - ] - null_default_fields = [] - + optional_fields = set( + [ + "name", + "redirect_uris", + "callback_url", + "scopes", + "consent_screen_enabled", + "pkce_required", + "public", + ] + ) + nullable_fields = set( + [ + "name", + "redirect_uris", + "callback_url", + "scopes", + "consent_screen_enabled", + "pkce_required", + "public", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/updateorganizationdomainop.py b/src/clerk_backend_api/models/updateorganizationdomainop.py index f4aeab65..8ba026e9 100644 --- a/src/clerk_backend_api/models/updateorganizationdomainop.py +++ b/src/clerk_backend_api/models/updateorganizationdomainop.py @@ -29,31 +29,26 @@ class UpdateOrganizationDomainRequestBody(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["enrollment_mode", "verified"] - nullable_fields = ["enrollment_mode", "verified"] - null_default_fields = [] - + optional_fields = set(["enrollment_mode", "verified"]) + nullable_fields = set(["enrollment_mode", "verified"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/updateorganizationmembershipmetadataop.py b/src/clerk_backend_api/models/updateorganizationmembershipmetadataop.py index 0589ca82..488a0950 100644 --- a/src/clerk_backend_api/models/updateorganizationmembershipmetadataop.py +++ b/src/clerk_backend_api/models/updateorganizationmembershipmetadataop.py @@ -1,8 +1,9 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from clerk_backend_api.utils import FieldMetadata, PathParamMetadata, RequestMetadata +from pydantic import model_serializer from typing import Any, Dict, Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -29,6 +30,22 @@ class UpdateOrganizationMembershipMetadataRequestBody(BaseModel): The new object will be merged with the existing value. """ + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["public_metadata", "private_metadata"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m + class UpdateOrganizationMembershipMetadataRequestTypedDict(TypedDict): organization_id: str @@ -53,3 +70,19 @@ class UpdateOrganizationMembershipMetadataRequest(BaseModel): Optional[UpdateOrganizationMembershipMetadataRequestBody], FieldMetadata(request=RequestMetadata(media_type="application/json")), ] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["RequestBody"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/updateorganizationop.py b/src/clerk_backend_api/models/updateorganizationop.py index a4498bd1..1b78aa11 100644 --- a/src/clerk_backend_api/models/updateorganizationop.py +++ b/src/clerk_backend_api/models/updateorganizationop.py @@ -61,47 +61,46 @@ class UpdateOrganizationRequestBody(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "public_metadata", - "private_metadata", - "name", - "slug", - "max_allowed_memberships", - "admin_delete_enabled", - "created_at", - ] - nullable_fields = [ - "public_metadata", - "private_metadata", - "name", - "slug", - "max_allowed_memberships", - "admin_delete_enabled", - "created_at", - ] - null_default_fields = [] - + optional_fields = set( + [ + "public_metadata", + "private_metadata", + "name", + "slug", + "max_allowed_memberships", + "admin_delete_enabled", + "created_at", + ] + ) + nullable_fields = set( + [ + "public_metadata", + "private_metadata", + "name", + "slug", + "max_allowed_memberships", + "admin_delete_enabled", + "created_at", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/updateorganizationpermissionop.py b/src/clerk_backend_api/models/updateorganizationpermissionop.py index c74c4f2e..21e47878 100644 --- a/src/clerk_backend_api/models/updateorganizationpermissionop.py +++ b/src/clerk_backend_api/models/updateorganizationpermissionop.py @@ -1,8 +1,9 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from clerk_backend_api.utils import FieldMetadata, PathParamMetadata, RequestMetadata +from pydantic import model_serializer from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -26,6 +27,22 @@ class UpdateOrganizationPermissionRequestBody(BaseModel): description: Optional[str] = None r"""A description of the permission.""" + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["name", "key", "description"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m + class UpdateOrganizationPermissionRequestTypedDict(TypedDict): permission_id: str diff --git a/src/clerk_backend_api/models/updateorganizationroleop.py b/src/clerk_backend_api/models/updateorganizationroleop.py index 59fea8d5..cfabaa08 100644 --- a/src/clerk_backend_api/models/updateorganizationroleop.py +++ b/src/clerk_backend_api/models/updateorganizationroleop.py @@ -40,31 +40,26 @@ class UpdateOrganizationRoleRequestBody(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["name", "key", "description", "permissions"] - nullable_fields = ["name", "key", "description", "permissions"] - null_default_fields = [] - + optional_fields = set(["name", "key", "description", "permissions"]) + nullable_fields = set(["name", "key", "description", "permissions"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/updatephonenumberop.py b/src/clerk_backend_api/models/updatephonenumberop.py index 9b094b16..89ba0eaa 100644 --- a/src/clerk_backend_api/models/updatephonenumberop.py +++ b/src/clerk_backend_api/models/updatephonenumberop.py @@ -41,31 +41,26 @@ class UpdatePhoneNumberRequestBody(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["verified", "primary", "reserved_for_second_factor"] - nullable_fields = ["verified", "primary", "reserved_for_second_factor"] - null_default_fields = [] - + optional_fields = set(["verified", "primary", "reserved_for_second_factor"]) + nullable_fields = set(["verified", "primary", "reserved_for_second_factor"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m @@ -86,3 +81,19 @@ class UpdatePhoneNumberRequest(BaseModel): Optional[UpdatePhoneNumberRequestBody], FieldMetadata(request=RequestMetadata(media_type="application/json")), ] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["RequestBody"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/updateproductioninstancedomainop.py b/src/clerk_backend_api/models/updateproductioninstancedomainop.py index d56c9fa1..ca60067e 100644 --- a/src/clerk_backend_api/models/updateproductioninstancedomainop.py +++ b/src/clerk_backend_api/models/updateproductioninstancedomainop.py @@ -1,7 +1,8 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL +from pydantic import model_serializer from typing import Optional from typing_extensions import NotRequired, TypedDict @@ -19,3 +20,19 @@ class UpdateProductionInstanceDomainRequestBody(BaseModel): is_secondary: Optional[bool] = None r"""Whether the domain is a secondary app.""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["home_url", "is_secondary"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/updaterolesetop.py b/src/clerk_backend_api/models/updaterolesetop.py new file mode 100644 index 00000000..3c563840 --- /dev/null +++ b/src/clerk_backend_api/models/updaterolesetop.py @@ -0,0 +1,130 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from clerk_backend_api.types import ( + BaseModel, + Nullable, + OptionalNullable, + UNSET, + UNSET_SENTINEL, +) +from clerk_backend_api.utils import FieldMetadata, PathParamMetadata, RequestMetadata +from enum import Enum +from pydantic import model_serializer +from typing_extensions import Annotated, NotRequired, TypedDict + + +class UpdateRoleSetType(str, Enum): + r"""Set to \"initial\" to make this the default role set for new organizations. + Only one role set can be \"initial\" per instance; setting this will change any existing initial role set to \"custom\". + """ + + INITIAL = "initial" + + +class UpdateRoleSetRequestBodyTypedDict(TypedDict): + name: NotRequired[Nullable[str]] + r"""The new name for the role set""" + key: NotRequired[Nullable[str]] + r"""A unique key for the role set. Must start with 'role_set:' and contain only lowercase alphanumeric characters and underscores.""" + description: NotRequired[Nullable[str]] + r"""Optional description for the role set""" + type: NotRequired[Nullable[UpdateRoleSetType]] + r"""Set to \"initial\" to make this the default role set for new organizations. + Only one role set can be \"initial\" per instance; setting this will change any existing initial role set to \"custom\". + """ + default_role_key: NotRequired[Nullable[str]] + r"""The key of the role to use as the default role for new organization members. + Must be an existing role in the role set. + """ + creator_role_key: NotRequired[Nullable[str]] + r"""The key of the role to assign to organization creators. + Must be an existing role in the role set. + """ + + +class UpdateRoleSetRequestBody(BaseModel): + name: OptionalNullable[str] = UNSET + r"""The new name for the role set""" + + key: OptionalNullable[str] = UNSET + r"""A unique key for the role set. Must start with 'role_set:' and contain only lowercase alphanumeric characters and underscores.""" + + description: OptionalNullable[str] = UNSET + r"""Optional description for the role set""" + + type: OptionalNullable[UpdateRoleSetType] = UNSET + r"""Set to \"initial\" to make this the default role set for new organizations. + Only one role set can be \"initial\" per instance; setting this will change any existing initial role set to \"custom\". + """ + + default_role_key: OptionalNullable[str] = UNSET + r"""The key of the role to use as the default role for new organization members. + Must be an existing role in the role set. + """ + + creator_role_key: OptionalNullable[str] = UNSET + r"""The key of the role to assign to organization creators. + Must be an existing role in the role set. + """ + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + [ + "name", + "key", + "description", + "type", + "default_role_key", + "creator_role_key", + ] + ) + nullable_fields = set( + [ + "name", + "key", + "description", + "type", + "default_role_key", + "creator_role_key", + ] + ) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val + + return m + + +class UpdateRoleSetRequestTypedDict(TypedDict): + role_set_key_or_id: str + r"""The key or ID of the role set to update""" + request_body: UpdateRoleSetRequestBodyTypedDict + + +class UpdateRoleSetRequest(BaseModel): + role_set_key_or_id: Annotated[ + str, FieldMetadata(path=PathParamMetadata(style="simple", explode=False)) + ] + r"""The key or ID of the role set to update""" + + request_body: Annotated[ + UpdateRoleSetRequestBody, + FieldMetadata(request=RequestMetadata(media_type="application/json")), + ] diff --git a/src/clerk_backend_api/models/updatesamlconnectionop.py b/src/clerk_backend_api/models/updatesamlconnectionop.py index 0378a5b5..f9177bcf 100644 --- a/src/clerk_backend_api/models/updatesamlconnectionop.py +++ b/src/clerk_backend_api/models/updatesamlconnectionop.py @@ -35,6 +35,22 @@ class AttributeMapping(BaseModel): last_name: Optional[str] = None + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["user_id", "email_address", "first_name", "last_name"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m + class UpdateSAMLConnectionRequestBodyTypedDict(TypedDict): name: NotRequired[Nullable[str]] @@ -127,64 +143,63 @@ class UpdateSAMLConnectionRequestBody(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "name", - "domain", - "domains", - "idp_entity_id", - "idp_sso_url", - "idp_certificate", - "idp_metadata_url", - "idp_metadata", - "organization_id", - "attribute_mapping", - "active", - "sync_user_attributes", - "allow_subdomains", - "allow_idp_initiated", - "disable_additional_identifications", - "force_authn", - ] - nullable_fields = [ - "name", - "domain", - "domains", - "idp_entity_id", - "idp_sso_url", - "idp_certificate", - "idp_metadata_url", - "idp_metadata", - "organization_id", - "attribute_mapping", - "active", - "sync_user_attributes", - "allow_subdomains", - "allow_idp_initiated", - "disable_additional_identifications", - ] - null_default_fields = [] - + optional_fields = set( + [ + "name", + "domain", + "domains", + "idp_entity_id", + "idp_sso_url", + "idp_certificate", + "idp_metadata_url", + "idp_metadata", + "organization_id", + "attribute_mapping", + "active", + "sync_user_attributes", + "allow_subdomains", + "allow_idp_initiated", + "disable_additional_identifications", + "force_authn", + ] + ) + nullable_fields = set( + [ + "name", + "domain", + "domains", + "idp_entity_id", + "idp_sso_url", + "idp_certificate", + "idp_metadata_url", + "idp_metadata", + "organization_id", + "attribute_mapping", + "active", + "sync_user_attributes", + "allow_subdomains", + "allow_idp_initiated", + "disable_additional_identifications", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/updatesignupop.py b/src/clerk_backend_api/models/updatesignupop.py index a6907aea..957d5aa6 100644 --- a/src/clerk_backend_api/models/updatesignupop.py +++ b/src/clerk_backend_api/models/updatesignupop.py @@ -34,31 +34,26 @@ class UpdateSignUpRequestBody(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["external_id", "custom_action"] - nullable_fields = ["external_id", "custom_action"] - null_default_fields = [] - + optional_fields = set(["external_id", "custom_action"]) + nullable_fields = set(["external_id", "custom_action"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m @@ -79,3 +74,19 @@ class UpdateSignUpRequest(BaseModel): Optional[UpdateSignUpRequestBody], FieldMetadata(request=RequestMetadata(media_type="application/json")), ] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["RequestBody"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/updateusermetadataop.py b/src/clerk_backend_api/models/updateusermetadataop.py index 189fc133..789a90a8 100644 --- a/src/clerk_backend_api/models/updateusermetadataop.py +++ b/src/clerk_backend_api/models/updateusermetadataop.py @@ -1,8 +1,9 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from clerk_backend_api.utils import FieldMetadata, PathParamMetadata, RequestMetadata +from pydantic import model_serializer from typing import Any, Dict, Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -42,6 +43,24 @@ class UpdateUserMetadataRequestBody(BaseModel): Note: Since this data can be modified from the frontend, it is not guaranteed to be safe. """ + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set( + ["public_metadata", "private_metadata", "unsafe_metadata"] + ) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m + class UpdateUserMetadataRequestTypedDict(TypedDict): user_id: str @@ -59,3 +78,19 @@ class UpdateUserMetadataRequest(BaseModel): Optional[UpdateUserMetadataRequestBody], FieldMetadata(request=RequestMetadata(media_type="application/json")), ] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["RequestBody"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/updateuserop.py b/src/clerk_backend_api/models/updateuserop.py index 37cc810b..e6e96fb7 100644 --- a/src/clerk_backend_api/models/updateuserop.py +++ b/src/clerk_backend_api/models/updateuserop.py @@ -62,7 +62,7 @@ class UpdateUserRequestBodyTypedDict(TypedDict): The algorithms we support at the moment are [`bcrypt`](https://en.wikipedia.org/wiki/Bcrypt), [`bcrypt_sha256_django`](https://docs.djangoproject.com/en/4.0/topics/auth/passwords/), [`md5`](https://en.wikipedia.org/wiki/MD5), `pbkdf2_sha1`, `pbkdf2_sha256`, [`pbkdf2_sha256_django`](https://docs.djangoproject.com/en/4.0/topics/auth/passwords/), [`phpass`](https://www.openwall.com/phpass/), `md5_phpass`, [`scrypt_firebase`](https://firebaseopensource.com/projects/firebase/scrypt/), [`scrypt_werkzeug`](https://werkzeug.palletsprojects.com/en/3.0.x/utils/#werkzeug.security.generate_password_hash), [`sha256`](https://en.wikipedia.org/wiki/SHA-2), - [`ldap_ssha`](https://www.openldap.org/faq/data/cache/347.html) and the [`argon2`](https://argon2.online/) variants: `argon2i` and `argon2id`. + [`ldap_ssha`](https://www.openldap.org/faq/data/cache/347.html), the [`argon2`](https://argon2.online/) variants: `argon2i` and `argon2id`, and `sha512_symfony`, the SHA-512 variant of the [Symfony](https://symfony.com/doc/current/security/passwords.html) legacy hasher. Each of the supported hashers expects the incoming digest to be in a particular format. See the [Clerk docs](https://clerk.com/docs/references/backend/user/create-user) for more information. """ @@ -167,7 +167,7 @@ class UpdateUserRequestBody(BaseModel): The algorithms we support at the moment are [`bcrypt`](https://en.wikipedia.org/wiki/Bcrypt), [`bcrypt_sha256_django`](https://docs.djangoproject.com/en/4.0/topics/auth/passwords/), [`md5`](https://en.wikipedia.org/wiki/MD5), `pbkdf2_sha1`, `pbkdf2_sha256`, [`pbkdf2_sha256_django`](https://docs.djangoproject.com/en/4.0/topics/auth/passwords/), [`phpass`](https://www.openwall.com/phpass/), `md5_phpass`, [`scrypt_firebase`](https://firebaseopensource.com/projects/firebase/scrypt/), [`scrypt_werkzeug`](https://werkzeug.palletsprojects.com/en/3.0.x/utils/#werkzeug.security.generate_password_hash), [`sha256`](https://en.wikipedia.org/wiki/SHA-2), - [`ldap_ssha`](https://www.openldap.org/faq/data/cache/347.html) and the [`argon2`](https://argon2.online/) variants: `argon2i` and `argon2id`. + [`ldap_ssha`](https://www.openldap.org/faq/data/cache/347.html), the [`argon2`](https://argon2.online/) variants: `argon2i` and `argon2id`, and `sha512_symfony`, the SHA-512 variant of the [Symfony](https://symfony.com/doc/current/security/passwords.html) legacy hasher. Each of the supported hashers expects the incoming digest to be in a particular format. See the [Clerk docs](https://clerk.com/docs/references/backend/user/create-user) for more information. """ @@ -227,84 +227,83 @@ class UpdateUserRequestBody(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "external_id", - "first_name", - "last_name", - "locale", - "primary_email_address_id", - "notify_primary_email_address_changed", - "primary_phone_number_id", - "primary_web3_wallet_id", - "username", - "profile_image_id", - "password", - "password_digest", - "password_hasher", - "skip_password_checks", - "sign_out_of_other_sessions", - "totp_secret", - "backup_codes", - "public_metadata", - "private_metadata", - "unsafe_metadata", - "delete_self_enabled", - "create_organization_enabled", - "legal_accepted_at", - "skip_legal_checks", - "create_organizations_limit", - "created_at", - "bypass_client_trust", - ] - nullable_fields = [ - "external_id", - "first_name", - "last_name", - "locale", - "primary_email_address_id", - "notify_primary_email_address_changed", - "primary_phone_number_id", - "primary_web3_wallet_id", - "username", - "profile_image_id", - "password", - "skip_password_checks", - "sign_out_of_other_sessions", - "totp_secret", - "public_metadata", - "private_metadata", - "unsafe_metadata", - "delete_self_enabled", - "create_organization_enabled", - "legal_accepted_at", - "skip_legal_checks", - "create_organizations_limit", - "created_at", - "bypass_client_trust", - ] - null_default_fields = [] - + optional_fields = set( + [ + "external_id", + "first_name", + "last_name", + "locale", + "primary_email_address_id", + "notify_primary_email_address_changed", + "primary_phone_number_id", + "primary_web3_wallet_id", + "username", + "profile_image_id", + "password", + "password_digest", + "password_hasher", + "skip_password_checks", + "sign_out_of_other_sessions", + "totp_secret", + "backup_codes", + "public_metadata", + "private_metadata", + "unsafe_metadata", + "delete_self_enabled", + "create_organization_enabled", + "legal_accepted_at", + "skip_legal_checks", + "create_organizations_limit", + "created_at", + "bypass_client_trust", + ] + ) + nullable_fields = set( + [ + "external_id", + "first_name", + "last_name", + "locale", + "primary_email_address_id", + "notify_primary_email_address_changed", + "primary_phone_number_id", + "primary_web3_wallet_id", + "username", + "profile_image_id", + "password", + "skip_password_checks", + "sign_out_of_other_sessions", + "totp_secret", + "public_metadata", + "private_metadata", + "unsafe_metadata", + "delete_self_enabled", + "create_organization_enabled", + "legal_accepted_at", + "skip_legal_checks", + "create_organizations_limit", + "created_at", + "bypass_client_trust", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/uploadorganizationlogoop.py b/src/clerk_backend_api/models/uploadorganizationlogoop.py index 55688ddc..48415c8d 100644 --- a/src/clerk_backend_api/models/uploadorganizationlogoop.py +++ b/src/clerk_backend_api/models/uploadorganizationlogoop.py @@ -1,7 +1,7 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from clerk_backend_api.utils import ( FieldMetadata, MultipartFormMetadata, @@ -10,6 +10,7 @@ ) import io import pydantic +from pydantic import model_serializer from typing import IO, Optional, Union from typing_extensions import Annotated, NotRequired, TypedDict @@ -37,6 +38,22 @@ class UploadOrganizationLogoFile(BaseModel): FieldMetadata(multipart=True), ] = None + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["contentType"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m + class UploadOrganizationLogoRequestBodyTypedDict(TypedDict): file: UploadOrganizationLogoFileTypedDict @@ -53,6 +70,22 @@ class UploadOrganizationLogoRequestBody(BaseModel): uploader_user_id: Annotated[Optional[str], FieldMetadata(multipart=True)] = None r"""The ID of the user that will be credited with the image upload.""" + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["uploader_user_id"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m + class UploadOrganizationLogoRequestTypedDict(TypedDict): organization_id: str @@ -70,3 +103,19 @@ class UploadOrganizationLogoRequest(BaseModel): Optional[UploadOrganizationLogoRequestBody], FieldMetadata(request=RequestMetadata(media_type="multipart/form-data")), ] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["RequestBody"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/upserttemplateop.py b/src/clerk_backend_api/models/upserttemplateop.py index 1c2663f7..f4497c78 100644 --- a/src/clerk_backend_api/models/upserttemplateop.py +++ b/src/clerk_backend_api/models/upserttemplateop.py @@ -79,39 +79,36 @@ class UpsertTemplateRequestBody(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "name", - "subject", - "markup", - "body", - "delivered_by_clerk", - "from_email_name", - "reply_to_email_name", - ] - nullable_fields = ["subject", "markup", "delivered_by_clerk"] - null_default_fields = [] - + optional_fields = set( + [ + "name", + "subject", + "markup", + "body", + "delivered_by_clerk", + "from_email_name", + "reply_to_email_name", + ] + ) + nullable_fields = set(["subject", "markup", "delivered_by_clerk"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m @@ -140,3 +137,19 @@ class UpsertTemplateRequest(BaseModel): Optional[UpsertTemplateRequestBody], FieldMetadata(request=RequestMetadata(media_type="application/json")), ] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["RequestBody"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/user.py b/src/clerk_backend_api/models/user.py index e6794943..55f468b8 100644 --- a/src/clerk_backend_api/models/user.py +++ b/src/clerk_backend_api/models/user.py @@ -280,59 +280,58 @@ class User(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ - "locale", - "profile_image_url", - "image_url", - "private_metadata", - "unsafe_metadata", - "password_last_updated_at", - "organization_memberships", - "create_organizations_limit", - "bypass_client_trust", - ] - nullable_fields = [ - "external_id", - "primary_email_address_id", - "primary_phone_number_id", - "primary_web3_wallet_id", - "username", - "first_name", - "last_name", - "locale", - "private_metadata", - "mfa_enabled_at", - "mfa_disabled_at", - "password_last_updated_at", - "last_sign_in_at", - "lockout_expires_in_seconds", - "verification_attempts_remaining", - "create_organizations_limit", - "last_active_at", - "legal_accepted_at", - ] - null_default_fields = [] - + optional_fields = set( + [ + "locale", + "profile_image_url", + "image_url", + "private_metadata", + "unsafe_metadata", + "password_last_updated_at", + "organization_memberships", + "create_organizations_limit", + "bypass_client_trust", + ] + ) + nullable_fields = set( + [ + "external_id", + "primary_email_address_id", + "primary_phone_number_id", + "primary_web3_wallet_id", + "username", + "first_name", + "last_name", + "locale", + "private_metadata", + "mfa_enabled_at", + "mfa_disabled_at", + "password_last_updated_at", + "last_sign_in_at", + "lockout_expires_in_seconds", + "verification_attempts_remaining", + "create_organizations_limit", + "last_active_at", + "legal_accepted_at", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/usersgetorganizationinvitationsop.py b/src/clerk_backend_api/models/usersgetorganizationinvitationsop.py index ef29b2fc..ecdf9979 100644 --- a/src/clerk_backend_api/models/usersgetorganizationinvitationsop.py +++ b/src/clerk_backend_api/models/usersgetorganizationinvitationsop.py @@ -1,9 +1,10 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from clerk_backend_api.utils import FieldMetadata, PathParamMetadata, QueryParamMetadata from enum import Enum +from pydantic import model_serializer from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -60,3 +61,19 @@ class UsersGetOrganizationInvitationsRequest(BaseModel): FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), ] = None r"""Filter organization invitations based on their status""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["limit", "offset", "status"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/usersgetorganizationmembershipsop.py b/src/clerk_backend_api/models/usersgetorganizationmembershipsop.py index e7a6d51e..38d4f67e 100644 --- a/src/clerk_backend_api/models/usersgetorganizationmembershipsop.py +++ b/src/clerk_backend_api/models/usersgetorganizationmembershipsop.py @@ -1,8 +1,9 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from clerk_backend_api.utils import FieldMetadata, PathParamMetadata, QueryParamMetadata +from pydantic import model_serializer from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -43,3 +44,19 @@ class UsersGetOrganizationMembershipsRequest(BaseModel): Needs to be an integer greater or equal to zero. To be used in conjunction with `limit`. """ + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["limit", "offset"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/verifyapikeyop.py b/src/clerk_backend_api/models/verifyapikeyop.py index 9728e761..19165262 100644 --- a/src/clerk_backend_api/models/verifyapikeyop.py +++ b/src/clerk_backend_api/models/verifyapikeyop.py @@ -113,10 +113,14 @@ class VerifyAPIKeyResponseBodyTypedDict(TypedDict): revocation_reason: Nullable[str] expired: bool expiration: Nullable[float] + r"""The timestamp for when the API key will expire, in milliseconds""" created_by: Nullable[str] last_used_at: Nullable[float] + r"""The timestamp for when the API key was last used, in milliseconds""" created_at: float + r"""The timestamp for when the API key was created, in milliseconds""" updated_at: float + r"""The timestamp for when the API key was last updated, in milliseconds""" description: NotRequired[Nullable[str]] @@ -144,50 +148,51 @@ class VerifyAPIKeyResponseBody(BaseModel): expired: bool expiration: Nullable[float] + r"""The timestamp for when the API key will expire, in milliseconds""" created_by: Nullable[str] last_used_at: Nullable[float] + r"""The timestamp for when the API key was last used, in milliseconds""" created_at: float + r"""The timestamp for when the API key was created, in milliseconds""" updated_at: float + r"""The timestamp for when the API key was last updated, in milliseconds""" description: OptionalNullable[str] = UNSET @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["description"] - nullable_fields = [ - "description", - "claims", - "revocation_reason", - "expiration", - "created_by", - "last_used_at", - ] - null_default_fields = [] - + optional_fields = set(["description"]) + nullable_fields = set( + [ + "description", + "claims", + "revocation_reason", + "expiration", + "created_by", + "last_used_at", + ] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/verifydomainproxyop.py b/src/clerk_backend_api/models/verifydomainproxyop.py index 019f7b9d..374a18d6 100644 --- a/src/clerk_backend_api/models/verifydomainproxyop.py +++ b/src/clerk_backend_api/models/verifydomainproxyop.py @@ -1,7 +1,8 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL +from pydantic import model_serializer from typing import Optional from typing_extensions import NotRequired, TypedDict @@ -19,3 +20,19 @@ class VerifyDomainProxyRequestBody(BaseModel): proxy_url: Optional[str] = None r"""The full URL of the proxy which will forward requests to the Clerk Frontend API for this domain. e.g. https://example.com/__clerk""" + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["domain_id", "proxy_url"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/verifym2mtokenop.py b/src/clerk_backend_api/models/verifym2mtokenop.py index e2ca3c32..63b2318c 100644 --- a/src/clerk_backend_api/models/verifym2mtokenop.py +++ b/src/clerk_backend_api/models/verifym2mtokenop.py @@ -109,9 +109,13 @@ class VerifyM2MTokenResponseBodyTypedDict(TypedDict): revocation_reason: Nullable[str] expired: bool expiration: Nullable[float] + r"""The timestamp for when the token will expire, in milliseconds""" last_used_at: Nullable[float] + r"""The timestamp for when the token was last used, in milliseconds""" created_at: float + r"""The timestamp for when the token was created, in milliseconds""" updated_at: float + r"""The timestamp for when the token was last updated, in milliseconds""" claims: NotRequired[Nullable[Any]] scopes: NotRequired[List[str]] @@ -132,12 +136,16 @@ class VerifyM2MTokenResponseBody(BaseModel): expired: bool expiration: Nullable[float] + r"""The timestamp for when the token will expire, in milliseconds""" last_used_at: Nullable[float] + r"""The timestamp for when the token was last used, in milliseconds""" created_at: float + r"""The timestamp for when the token was created, in milliseconds""" updated_at: float + r"""The timestamp for when the token was last updated, in milliseconds""" claims: OptionalNullable[Any] = UNSET @@ -145,30 +153,27 @@ class VerifyM2MTokenResponseBody(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["claims", "scopes"] - nullable_fields = ["claims", "revocation_reason", "expiration", "last_used_at"] - null_default_fields = [] - + optional_fields = set(["claims", "scopes"]) + nullable_fields = set( + ["claims", "revocation_reason", "expiration", "last_used_at"] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/verifyoauthaccesstokenop.py b/src/clerk_backend_api/models/verifyoauthaccesstokenop.py index 162f5a07..09c6059c 100644 --- a/src/clerk_backend_api/models/verifyoauthaccesstokenop.py +++ b/src/clerk_backend_api/models/verifyoauthaccesstokenop.py @@ -31,6 +31,22 @@ class VerifyOAuthAccessTokenRequestBody(BaseModel): ] = None r"""The access token to verify. This is deprecated, use `access_token` instead.""" + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["access_token", "secret"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m + class VerifyOAuthAccessTokenOauthAccessTokensErrorsTypedDict(TypedDict): message: str @@ -157,30 +173,14 @@ class ResponseBody1(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [] - nullable_fields = ["revocation_reason", "expiration"] - null_default_fields = [] - serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): + if val != UNSET_SENTINEL: m[k] = val return m diff --git a/src/clerk_backend_api/models/verifypasswordop.py b/src/clerk_backend_api/models/verifypasswordop.py index 1e13d00f..1254eac5 100644 --- a/src/clerk_backend_api/models/verifypasswordop.py +++ b/src/clerk_backend_api/models/verifypasswordop.py @@ -1,8 +1,9 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from clerk_backend_api.utils import FieldMetadata, PathParamMetadata, RequestMetadata +from pydantic import model_serializer from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -34,6 +35,22 @@ class VerifyPasswordRequest(BaseModel): FieldMetadata(request=RequestMetadata(media_type="application/json")), ] = None + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["RequestBody"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m + class VerifyPasswordResponseBodyTypedDict(TypedDict): r"""The provided password was correct.""" @@ -45,3 +62,19 @@ class VerifyPasswordResponseBody(BaseModel): r"""The provided password was correct.""" verified: Optional[bool] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["verified"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/verifytotpop.py b/src/clerk_backend_api/models/verifytotpop.py index 8532d8bd..1fb852b6 100644 --- a/src/clerk_backend_api/models/verifytotpop.py +++ b/src/clerk_backend_api/models/verifytotpop.py @@ -1,9 +1,10 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from clerk_backend_api.types import BaseModel +from clerk_backend_api.types import BaseModel, UNSET_SENTINEL from clerk_backend_api.utils import FieldMetadata, PathParamMetadata, RequestMetadata from enum import Enum +from pydantic import model_serializer from typing import Optional from typing_extensions import Annotated, NotRequired, TypedDict @@ -35,6 +36,22 @@ class VerifyTOTPRequest(BaseModel): FieldMetadata(request=RequestMetadata(media_type="application/json")), ] = None + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["RequestBody"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m + class CodeType(str, Enum): TOTP = "totp" @@ -54,3 +71,19 @@ class VerifyTOTPResponseBody(BaseModel): verified: Optional[bool] = None code_type: Optional[CodeType] = None + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["verified", "code_type"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + + return m diff --git a/src/clerk_backend_api/models/waitlistentry.py b/src/clerk_backend_api/models/waitlistentry.py index 81dbf1b5..5f807a92 100644 --- a/src/clerk_backend_api/models/waitlistentry.py +++ b/src/clerk_backend_api/models/waitlistentry.py @@ -90,31 +90,26 @@ class WaitlistEntryInvitation(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["revoked", "url", "expires_at"] - nullable_fields = ["expires_at"] - null_default_fields = [] - + optional_fields = set(["revoked", "url", "expires_at"]) + nullable_fields = set(["expires_at"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m @@ -167,30 +162,25 @@ class WaitlistEntry(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["is_locked", "invitation"] - nullable_fields = ["invitation"] - null_default_fields = [] - + optional_fields = set(["is_locked", "invitation"]) + nullable_fields = set(["invitation"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/models/web3wallet.py b/src/clerk_backend_api/models/web3wallet.py index d998f4f9..4df0fc3d 100644 --- a/src/clerk_backend_api/models/web3wallet.py +++ b/src/clerk_backend_api/models/web3wallet.py @@ -9,10 +9,9 @@ UNSET, UNSET_SENTINEL, ) -from clerk_backend_api.utils import get_discriminator, validate_open_enum +from clerk_backend_api.utils import get_discriminator from enum import Enum from pydantic import Discriminator, Tag, field_serializer, model_serializer -from pydantic.functional_validators import PlainValidator from typing import Optional, Union from typing_extensions import Annotated, NotRequired, TypeAliasType, TypedDict @@ -49,10 +48,7 @@ class VerificationAdminVerificationAdminTypedDict(TypedDict): class VerificationAdminVerificationAdmin(BaseModel): status: VerificationAdminVerificationWeb3WalletStatus - strategy: Annotated[ - VerificationAdminVerificationWeb3WalletStrategy, - PlainValidator(validate_open_enum(False)), - ] + strategy: VerificationAdminVerificationWeb3WalletStrategy attempts: Nullable[int] @@ -73,31 +69,26 @@ def serialize_strategy(self, value): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["object", "verified_at_client"] - nullable_fields = ["attempts", "expire_at", "verified_at_client"] - null_default_fields = [] - + optional_fields = set(["object", "verified_at_client"]) + nullable_fields = set(["attempts", "expire_at", "verified_at_client"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m @@ -151,37 +142,28 @@ class Web3Signature(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["object", "nonce", "message", "verified_at_client"] - nullable_fields = [ - "nonce", - "message", - "attempts", - "expire_at", - "verified_at_client", - ] - null_default_fields = [] - + optional_fields = set(["object", "nonce", "message", "verified_at_client"]) + nullable_fields = set( + ["nonce", "message", "attempts", "expire_at", "verified_at_client"] + ) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m @@ -243,30 +225,25 @@ class Web3Wallet(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["id"] - nullable_fields = ["verification"] - null_default_fields = [] - + optional_fields = set(["id"]) + nullable_fields = set(["verification"]) serialized = handler(self) - m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val return m diff --git a/src/clerk_backend_api/organizationinvitations_sdk.py b/src/clerk_backend_api/organizationinvitations_sdk.py index b5abd0ca..8d031143 100644 --- a/src/clerk_backend_api/organizationinvitations_sdk.py +++ b/src/clerk_backend_api/organizationinvitations_sdk.py @@ -265,6 +265,7 @@ def create( private_metadata: OptionalNullable[Dict[str, Any]] = UNSET, redirect_url: OptionalNullable[str] = UNSET, expires_in_days: OptionalNullable[int] = UNSET, + notify: OptionalNullable[bool] = True, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, @@ -300,6 +301,8 @@ def create( When the organization invitation is accepted, the metadata will be transferred to the newly created organization membership. :param redirect_url: Optional URL that the invitee will be redirected to once they accept the invitation by clicking the join link in the invitation email. :param expires_in_days: The number of days the invitation will be valid for. By default, the invitation has a 30 days expire. + :param notify: Optional flag which denotes whether an email invitation should be sent to the given email address. + Defaults to `true`. :param retries: Override the default retry configuration for this method :param server_url: Override the default server URL for this method :param timeout_ms: Override the default request timeout configuration for this method in milliseconds @@ -325,6 +328,7 @@ def create( private_metadata=private_metadata, redirect_url=redirect_url, expires_in_days=expires_in_days, + notify=notify, ), ) @@ -405,6 +409,7 @@ async def create_async( private_metadata: OptionalNullable[Dict[str, Any]] = UNSET, redirect_url: OptionalNullable[str] = UNSET, expires_in_days: OptionalNullable[int] = UNSET, + notify: OptionalNullable[bool] = True, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, @@ -440,6 +445,8 @@ async def create_async( When the organization invitation is accepted, the metadata will be transferred to the newly created organization membership. :param redirect_url: Optional URL that the invitee will be redirected to once they accept the invitation by clicking the join link in the invitation email. :param expires_in_days: The number of days the invitation will be valid for. By default, the invitation has a 30 days expire. + :param notify: Optional flag which denotes whether an email invitation should be sent to the given email address. + Defaults to `true`. :param retries: Override the default retry configuration for this method :param server_url: Override the default server URL for this method :param timeout_ms: Override the default request timeout configuration for this method in milliseconds @@ -465,6 +472,7 @@ async def create_async( private_metadata=private_metadata, redirect_url=redirect_url, expires_in_days=expires_in_days, + notify=notify, ), ) diff --git a/src/clerk_backend_api/organizations_sdk.py b/src/clerk_backend_api/organizations_sdk.py index a46062dd..1066f6a8 100644 --- a/src/clerk_backend_api/organizations_sdk.py +++ b/src/clerk_backend_api/organizations_sdk.py @@ -359,14 +359,16 @@ def create( security_source=self.sdk_configuration.security, ), request=req, - error_status_codes=["400", "403", "422", "4XX", "5XX"], + error_status_codes=["400", "402", "403", "422", "4XX", "5XX"], retry_config=retry_config, ) response_data: Any = None if utils.match_response(http_res, "200", "application/json"): return unmarshal_json_response(models.Organization, http_res) - if utils.match_response(http_res, ["400", "403", "422"], "application/json"): + if utils.match_response( + http_res, ["400", "402", "403", "422"], "application/json" + ): response_data = unmarshal_json_response(models.ClerkErrorsData, http_res) raise models.ClerkErrors(response_data, http_res) if utils.match_response(http_res, "4XX", "*"): @@ -472,14 +474,16 @@ async def create_async( security_source=self.sdk_configuration.security, ), request=req, - error_status_codes=["400", "403", "422", "4XX", "5XX"], + error_status_codes=["400", "402", "403", "422", "4XX", "5XX"], retry_config=retry_config, ) response_data: Any = None if utils.match_response(http_res, "200", "application/json"): return unmarshal_json_response(models.Organization, http_res) - if utils.match_response(http_res, ["400", "403", "422"], "application/json"): + if utils.match_response( + http_res, ["400", "402", "403", "422"], "application/json" + ): response_data = unmarshal_json_response(models.ClerkErrorsData, http_res) raise models.ClerkErrors(response_data, http_res) if utils.match_response(http_res, "4XX", "*"): diff --git a/src/clerk_backend_api/rolesets_sdk.py b/src/clerk_backend_api/rolesets_sdk.py new file mode 100644 index 00000000..7bbdda4d --- /dev/null +++ b/src/clerk_backend_api/rolesets_sdk.py @@ -0,0 +1,1562 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from .basesdk import BaseSDK +from clerk_backend_api import models, utils +from clerk_backend_api._hooks import HookContext +from clerk_backend_api.types import OptionalNullable, UNSET +from clerk_backend_api.utils.unmarshal_json_response import unmarshal_json_response +from typing import Any, Dict, List, Mapping, Optional + + +class RoleSetsSDK(BaseSDK): + def list( + self, + *, + query: Optional[str] = None, + order_by: Optional[str] = "-created_at", + limit: Optional[int] = 10, + offset: Optional[int] = 0, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> models.RoleSets: + r"""Get a list of role sets + + Returns a list of role sets for the instance. + Results can be paginated using the optional `limit` and `offset` query parameters. + The role sets are ordered by descending creation date by default. + + :param query: Returns role sets with ID, name, or key that match the given query. + Uses exact match for role set ID and partial match for name and key. + :param order_by: Allows to return role sets in a particular order. + At the moment, you can order the returned role sets by their `created_at`, `name`, or `key`. + In order to specify the direction, you can use the `+/-` symbols prepended in the property to order by. + For example, if you want role sets to be returned in descending order according to their `created_at` property, you can use `-created_at`. + If you don't use `+` or `-`, then `+` is implied. + Defaults to `-created_at`. + :param limit: Applies a limit to the number of results returned. + Can be used for paginating the results together with `offset`. + :param offset: Skip the first `offset` results when paginating. + Needs to be an integer greater or equal to zero. + To be used in conjunction with `limit`. + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = models.ListRoleSetsRequest( + query=query, + order_by=order_by, + limit=limit, + offset=offset, + ) + + req = self._build_request( + method="GET", + path="/role_sets", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=False, + request_has_path_params=False, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + security=self.sdk_configuration.security, + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = self.do_request( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="ListRoleSets", + oauth2_scopes=None, + security_source=self.sdk_configuration.security, + ), + request=req, + error_status_codes=["400", "401", "403", "422", "4XX", "5XX"], + retry_config=retry_config, + ) + + response_data: Any = None + if utils.match_response(http_res, "200", "application/json"): + return unmarshal_json_response(models.RoleSets, http_res) + if utils.match_response( + http_res, ["400", "401", "403", "422"], "application/json" + ): + response_data = unmarshal_json_response(models.ClerkErrorsData, http_res) + raise models.ClerkErrors(response_data, http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise models.SDKError("API error occurred", http_res, http_res_text) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise models.SDKError("API error occurred", http_res, http_res_text) + + raise models.SDKError("Unexpected response received", http_res) + + async def list_async( + self, + *, + query: Optional[str] = None, + order_by: Optional[str] = "-created_at", + limit: Optional[int] = 10, + offset: Optional[int] = 0, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> models.RoleSets: + r"""Get a list of role sets + + Returns a list of role sets for the instance. + Results can be paginated using the optional `limit` and `offset` query parameters. + The role sets are ordered by descending creation date by default. + + :param query: Returns role sets with ID, name, or key that match the given query. + Uses exact match for role set ID and partial match for name and key. + :param order_by: Allows to return role sets in a particular order. + At the moment, you can order the returned role sets by their `created_at`, `name`, or `key`. + In order to specify the direction, you can use the `+/-` symbols prepended in the property to order by. + For example, if you want role sets to be returned in descending order according to their `created_at` property, you can use `-created_at`. + If you don't use `+` or `-`, then `+` is implied. + Defaults to `-created_at`. + :param limit: Applies a limit to the number of results returned. + Can be used for paginating the results together with `offset`. + :param offset: Skip the first `offset` results when paginating. + Needs to be an integer greater or equal to zero. + To be used in conjunction with `limit`. + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = models.ListRoleSetsRequest( + query=query, + order_by=order_by, + limit=limit, + offset=offset, + ) + + req = self._build_request_async( + method="GET", + path="/role_sets", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=False, + request_has_path_params=False, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + security=self.sdk_configuration.security, + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = await self.do_request_async( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="ListRoleSets", + oauth2_scopes=None, + security_source=self.sdk_configuration.security, + ), + request=req, + error_status_codes=["400", "401", "403", "422", "4XX", "5XX"], + retry_config=retry_config, + ) + + response_data: Any = None + if utils.match_response(http_res, "200", "application/json"): + return unmarshal_json_response(models.RoleSets, http_res) + if utils.match_response( + http_res, ["400", "401", "403", "422"], "application/json" + ): + response_data = unmarshal_json_response(models.ClerkErrorsData, http_res) + raise models.ClerkErrors(response_data, http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise models.SDKError("API error occurred", http_res, http_res_text) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise models.SDKError("API error occurred", http_res, http_res_text) + + raise models.SDKError("Unexpected response received", http_res) + + def create( + self, + *, + name: str, + default_role_key: str, + creator_role_key: str, + roles: List[str], + key: Optional[str] = None, + description: OptionalNullable[str] = UNSET, + type_: Optional[models.CreateRoleSetType] = None, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> models.RoleSet: + r"""Create a role set + + Creates a new role set with the given name and roles. + The key must be unique for the instance and start with the 'role_set:' prefix, followed by lowercase alphanumeric characters and underscores only. + You must provide at least one role and specify a default role key and creator role key. + + :param name: The name of the new role set + :param default_role_key: The key of the role to use as the default role for new organization members. + Must be one of the roles in the `roles` array. + :param creator_role_key: The key of the role to assign to organization creators. + Must be one of the roles in the `roles` array. + :param roles: Array of role keys to include in the role set. + Must contain at least one role and no more than 10 roles. + :param key: A unique key for the role set. Must start with 'role_set:' and contain only lowercase alphanumeric characters and underscores. + If not provided, a key will be generated from the name. + :param description: Optional description for the role set + :param type: The type of the role set. \"initial\" role sets are the default for new organizations. + Only one role set can be \"initial\" per instance. + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = models.CreateRoleSetRequestBody( + name=name, + key=key, + description=description, + default_role_key=default_role_key, + creator_role_key=creator_role_key, + type=type_, + roles=roles, + ) + + req = self._build_request( + method="POST", + path="/role_sets", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=True, + request_has_path_params=False, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + security=self.sdk_configuration.security, + get_serialized_body=lambda: utils.serialize_request_body( + request, False, False, "json", models.CreateRoleSetRequestBody + ), + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = self.do_request( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="CreateRoleSet", + oauth2_scopes=None, + security_source=self.sdk_configuration.security, + ), + request=req, + error_status_codes=["400", "401", "402", "403", "404", "422", "4XX", "5XX"], + retry_config=retry_config, + ) + + response_data: Any = None + if utils.match_response(http_res, "200", "application/json"): + return unmarshal_json_response(models.RoleSet, http_res) + if utils.match_response( + http_res, ["400", "401", "402", "403", "404", "422"], "application/json" + ): + response_data = unmarshal_json_response(models.ClerkErrorsData, http_res) + raise models.ClerkErrors(response_data, http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise models.SDKError("API error occurred", http_res, http_res_text) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise models.SDKError("API error occurred", http_res, http_res_text) + + raise models.SDKError("Unexpected response received", http_res) + + async def create_async( + self, + *, + name: str, + default_role_key: str, + creator_role_key: str, + roles: List[str], + key: Optional[str] = None, + description: OptionalNullable[str] = UNSET, + type_: Optional[models.CreateRoleSetType] = None, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> models.RoleSet: + r"""Create a role set + + Creates a new role set with the given name and roles. + The key must be unique for the instance and start with the 'role_set:' prefix, followed by lowercase alphanumeric characters and underscores only. + You must provide at least one role and specify a default role key and creator role key. + + :param name: The name of the new role set + :param default_role_key: The key of the role to use as the default role for new organization members. + Must be one of the roles in the `roles` array. + :param creator_role_key: The key of the role to assign to organization creators. + Must be one of the roles in the `roles` array. + :param roles: Array of role keys to include in the role set. + Must contain at least one role and no more than 10 roles. + :param key: A unique key for the role set. Must start with 'role_set:' and contain only lowercase alphanumeric characters and underscores. + If not provided, a key will be generated from the name. + :param description: Optional description for the role set + :param type: The type of the role set. \"initial\" role sets are the default for new organizations. + Only one role set can be \"initial\" per instance. + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = models.CreateRoleSetRequestBody( + name=name, + key=key, + description=description, + default_role_key=default_role_key, + creator_role_key=creator_role_key, + type=type_, + roles=roles, + ) + + req = self._build_request_async( + method="POST", + path="/role_sets", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=True, + request_has_path_params=False, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + security=self.sdk_configuration.security, + get_serialized_body=lambda: utils.serialize_request_body( + request, False, False, "json", models.CreateRoleSetRequestBody + ), + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = await self.do_request_async( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="CreateRoleSet", + oauth2_scopes=None, + security_source=self.sdk_configuration.security, + ), + request=req, + error_status_codes=["400", "401", "402", "403", "404", "422", "4XX", "5XX"], + retry_config=retry_config, + ) + + response_data: Any = None + if utils.match_response(http_res, "200", "application/json"): + return unmarshal_json_response(models.RoleSet, http_res) + if utils.match_response( + http_res, ["400", "401", "402", "403", "404", "422"], "application/json" + ): + response_data = unmarshal_json_response(models.ClerkErrorsData, http_res) + raise models.ClerkErrors(response_data, http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise models.SDKError("API error occurred", http_res, http_res_text) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise models.SDKError("API error occurred", http_res, http_res_text) + + raise models.SDKError("Unexpected response received", http_res) + + def get( + self, + *, + role_set_key_or_id: str, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> models.RoleSet: + r"""Retrieve a role set + + Retrieves an existing role set by its key or ID. + + :param role_set_key_or_id: The key or ID of the role set + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = models.GetRoleSetRequest( + role_set_key_or_id=role_set_key_or_id, + ) + + req = self._build_request( + method="GET", + path="/role_sets/{role_set_key_or_id}", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=False, + request_has_path_params=True, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + security=self.sdk_configuration.security, + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = self.do_request( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="GetRoleSet", + oauth2_scopes=None, + security_source=self.sdk_configuration.security, + ), + request=req, + error_status_codes=["401", "403", "404", "4XX", "5XX"], + retry_config=retry_config, + ) + + response_data: Any = None + if utils.match_response(http_res, "200", "application/json"): + return unmarshal_json_response(models.RoleSet, http_res) + if utils.match_response(http_res, ["401", "403", "404"], "application/json"): + response_data = unmarshal_json_response(models.ClerkErrorsData, http_res) + raise models.ClerkErrors(response_data, http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise models.SDKError("API error occurred", http_res, http_res_text) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise models.SDKError("API error occurred", http_res, http_res_text) + + raise models.SDKError("Unexpected response received", http_res) + + async def get_async( + self, + *, + role_set_key_or_id: str, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> models.RoleSet: + r"""Retrieve a role set + + Retrieves an existing role set by its key or ID. + + :param role_set_key_or_id: The key or ID of the role set + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = models.GetRoleSetRequest( + role_set_key_or_id=role_set_key_or_id, + ) + + req = self._build_request_async( + method="GET", + path="/role_sets/{role_set_key_or_id}", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=False, + request_has_path_params=True, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + security=self.sdk_configuration.security, + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = await self.do_request_async( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="GetRoleSet", + oauth2_scopes=None, + security_source=self.sdk_configuration.security, + ), + request=req, + error_status_codes=["401", "403", "404", "4XX", "5XX"], + retry_config=retry_config, + ) + + response_data: Any = None + if utils.match_response(http_res, "200", "application/json"): + return unmarshal_json_response(models.RoleSet, http_res) + if utils.match_response(http_res, ["401", "403", "404"], "application/json"): + response_data = unmarshal_json_response(models.ClerkErrorsData, http_res) + raise models.ClerkErrors(response_data, http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise models.SDKError("API error occurred", http_res, http_res_text) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise models.SDKError("API error occurred", http_res, http_res_text) + + raise models.SDKError("Unexpected response received", http_res) + + def update( + self, + *, + role_set_key_or_id: str, + name: OptionalNullable[str] = UNSET, + key: OptionalNullable[str] = UNSET, + description: OptionalNullable[str] = UNSET, + type_: OptionalNullable[models.UpdateRoleSetType] = UNSET, + default_role_key: OptionalNullable[str] = UNSET, + creator_role_key: OptionalNullable[str] = UNSET, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> models.RoleSet: + r"""Update a role set + + Updates an existing role set. + You can update the name, key, description, type, default role, or creator role. + All parameters are optional - you can update only the fields you want to change. + + :param role_set_key_or_id: The key or ID of the role set to update + :param name: The new name for the role set + :param key: A unique key for the role set. Must start with 'role_set:' and contain only lowercase alphanumeric characters and underscores. + :param description: Optional description for the role set + :param type: Set to \"initial\" to make this the default role set for new organizations. + Only one role set can be \"initial\" per instance; setting this will change any existing initial role set to \"custom\". + :param default_role_key: The key of the role to use as the default role for new organization members. + Must be an existing role in the role set. + :param creator_role_key: The key of the role to assign to organization creators. + Must be an existing role in the role set. + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = models.UpdateRoleSetRequest( + role_set_key_or_id=role_set_key_or_id, + request_body=models.UpdateRoleSetRequestBody( + name=name, + key=key, + description=description, + type=type_, + default_role_key=default_role_key, + creator_role_key=creator_role_key, + ), + ) + + req = self._build_request( + method="PATCH", + path="/role_sets/{role_set_key_or_id}", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=True, + request_has_path_params=True, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + security=self.sdk_configuration.security, + get_serialized_body=lambda: utils.serialize_request_body( + request.request_body, + False, + False, + "json", + models.UpdateRoleSetRequestBody, + ), + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = self.do_request( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="UpdateRoleSet", + oauth2_scopes=None, + security_source=self.sdk_configuration.security, + ), + request=req, + error_status_codes=["400", "401", "403", "404", "422", "4XX", "5XX"], + retry_config=retry_config, + ) + + response_data: Any = None + if utils.match_response(http_res, "200", "application/json"): + return unmarshal_json_response(models.RoleSet, http_res) + if utils.match_response( + http_res, ["400", "401", "403", "404", "422"], "application/json" + ): + response_data = unmarshal_json_response(models.ClerkErrorsData, http_res) + raise models.ClerkErrors(response_data, http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise models.SDKError("API error occurred", http_res, http_res_text) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise models.SDKError("API error occurred", http_res, http_res_text) + + raise models.SDKError("Unexpected response received", http_res) + + async def update_async( + self, + *, + role_set_key_or_id: str, + name: OptionalNullable[str] = UNSET, + key: OptionalNullable[str] = UNSET, + description: OptionalNullable[str] = UNSET, + type_: OptionalNullable[models.UpdateRoleSetType] = UNSET, + default_role_key: OptionalNullable[str] = UNSET, + creator_role_key: OptionalNullable[str] = UNSET, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> models.RoleSet: + r"""Update a role set + + Updates an existing role set. + You can update the name, key, description, type, default role, or creator role. + All parameters are optional - you can update only the fields you want to change. + + :param role_set_key_or_id: The key or ID of the role set to update + :param name: The new name for the role set + :param key: A unique key for the role set. Must start with 'role_set:' and contain only lowercase alphanumeric characters and underscores. + :param description: Optional description for the role set + :param type: Set to \"initial\" to make this the default role set for new organizations. + Only one role set can be \"initial\" per instance; setting this will change any existing initial role set to \"custom\". + :param default_role_key: The key of the role to use as the default role for new organization members. + Must be an existing role in the role set. + :param creator_role_key: The key of the role to assign to organization creators. + Must be an existing role in the role set. + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = models.UpdateRoleSetRequest( + role_set_key_or_id=role_set_key_or_id, + request_body=models.UpdateRoleSetRequestBody( + name=name, + key=key, + description=description, + type=type_, + default_role_key=default_role_key, + creator_role_key=creator_role_key, + ), + ) + + req = self._build_request_async( + method="PATCH", + path="/role_sets/{role_set_key_or_id}", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=True, + request_has_path_params=True, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + security=self.sdk_configuration.security, + get_serialized_body=lambda: utils.serialize_request_body( + request.request_body, + False, + False, + "json", + models.UpdateRoleSetRequestBody, + ), + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = await self.do_request_async( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="UpdateRoleSet", + oauth2_scopes=None, + security_source=self.sdk_configuration.security, + ), + request=req, + error_status_codes=["400", "401", "403", "404", "422", "4XX", "5XX"], + retry_config=retry_config, + ) + + response_data: Any = None + if utils.match_response(http_res, "200", "application/json"): + return unmarshal_json_response(models.RoleSet, http_res) + if utils.match_response( + http_res, ["400", "401", "403", "404", "422"], "application/json" + ): + response_data = unmarshal_json_response(models.ClerkErrorsData, http_res) + raise models.ClerkErrors(response_data, http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise models.SDKError("API error occurred", http_res, http_res_text) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise models.SDKError("API error occurred", http_res, http_res_text) + + raise models.SDKError("Unexpected response received", http_res) + + def replace( + self, + *, + role_set_key_or_id: str, + dest_role_set_key: str, + reassignment_mappings: Optional[Dict[str, str]] = None, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> models.DeletedObject: + r"""Replace a role set + + Replaces a role set with another role set. This is functionally equivalent to deleting + the role set but allows for atomic replacement with migration support. + Organizations using this role set will be migrated to the destination role set. + + :param role_set_key_or_id: The key or ID of the role set to replace + :param dest_role_set_key: The key of the destination role set + :param reassignment_mappings: Mappings from source role keys to destination role keys. + Required if members have roles that need to be reassigned. + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = models.ReplaceRoleSetRequest( + role_set_key_or_id=role_set_key_or_id, + request_body=models.ReplaceRoleSetRequestBody( + dest_role_set_key=dest_role_set_key, + reassignment_mappings=reassignment_mappings, + ), + ) + + req = self._build_request( + method="POST", + path="/role_sets/{role_set_key_or_id}/replace", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=True, + request_has_path_params=True, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + security=self.sdk_configuration.security, + get_serialized_body=lambda: utils.serialize_request_body( + request.request_body, + False, + False, + "json", + models.ReplaceRoleSetRequestBody, + ), + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = self.do_request( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="ReplaceRoleSet", + oauth2_scopes=None, + security_source=self.sdk_configuration.security, + ), + request=req, + error_status_codes=["400", "401", "403", "404", "422", "4XX", "5XX"], + retry_config=retry_config, + ) + + response_data: Any = None + if utils.match_response(http_res, "200", "application/json"): + return unmarshal_json_response(models.DeletedObject, http_res) + if utils.match_response( + http_res, ["400", "401", "403", "404", "422"], "application/json" + ): + response_data = unmarshal_json_response(models.ClerkErrorsData, http_res) + raise models.ClerkErrors(response_data, http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise models.SDKError("API error occurred", http_res, http_res_text) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise models.SDKError("API error occurred", http_res, http_res_text) + + raise models.SDKError("Unexpected response received", http_res) + + async def replace_async( + self, + *, + role_set_key_or_id: str, + dest_role_set_key: str, + reassignment_mappings: Optional[Dict[str, str]] = None, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> models.DeletedObject: + r"""Replace a role set + + Replaces a role set with another role set. This is functionally equivalent to deleting + the role set but allows for atomic replacement with migration support. + Organizations using this role set will be migrated to the destination role set. + + :param role_set_key_or_id: The key or ID of the role set to replace + :param dest_role_set_key: The key of the destination role set + :param reassignment_mappings: Mappings from source role keys to destination role keys. + Required if members have roles that need to be reassigned. + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = models.ReplaceRoleSetRequest( + role_set_key_or_id=role_set_key_or_id, + request_body=models.ReplaceRoleSetRequestBody( + dest_role_set_key=dest_role_set_key, + reassignment_mappings=reassignment_mappings, + ), + ) + + req = self._build_request_async( + method="POST", + path="/role_sets/{role_set_key_or_id}/replace", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=True, + request_has_path_params=True, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + security=self.sdk_configuration.security, + get_serialized_body=lambda: utils.serialize_request_body( + request.request_body, + False, + False, + "json", + models.ReplaceRoleSetRequestBody, + ), + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = await self.do_request_async( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="ReplaceRoleSet", + oauth2_scopes=None, + security_source=self.sdk_configuration.security, + ), + request=req, + error_status_codes=["400", "401", "403", "404", "422", "4XX", "5XX"], + retry_config=retry_config, + ) + + response_data: Any = None + if utils.match_response(http_res, "200", "application/json"): + return unmarshal_json_response(models.DeletedObject, http_res) + if utils.match_response( + http_res, ["400", "401", "403", "404", "422"], "application/json" + ): + response_data = unmarshal_json_response(models.ClerkErrorsData, http_res) + raise models.ClerkErrors(response_data, http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise models.SDKError("API error occurred", http_res, http_res_text) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise models.SDKError("API error occurred", http_res, http_res_text) + + raise models.SDKError("Unexpected response received", http_res) + + def add_roles( + self, + *, + role_set_key_or_id: str, + role_keys: List[str], + default_role_key: Optional[str] = None, + creator_role_key: Optional[str] = None, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> models.RoleSet: + r"""Add roles to a role set + + Adds one or more roles to an existing role set. + You can optionally update the default role or creator role when adding new roles. + + :param role_set_key_or_id: The key or ID of the role set + :param role_keys: Array of role keys to add to the role set. + Must contain at least one role and no more than 10 roles. + :param default_role_key: Optionally update the default role to one of the newly added roles. + :param creator_role_key: Optionally update the creator role to one of the newly added roles. + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = models.AddRolesToRoleSetRequest( + role_set_key_or_id=role_set_key_or_id, + request_body=models.AddRolesToRoleSetRequestBody( + role_keys=role_keys, + default_role_key=default_role_key, + creator_role_key=creator_role_key, + ), + ) + + req = self._build_request( + method="POST", + path="/role_sets/{role_set_key_or_id}/roles", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=True, + request_has_path_params=True, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + security=self.sdk_configuration.security, + get_serialized_body=lambda: utils.serialize_request_body( + request.request_body, + False, + False, + "json", + models.AddRolesToRoleSetRequestBody, + ), + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = self.do_request( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="AddRolesToRoleSet", + oauth2_scopes=None, + security_source=self.sdk_configuration.security, + ), + request=req, + error_status_codes=["400", "401", "403", "404", "422", "4XX", "5XX"], + retry_config=retry_config, + ) + + response_data: Any = None + if utils.match_response(http_res, "200", "application/json"): + return unmarshal_json_response(models.RoleSet, http_res) + if utils.match_response( + http_res, ["400", "401", "403", "404", "422"], "application/json" + ): + response_data = unmarshal_json_response(models.ClerkErrorsData, http_res) + raise models.ClerkErrors(response_data, http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise models.SDKError("API error occurred", http_res, http_res_text) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise models.SDKError("API error occurred", http_res, http_res_text) + + raise models.SDKError("Unexpected response received", http_res) + + async def add_roles_async( + self, + *, + role_set_key_or_id: str, + role_keys: List[str], + default_role_key: Optional[str] = None, + creator_role_key: Optional[str] = None, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> models.RoleSet: + r"""Add roles to a role set + + Adds one or more roles to an existing role set. + You can optionally update the default role or creator role when adding new roles. + + :param role_set_key_or_id: The key or ID of the role set + :param role_keys: Array of role keys to add to the role set. + Must contain at least one role and no more than 10 roles. + :param default_role_key: Optionally update the default role to one of the newly added roles. + :param creator_role_key: Optionally update the creator role to one of the newly added roles. + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = models.AddRolesToRoleSetRequest( + role_set_key_or_id=role_set_key_or_id, + request_body=models.AddRolesToRoleSetRequestBody( + role_keys=role_keys, + default_role_key=default_role_key, + creator_role_key=creator_role_key, + ), + ) + + req = self._build_request_async( + method="POST", + path="/role_sets/{role_set_key_or_id}/roles", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=True, + request_has_path_params=True, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + security=self.sdk_configuration.security, + get_serialized_body=lambda: utils.serialize_request_body( + request.request_body, + False, + False, + "json", + models.AddRolesToRoleSetRequestBody, + ), + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = await self.do_request_async( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="AddRolesToRoleSet", + oauth2_scopes=None, + security_source=self.sdk_configuration.security, + ), + request=req, + error_status_codes=["400", "401", "403", "404", "422", "4XX", "5XX"], + retry_config=retry_config, + ) + + response_data: Any = None + if utils.match_response(http_res, "200", "application/json"): + return unmarshal_json_response(models.RoleSet, http_res) + if utils.match_response( + http_res, ["400", "401", "403", "404", "422"], "application/json" + ): + response_data = unmarshal_json_response(models.ClerkErrorsData, http_res) + raise models.ClerkErrors(response_data, http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise models.SDKError("API error occurred", http_res, http_res_text) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise models.SDKError("API error occurred", http_res, http_res_text) + + raise models.SDKError("Unexpected response received", http_res) + + def replace_role( + self, + *, + role_set_key_or_id: str, + role_key: str, + to_role_key: str, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> models.RoleSet: + r"""Replace a role in a role set + + Replaces a role in a role set with another role. This atomically removes + the source role and reassigns any members to the destination role. + + :param role_set_key_or_id: The key or ID of the role set + :param role_key: The key of the role to remove from the role set + :param to_role_key: The key of the role to reassign members to + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = models.ReplaceRoleInRoleSetRequest( + role_set_key_or_id=role_set_key_or_id, + request_body=models.ReplaceRoleInRoleSetRequestBody( + role_key=role_key, + to_role_key=to_role_key, + ), + ) + + req = self._build_request( + method="POST", + path="/role_sets/{role_set_key_or_id}/roles/replace", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=True, + request_has_path_params=True, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + security=self.sdk_configuration.security, + get_serialized_body=lambda: utils.serialize_request_body( + request.request_body, + False, + False, + "json", + models.ReplaceRoleInRoleSetRequestBody, + ), + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = self.do_request( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="ReplaceRoleInRoleSet", + oauth2_scopes=None, + security_source=self.sdk_configuration.security, + ), + request=req, + error_status_codes=["400", "401", "403", "404", "422", "4XX", "5XX"], + retry_config=retry_config, + ) + + response_data: Any = None + if utils.match_response(http_res, "200", "application/json"): + return unmarshal_json_response(models.RoleSet, http_res) + if utils.match_response( + http_res, ["400", "401", "403", "404", "422"], "application/json" + ): + response_data = unmarshal_json_response(models.ClerkErrorsData, http_res) + raise models.ClerkErrors(response_data, http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise models.SDKError("API error occurred", http_res, http_res_text) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise models.SDKError("API error occurred", http_res, http_res_text) + + raise models.SDKError("Unexpected response received", http_res) + + async def replace_role_async( + self, + *, + role_set_key_or_id: str, + role_key: str, + to_role_key: str, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> models.RoleSet: + r"""Replace a role in a role set + + Replaces a role in a role set with another role. This atomically removes + the source role and reassigns any members to the destination role. + + :param role_set_key_or_id: The key or ID of the role set + :param role_key: The key of the role to remove from the role set + :param to_role_key: The key of the role to reassign members to + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = models.ReplaceRoleInRoleSetRequest( + role_set_key_or_id=role_set_key_or_id, + request_body=models.ReplaceRoleInRoleSetRequestBody( + role_key=role_key, + to_role_key=to_role_key, + ), + ) + + req = self._build_request_async( + method="POST", + path="/role_sets/{role_set_key_or_id}/roles/replace", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=True, + request_has_path_params=True, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + security=self.sdk_configuration.security, + get_serialized_body=lambda: utils.serialize_request_body( + request.request_body, + False, + False, + "json", + models.ReplaceRoleInRoleSetRequestBody, + ), + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = await self.do_request_async( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="ReplaceRoleInRoleSet", + oauth2_scopes=None, + security_source=self.sdk_configuration.security, + ), + request=req, + error_status_codes=["400", "401", "403", "404", "422", "4XX", "5XX"], + retry_config=retry_config, + ) + + response_data: Any = None + if utils.match_response(http_res, "200", "application/json"): + return unmarshal_json_response(models.RoleSet, http_res) + if utils.match_response( + http_res, ["400", "401", "403", "404", "422"], "application/json" + ): + response_data = unmarshal_json_response(models.ClerkErrorsData, http_res) + raise models.ClerkErrors(response_data, http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise models.SDKError("API error occurred", http_res, http_res_text) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise models.SDKError("API error occurred", http_res, http_res_text) + + raise models.SDKError("Unexpected response received", http_res) diff --git a/src/clerk_backend_api/sdk.py b/src/clerk_backend_api/sdk.py index d713311e..74ea24fa 100644 --- a/src/clerk_backend_api/sdk.py +++ b/src/clerk_backend_api/sdk.py @@ -53,6 +53,7 @@ from clerk_backend_api.phonenumbers import PhoneNumbers from clerk_backend_api.proxychecks import ProxyChecks from clerk_backend_api.redirecturls import RedirectUrls + from clerk_backend_api.rolesets_sdk import RoleSetsSDK from clerk_backend_api.samlconnections_sdk import SamlConnectionsSDK from clerk_backend_api.sessions import Sessions from clerk_backend_api.signintokens import SignInTokens @@ -94,6 +95,7 @@ class Clerk(BaseSDK): actor_tokens: "ActorTokens" domains: "DomainsSDK" instance_settings: "InstanceSettingsSDK" + r"""Modify the settings of your instance.""" webhooks: "Webhooks" jwt_templates: "JwtTemplates" machines: "Machines" @@ -111,6 +113,7 @@ class Clerk(BaseSDK): waitlist_entries: "WaitlistEntriesSDK" billing: "Billing" organization_permissions: "OrganizationPermissions" + role_sets: "RoleSetsSDK" api_keys: "APIKeys" r"""Endpoints for managing API Keys""" m2m: "M2m" @@ -190,6 +193,7 @@ class Clerk(BaseSDK): "clerk_backend_api.organizationpermissions", "OrganizationPermissions", ), + "role_sets": ("clerk_backend_api.rolesets_sdk", "RoleSetsSDK"), "api_keys": ("clerk_backend_api.api_keys", "APIKeys"), "m2m": ("clerk_backend_api.m2m", "M2m"), "oauth_access_tokens": ( diff --git a/src/clerk_backend_api/types/basemodel.py b/src/clerk_backend_api/types/basemodel.py index 231c2e37..a9a640a1 100644 --- a/src/clerk_backend_api/types/basemodel.py +++ b/src/clerk_backend_api/types/basemodel.py @@ -2,7 +2,8 @@ from pydantic import ConfigDict, model_serializer from pydantic import BaseModel as PydanticBaseModel -from typing import TYPE_CHECKING, Literal, Optional, TypeVar, Union +from pydantic_core import core_schema +from typing import TYPE_CHECKING, Any, Literal, Optional, TypeVar, Union from typing_extensions import TypeAliasType, TypeAlias @@ -35,5 +36,42 @@ def __bool__(self) -> Literal[False]: "OptionalNullable", Union[Optional[Nullable[T]], Unset], type_params=(T,) ) -UnrecognizedInt: TypeAlias = int -UnrecognizedStr: TypeAlias = str + +class UnrecognizedStr(str): + @classmethod + def __get_pydantic_core_schema__(cls, _source_type: Any, _handler: Any) -> core_schema.CoreSchema: + # Make UnrecognizedStr only work in lax mode, not strict mode + # This makes it a "fallback" option when more specific types (like Literals) don't match + def validate_lax(v: Any) -> 'UnrecognizedStr': + if isinstance(v, cls): + return v + return cls(str(v)) + + # Use lax_or_strict_schema where strict always fails + # This forces Pydantic to prefer other union members in strict mode + # and only fall back to UnrecognizedStr in lax mode + return core_schema.lax_or_strict_schema( + lax_schema=core_schema.chain_schema([ + core_schema.str_schema(), + core_schema.no_info_plain_validator_function(validate_lax) + ]), + strict_schema=core_schema.none_schema(), # Always fails in strict mode + ) + + +class UnrecognizedInt(int): + @classmethod + def __get_pydantic_core_schema__(cls, _source_type: Any, _handler: Any) -> core_schema.CoreSchema: + # Make UnrecognizedInt only work in lax mode, not strict mode + # This makes it a "fallback" option when more specific types (like Literals) don't match + def validate_lax(v: Any) -> 'UnrecognizedInt': + if isinstance(v, cls): + return v + return cls(int(v)) + return core_schema.lax_or_strict_schema( + lax_schema=core_schema.chain_schema([ + core_schema.int_schema(), + core_schema.no_info_plain_validator_function(validate_lax) + ]), + strict_schema=core_schema.none_schema(), # Always fails in strict mode + ) diff --git a/src/clerk_backend_api/users.py b/src/clerk_backend_api/users.py index 5e095413..7b99715c 100644 --- a/src/clerk_backend_api/users.py +++ b/src/clerk_backend_api/users.py @@ -219,6 +219,7 @@ def create( delete_self_enabled: OptionalNullable[bool] = UNSET, legal_accepted_at: OptionalNullable[str] = UNSET, skip_legal_checks: OptionalNullable[bool] = UNSET, + skip_user_requirement: OptionalNullable[bool] = UNSET, create_organization_enabled: OptionalNullable[bool] = UNSET, create_organizations_limit: OptionalNullable[int] = UNSET, created_at: OptionalNullable[str] = UNSET, @@ -264,7 +265,7 @@ def create( The algorithms we support at the moment are [`bcrypt`](https://en.wikipedia.org/wiki/Bcrypt), [`bcrypt_sha256_django`](https://docs.djangoproject.com/en/4.0/topics/auth/passwords/), [`md5`](https://en.wikipedia.org/wiki/MD5), `pbkdf2_sha1`, `pbkdf2_sha256`, [`pbkdf2_sha256_django`](https://docs.djangoproject.com/en/4.0/topics/auth/passwords/), [`phpass`](https://www.openwall.com/phpass/), `md5_phpass`, [`scrypt_firebase`](https://firebaseopensource.com/projects/firebase/scrypt/), [`scrypt_werkzeug`](https://werkzeug.palletsprojects.com/en/3.0.x/utils/#werkzeug.security.generate_password_hash), [`sha256`](https://en.wikipedia.org/wiki/SHA-2), - [`ldap_ssha`](https://www.openldap.org/faq/data/cache/347.html) and the [`argon2`](https://argon2.online/) variants: `argon2i` and `argon2id`. + [`ldap_ssha`](https://www.openldap.org/faq/data/cache/347.html), the [`argon2`](https://argon2.online/) variants: `argon2i` and `argon2id`, and `sha512_symfony`, the SHA-512 variant of the [Symfony](https://symfony.com/doc/current/security/passwords.html) legacy hasher. Each of the supported hashers expects the incoming digest to be in a particular format. See the [Clerk docs](https://clerk.com/docs/references/backend/user/create-user) for more information. :param skip_password_checks: When set to `true` all password checks are skipped. @@ -289,6 +290,10 @@ def create( :param legal_accepted_at: A custom timestamp denoting _when_ the user accepted legal requirements, specified in RFC3339 format (e.g. `2012-10-20T07:15:20.902Z`). :param skip_legal_checks: When set to `true` all legal checks are skipped. It is not recommended to skip legal checks unless you are migrating a user to Clerk. + :param skip_user_requirement: When set to `true`, identification types are not enforced. + At least one identification type must be enabled and provided on your instance (email, phone, web3 wallet, or username). + Users created without required identification types cannot use those authentication strategies + It is not recommended to use this flag unless you need to allow Clerk UI components to prompt for required fields while BAPI creates users with minimal data, or for migration a user to Clerk. :param create_organization_enabled: If enabled, user can create organizations via FAPI. :param create_organizations_limit: The maximum number of organizations the user can create. 0 means unlimited. @@ -332,6 +337,7 @@ def create( delete_self_enabled=delete_self_enabled, legal_accepted_at=legal_accepted_at, skip_legal_checks=skip_legal_checks, + skip_user_requirement=skip_user_requirement, create_organization_enabled=create_organization_enabled, create_organizations_limit=create_organizations_limit, created_at=created_at, @@ -424,6 +430,7 @@ async def create_async( delete_self_enabled: OptionalNullable[bool] = UNSET, legal_accepted_at: OptionalNullable[str] = UNSET, skip_legal_checks: OptionalNullable[bool] = UNSET, + skip_user_requirement: OptionalNullable[bool] = UNSET, create_organization_enabled: OptionalNullable[bool] = UNSET, create_organizations_limit: OptionalNullable[int] = UNSET, created_at: OptionalNullable[str] = UNSET, @@ -469,7 +476,7 @@ async def create_async( The algorithms we support at the moment are [`bcrypt`](https://en.wikipedia.org/wiki/Bcrypt), [`bcrypt_sha256_django`](https://docs.djangoproject.com/en/4.0/topics/auth/passwords/), [`md5`](https://en.wikipedia.org/wiki/MD5), `pbkdf2_sha1`, `pbkdf2_sha256`, [`pbkdf2_sha256_django`](https://docs.djangoproject.com/en/4.0/topics/auth/passwords/), [`phpass`](https://www.openwall.com/phpass/), `md5_phpass`, [`scrypt_firebase`](https://firebaseopensource.com/projects/firebase/scrypt/), [`scrypt_werkzeug`](https://werkzeug.palletsprojects.com/en/3.0.x/utils/#werkzeug.security.generate_password_hash), [`sha256`](https://en.wikipedia.org/wiki/SHA-2), - [`ldap_ssha`](https://www.openldap.org/faq/data/cache/347.html) and the [`argon2`](https://argon2.online/) variants: `argon2i` and `argon2id`. + [`ldap_ssha`](https://www.openldap.org/faq/data/cache/347.html), the [`argon2`](https://argon2.online/) variants: `argon2i` and `argon2id`, and `sha512_symfony`, the SHA-512 variant of the [Symfony](https://symfony.com/doc/current/security/passwords.html) legacy hasher. Each of the supported hashers expects the incoming digest to be in a particular format. See the [Clerk docs](https://clerk.com/docs/references/backend/user/create-user) for more information. :param skip_password_checks: When set to `true` all password checks are skipped. @@ -494,6 +501,10 @@ async def create_async( :param legal_accepted_at: A custom timestamp denoting _when_ the user accepted legal requirements, specified in RFC3339 format (e.g. `2012-10-20T07:15:20.902Z`). :param skip_legal_checks: When set to `true` all legal checks are skipped. It is not recommended to skip legal checks unless you are migrating a user to Clerk. + :param skip_user_requirement: When set to `true`, identification types are not enforced. + At least one identification type must be enabled and provided on your instance (email, phone, web3 wallet, or username). + Users created without required identification types cannot use those authentication strategies + It is not recommended to use this flag unless you need to allow Clerk UI components to prompt for required fields while BAPI creates users with minimal data, or for migration a user to Clerk. :param create_organization_enabled: If enabled, user can create organizations via FAPI. :param create_organizations_limit: The maximum number of organizations the user can create. 0 means unlimited. @@ -537,6 +548,7 @@ async def create_async( delete_self_enabled=delete_self_enabled, legal_accepted_at=legal_accepted_at, skip_legal_checks=skip_legal_checks, + skip_user_requirement=skip_user_requirement, create_organization_enabled=create_organization_enabled, create_organizations_limit=create_organizations_limit, created_at=created_at, @@ -1201,7 +1213,7 @@ def update( The algorithms we support at the moment are [`bcrypt`](https://en.wikipedia.org/wiki/Bcrypt), [`bcrypt_sha256_django`](https://docs.djangoproject.com/en/4.0/topics/auth/passwords/), [`md5`](https://en.wikipedia.org/wiki/MD5), `pbkdf2_sha1`, `pbkdf2_sha256`, [`pbkdf2_sha256_django`](https://docs.djangoproject.com/en/4.0/topics/auth/passwords/), [`phpass`](https://www.openwall.com/phpass/), `md5_phpass`, [`scrypt_firebase`](https://firebaseopensource.com/projects/firebase/scrypt/), [`scrypt_werkzeug`](https://werkzeug.palletsprojects.com/en/3.0.x/utils/#werkzeug.security.generate_password_hash), [`sha256`](https://en.wikipedia.org/wiki/SHA-2), - [`ldap_ssha`](https://www.openldap.org/faq/data/cache/347.html) and the [`argon2`](https://argon2.online/) variants: `argon2i` and `argon2id`. + [`ldap_ssha`](https://www.openldap.org/faq/data/cache/347.html), the [`argon2`](https://argon2.online/) variants: `argon2i` and `argon2id`, and `sha512_symfony`, the SHA-512 variant of the [Symfony](https://symfony.com/doc/current/security/passwords.html) legacy hasher. Each of the supported hashers expects the incoming digest to be in a particular format. See the [Clerk docs](https://clerk.com/docs/references/backend/user/create-user) for more information. :param skip_password_checks: Set it to `true` if you're updating the user's password and want to skip any password policy settings check. This parameter can only be used when providing a `password`. @@ -1413,7 +1425,7 @@ async def update_async( The algorithms we support at the moment are [`bcrypt`](https://en.wikipedia.org/wiki/Bcrypt), [`bcrypt_sha256_django`](https://docs.djangoproject.com/en/4.0/topics/auth/passwords/), [`md5`](https://en.wikipedia.org/wiki/MD5), `pbkdf2_sha1`, `pbkdf2_sha256`, [`pbkdf2_sha256_django`](https://docs.djangoproject.com/en/4.0/topics/auth/passwords/), [`phpass`](https://www.openwall.com/phpass/), `md5_phpass`, [`scrypt_firebase`](https://firebaseopensource.com/projects/firebase/scrypt/), [`scrypt_werkzeug`](https://werkzeug.palletsprojects.com/en/3.0.x/utils/#werkzeug.security.generate_password_hash), [`sha256`](https://en.wikipedia.org/wiki/SHA-2), - [`ldap_ssha`](https://www.openldap.org/faq/data/cache/347.html) and the [`argon2`](https://argon2.online/) variants: `argon2i` and `argon2id`. + [`ldap_ssha`](https://www.openldap.org/faq/data/cache/347.html), the [`argon2`](https://argon2.online/) variants: `argon2i` and `argon2id`, and `sha512_symfony`, the SHA-512 variant of the [Symfony](https://symfony.com/doc/current/security/passwords.html) legacy hasher. Each of the supported hashers expects the incoming digest to be in a particular format. See the [Clerk docs](https://clerk.com/docs/references/backend/user/create-user) for more information. :param skip_password_checks: Set it to `true` if you're updating the user's password and want to skip any password policy settings check. This parameter can only be used when providing a `password`. @@ -5819,6 +5831,398 @@ async def delete_external_account_async( raise models.SDKError("Unexpected response received", http_res) + def set_password_compromised( + self, + *, + user_id: str, + revoke_all_sessions: OptionalNullable[bool] = UNSET, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> models.User: + r"""Set a user's password as compromised + + Sets the given user's password as compromised. The user will be prompted to reset their password on their next sign-in. + + :param user_id: The ID of the user to set the password as compromised + :param revoke_all_sessions: + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = models.SetUserPasswordCompromisedRequest( + user_id=user_id, + request_body=models.SetUserPasswordCompromisedRequestBody( + revoke_all_sessions=revoke_all_sessions, + ), + ) + + req = self._build_request( + method="POST", + path="/users/{user_id}/password/set_compromised", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=False, + request_has_path_params=True, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + security=self.sdk_configuration.security, + get_serialized_body=lambda: utils.serialize_request_body( + request.request_body, + False, + True, + "json", + Optional[models.SetUserPasswordCompromisedRequestBody], + ), + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = self.do_request( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="SetUserPasswordCompromised", + oauth2_scopes=None, + security_source=self.sdk_configuration.security, + ), + request=req, + error_status_codes=["400", "401", "403", "404", "422", "4XX", "5XX"], + retry_config=retry_config, + ) + + response_data: Any = None + if utils.match_response(http_res, "200", "application/json"): + return unmarshal_json_response(models.User, http_res) + if utils.match_response( + http_res, ["400", "401", "403", "404", "422"], "application/json" + ): + response_data = unmarshal_json_response(models.ClerkErrorsData, http_res) + raise models.ClerkErrors(response_data, http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise models.SDKError("API error occurred", http_res, http_res_text) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise models.SDKError("API error occurred", http_res, http_res_text) + + raise models.SDKError("Unexpected response received", http_res) + + async def set_password_compromised_async( + self, + *, + user_id: str, + revoke_all_sessions: OptionalNullable[bool] = UNSET, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> models.User: + r"""Set a user's password as compromised + + Sets the given user's password as compromised. The user will be prompted to reset their password on their next sign-in. + + :param user_id: The ID of the user to set the password as compromised + :param revoke_all_sessions: + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = models.SetUserPasswordCompromisedRequest( + user_id=user_id, + request_body=models.SetUserPasswordCompromisedRequestBody( + revoke_all_sessions=revoke_all_sessions, + ), + ) + + req = self._build_request_async( + method="POST", + path="/users/{user_id}/password/set_compromised", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=False, + request_has_path_params=True, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + security=self.sdk_configuration.security, + get_serialized_body=lambda: utils.serialize_request_body( + request.request_body, + False, + True, + "json", + Optional[models.SetUserPasswordCompromisedRequestBody], + ), + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = await self.do_request_async( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="SetUserPasswordCompromised", + oauth2_scopes=None, + security_source=self.sdk_configuration.security, + ), + request=req, + error_status_codes=["400", "401", "403", "404", "422", "4XX", "5XX"], + retry_config=retry_config, + ) + + response_data: Any = None + if utils.match_response(http_res, "200", "application/json"): + return unmarshal_json_response(models.User, http_res) + if utils.match_response( + http_res, ["400", "401", "403", "404", "422"], "application/json" + ): + response_data = unmarshal_json_response(models.ClerkErrorsData, http_res) + raise models.ClerkErrors(response_data, http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise models.SDKError("API error occurred", http_res, http_res_text) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise models.SDKError("API error occurred", http_res, http_res_text) + + raise models.SDKError("Unexpected response received", http_res) + + def unset_password_compromised( + self, + *, + user_id: str, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> models.User: + r"""Unset a user's password as compromised + + Sets the given user's password as no longer compromised. The user will no longer be prompted to reset their password on their next sign-in. + + :param user_id: The ID of the user to unset the compromised status for + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = models.UnsetUserPasswordCompromisedRequest( + user_id=user_id, + ) + + req = self._build_request( + method="POST", + path="/users/{user_id}/password/unset_compromised", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=False, + request_has_path_params=True, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + security=self.sdk_configuration.security, + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = self.do_request( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="UnsetUserPasswordCompromised", + oauth2_scopes=None, + security_source=self.sdk_configuration.security, + ), + request=req, + error_status_codes=["400", "401", "403", "404", "422", "4XX", "5XX"], + retry_config=retry_config, + ) + + response_data: Any = None + if utils.match_response(http_res, "200", "application/json"): + return unmarshal_json_response(models.User, http_res) + if utils.match_response( + http_res, ["400", "401", "403", "404", "422"], "application/json" + ): + response_data = unmarshal_json_response(models.ClerkErrorsData, http_res) + raise models.ClerkErrors(response_data, http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise models.SDKError("API error occurred", http_res, http_res_text) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise models.SDKError("API error occurred", http_res, http_res_text) + + raise models.SDKError("Unexpected response received", http_res) + + async def unset_password_compromised_async( + self, + *, + user_id: str, + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> models.User: + r"""Unset a user's password as compromised + + Sets the given user's password as no longer compromised. The user will no longer be prompted to reset their password on their next sign-in. + + :param user_id: The ID of the user to unset the compromised status for + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = None + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if server_url is not None: + base_url = server_url + else: + base_url = self._get_url(base_url, url_variables) + + request = models.UnsetUserPasswordCompromisedRequest( + user_id=user_id, + ) + + req = self._build_request_async( + method="POST", + path="/users/{user_id}/password/unset_compromised", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=False, + request_has_path_params=True, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + security=self.sdk_configuration.security, + allow_empty_value=None, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5XX"]) + + http_res = await self.do_request_async( + hook_ctx=HookContext( + config=self.sdk_configuration, + base_url=base_url or "", + operation_id="UnsetUserPasswordCompromised", + oauth2_scopes=None, + security_source=self.sdk_configuration.security, + ), + request=req, + error_status_codes=["400", "401", "403", "404", "422", "4XX", "5XX"], + retry_config=retry_config, + ) + + response_data: Any = None + if utils.match_response(http_res, "200", "application/json"): + return unmarshal_json_response(models.User, http_res) + if utils.match_response( + http_res, ["400", "401", "403", "404", "422"], "application/json" + ): + response_data = unmarshal_json_response(models.ClerkErrorsData, http_res) + raise models.ClerkErrors(response_data, http_res) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise models.SDKError("API error occurred", http_res, http_res_text) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise models.SDKError("API error occurred", http_res, http_res_text) + + raise models.SDKError("Unexpected response received", http_res) + def get_instance_organization_memberships( self, *, diff --git a/src/clerk_backend_api/utils/__init__.py b/src/clerk_backend_api/utils/__init__.py index 56164cf3..c906e1e0 100644 --- a/src/clerk_backend_api/utils/__init__.py +++ b/src/clerk_backend_api/utils/__init__.py @@ -1,10 +1,22 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, Callable, TypeVar from importlib import import_module +import asyncio import builtins import sys +_T = TypeVar("_T") + + +async def run_sync_in_thread(func: Callable[..., _T], *args) -> _T: + """Run a synchronous function in a thread pool to avoid blocking the event loop.""" + if sys.version_info >= (3, 9): + return await asyncio.to_thread(func, *args) + loop = asyncio.get_event_loop() + return await loop.run_in_executor(None, func, *args) + + if TYPE_CHECKING: from .annotations import get_discriminator from .datetimes import parse_datetime @@ -41,7 +53,6 @@ validate_decimal, validate_float, validate_int, - validate_open_enum, ) from .url import generate_url, template_url, remove_suffix from .values import ( @@ -102,7 +113,6 @@ "validate_const", "validate_float", "validate_int", - "validate_open_enum", "cast_partial", ] @@ -155,7 +165,6 @@ "validate_const": ".serializers", "validate_float": ".serializers", "validate_int": ".serializers", - "validate_open_enum": ".serializers", "cast_partial": ".values", } diff --git a/src/clerk_backend_api/utils/enums.py b/src/clerk_backend_api/utils/enums.py index c3bc13cf..3324e1bc 100644 --- a/src/clerk_backend_api/utils/enums.py +++ b/src/clerk_backend_api/utils/enums.py @@ -2,6 +2,10 @@ import enum import sys +from typing import Any + +from pydantic_core import core_schema + class OpenEnumMeta(enum.EnumMeta): # The __call__ method `boundary` kwarg was added in 3.11 and must be present @@ -72,3 +76,59 @@ def __call__( ) except ValueError: return value + + def __new__(mcs, name, bases, namespace, **kwargs): + cls = super().__new__(mcs, name, bases, namespace, **kwargs) + + # Add __get_pydantic_core_schema__ to make open enums work correctly + # in union discrimination. In strict mode (used by Pydantic for unions), + # only known enum values match. In lax mode, unknown values are accepted. + def __get_pydantic_core_schema__( + cls_inner: Any, _source_type: Any, _handler: Any + ) -> core_schema.CoreSchema: + # Create a validator that only accepts known enum values (for strict mode) + def validate_strict(v: Any) -> Any: + if isinstance(v, cls_inner): + return v + # Use the parent EnumMeta's __call__ which raises ValueError for unknown values + return enum.EnumMeta.__call__(cls_inner, v) + + # Create a lax validator that accepts unknown values + def validate_lax(v: Any) -> Any: + if isinstance(v, cls_inner): + return v + try: + return enum.EnumMeta.__call__(cls_inner, v) + except ValueError: + # Return the raw value for unknown enum values + return v + + # Determine the base type schema (str or int) + is_int_enum = False + for base in cls_inner.__mro__: + if base is int: + is_int_enum = True + break + if base is str: + break + + base_schema = ( + core_schema.int_schema() + if is_int_enum + else core_schema.str_schema() + ) + + # Use lax_or_strict_schema: + # - strict mode: only known enum values match (raises ValueError for unknown) + # - lax mode: accept any value, return enum member or raw value + return core_schema.lax_or_strict_schema( + lax_schema=core_schema.chain_schema( + [base_schema, core_schema.no_info_plain_validator_function(validate_lax)] + ), + strict_schema=core_schema.chain_schema( + [base_schema, core_schema.no_info_plain_validator_function(validate_strict)] + ), + ) + + setattr(cls, "__get_pydantic_core_schema__", classmethod(__get_pydantic_core_schema__)) + return cls diff --git a/src/clerk_backend_api/utils/requestbodies.py b/src/clerk_backend_api/utils/requestbodies.py index d5240dd5..1de32b6d 100644 --- a/src/clerk_backend_api/utils/requestbodies.py +++ b/src/clerk_backend_api/utils/requestbodies.py @@ -44,15 +44,15 @@ def serialize_request_body( serialized_request_body = SerializedRequestBody(media_type) - if re.match(r"(application|text)\/.*?\+*json.*", media_type) is not None: + if re.match(r"^(application|text)\/([^+]+\+)*json.*", media_type) is not None: serialized_request_body.content = marshal_json(request_body, request_body_type) - elif re.match(r"multipart\/.*", media_type) is not None: + elif re.match(r"^multipart\/.*", media_type) is not None: ( serialized_request_body.media_type, serialized_request_body.data, serialized_request_body.files, ) = serialize_multipart_form(media_type, request_body) - elif re.match(r"application\/x-www-form-urlencoded.*", media_type) is not None: + elif re.match(r"^application\/x-www-form-urlencoded.*", media_type) is not None: serialized_request_body.data = serialize_form_data(request_body) elif isinstance(request_body, (bytes, bytearray, io.BytesIO, io.BufferedReader)): serialized_request_body.content = request_body diff --git a/src/clerk_backend_api/utils/serializers.py b/src/clerk_backend_api/utils/serializers.py index 378a14c0..14321eb4 100644 --- a/src/clerk_backend_api/utils/serializers.py +++ b/src/clerk_backend_api/utils/serializers.py @@ -102,26 +102,6 @@ def validate_int(b): return int(b) -def validate_open_enum(is_int: bool): - def validate(e): - if e is None: - return None - - if isinstance(e, Unset): - return e - - if is_int: - if not isinstance(e, int): - raise ValueError("Expected int") - else: - if not isinstance(e, str): - raise ValueError("Expected string") - - return e - - return validate - - def validate_const(v): def validate(c): # Optional[T] is a Union[T, None]