diff --git a/CLAUDE.md b/CLAUDE.md index 46b15eb49..0e8b53ffa 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -113,6 +113,8 @@ Many files are auto-generated (marked with `// WARNING: This file is auto-genera - Filter classes in `filters/` - Wrapper code in `ts-wrapper/`, `python-wrapper/`, `dart-wrapper/` +The code generation is a two steps process: JSON files that describe the syntax and semantics of the entities and APIs are maintained in `build/generated/ksp/jvm/jvmMain/resources/.../Class.json` and then the `sdk-codegen` tool generates the actual Kotlin/JS/Python/Dart code. + **Do not manually edit auto-generated files.** Generation is done by the external `sdk-codegen` tool. ### Key Annotations @@ -134,4 +136,4 @@ Many files are auto-generated (marked with `// WARNING: This file is auto-genera - Max line length: 140 - Trailing commas: enabled - Wildcard imports: allowed -- Style: ktlint_official \ No newline at end of file +- Style: ktlint_official diff --git a/cardinal-sdk/build.gradle.kts b/cardinal-sdk/build.gradle.kts index fdc3a1152..e12d57d33 100644 --- a/cardinal-sdk/build.gradle.kts +++ b/cardinal-sdk/build.gradle.kts @@ -18,7 +18,7 @@ val mavenReleasesRepository: String by project group = "com.icure" -val version = "2.1.2" +val version = "2.1.3" project.version = version val generateSdkVersion by tasks.registering { diff --git a/cardinal-sdk/src/commonMain/kotlin/com/icure/cardinal/sdk/api/raw/RawFormApi.kt b/cardinal-sdk/src/commonMain/kotlin/com/icure/cardinal/sdk/api/raw/RawFormApi.kt index c449a2a87..4ed13c51b 100644 --- a/cardinal-sdk/src/commonMain/kotlin/com/icure/cardinal/sdk/api/raw/RawFormApi.kt +++ b/cardinal-sdk/src/commonMain/kotlin/com/icure/cardinal/sdk/api/raw/RawFormApi.kt @@ -216,6 +216,7 @@ public interface RawFormApi { groupId: String, userId: String, loadLayout: Boolean? = null, + raw: Boolean? = null, ): HttpResponse> suspend fun createFormTemplateInGroup( @@ -280,11 +281,13 @@ public interface RawFormApi { suspend fun getFormTemplatesInGroup( groupId: String, formTemplateIds: ListOfIds, + raw: Boolean? = null, ): HttpResponse> suspend fun getFormTemplateInGroup( groupId: String, formTemplateId: String, + raw: Boolean? = null, ): HttpResponse suspend fun matchFormTemplatesInGroupBy( diff --git a/cardinal-sdk/src/commonMain/kotlin/com/icure/cardinal/sdk/api/raw/impl/RawFormApiImpl.kt b/cardinal-sdk/src/commonMain/kotlin/com/icure/cardinal/sdk/api/raw/impl/RawFormApiImpl.kt index 0f1095ff5..0df2ae0b4 100644 --- a/cardinal-sdk/src/commonMain/kotlin/com/icure/cardinal/sdk/api/raw/impl/RawFormApiImpl.kt +++ b/cardinal-sdk/src/commonMain/kotlin/com/icure/cardinal/sdk/api/raw/impl/RawFormApiImpl.kt @@ -706,12 +706,14 @@ class RawFormApiImpl( groupId: String, userId: String, loadLayout: Boolean?, + raw: Boolean?, ): HttpResponse> = get(authProvider, groupId) { url { takeFrom(apiUrl) appendPathSegments("rest", "v2", "form", "template", "inGroup", groupId, "byUser", userId) parameter("loadLayout", loadLayout) + parameter("raw", raw) parameter("ts", GMTDate().timestamp) } accept(Application.Json) @@ -884,11 +886,13 @@ class RawFormApiImpl( override suspend fun getFormTemplatesInGroup( groupId: String, formTemplateIds: ListOfIds, + raw: Boolean?, ): HttpResponse> = post(authProvider, groupId) { url { takeFrom(apiUrl) appendPathSegments("rest", "v2", "form", "template", "inGroup", groupId, "byIds") + parameter("raw", raw) } contentType(Application.Json) accept(Application.Json) @@ -898,11 +902,13 @@ class RawFormApiImpl( override suspend fun getFormTemplateInGroup( groupId: String, formTemplateId: String, + raw: Boolean?, ): HttpResponse = get(authProvider, groupId) { url { takeFrom(apiUrl) appendPathSegments("rest", "v2", "form", "template", "inGroup", groupId, formTemplateId) + parameter("raw", raw) parameter("ts", GMTDate().timestamp) } accept(Application.Json) diff --git a/cardinal-sdk/src/commonMain/kotlin/com/icure/cardinal/sdk/auth/AuthSecretDetails.kt b/cardinal-sdk/src/commonMain/kotlin/com/icure/cardinal/sdk/auth/AuthSecretDetails.kt index aa68c1b4c..f64cbbfae 100644 --- a/cardinal-sdk/src/commonMain/kotlin/com/icure/cardinal/sdk/auth/AuthSecretDetails.kt +++ b/cardinal-sdk/src/commonMain/kotlin/com/icure/cardinal/sdk/auth/AuthSecretDetails.kt @@ -53,8 +53,8 @@ sealed interface AuthSecretDetails { * @param secret the token or another secret that will be used for authentication. * @param minimumAuthenticationClass only consider configurations that can provide at least this authentication class. The actual * authentication class obtained for the token may be higher. - * @param doNotUseProjectIdForGroupSelection only use the project id specified in the initialize method to choose the configuration of - * the external token, but not the group where to log in. + * @param doNotUseProjectIdForGroupSelection (INTERNAL USE ONLY) only use the project id specified in the initialize method to choose the configuration of + * the external token, but not the group where to log in. This is probably not the option you are looking for. */ data class ConfiguredExternalAuthenticationDetails( val configId: String, diff --git a/cardinal-sdk/src/commonMain/kotlin/com/icure/cardinal/sdk/auth/Credentials.kt b/cardinal-sdk/src/commonMain/kotlin/com/icure/cardinal/sdk/auth/Credentials.kt index 33bd246ff..a9f608c1a 100644 --- a/cardinal-sdk/src/commonMain/kotlin/com/icure/cardinal/sdk/auth/Credentials.kt +++ b/cardinal-sdk/src/commonMain/kotlin/com/icure/cardinal/sdk/auth/Credentials.kt @@ -54,8 +54,8 @@ data class ExternalAuthenticationToken( */ val minimumAuthenticationClass: AuthenticationClass = AuthenticationClass.ExternalAuthentication, /** - * If set to true, the project id specified in the initialize method will be used to find the external configuration for the external - * token but not to restrict the group where to log in. + * (INTERNAL USE ONLY) only use the project id specified in the initialize method to choose the configuration of + * the external token, but not the group where to log in. This is probably not the option you are looking for. */ val doNotUseProjectIdForGroupSelection: Boolean = false ) : Credentials diff --git a/cardinal-sdk/src/commonMain/kotlin/com/icure/cardinal/sdk/model/Tarification.kt b/cardinal-sdk/src/commonMain/kotlin/com/icure/cardinal/sdk/model/Tarification.kt index b60707811..b1d6e7bb3 100644 --- a/cardinal-sdk/src/commonMain/kotlin/com/icure/cardinal/sdk/model/Tarification.kt +++ b/cardinal-sdk/src/commonMain/kotlin/com/icure/cardinal/sdk/model/Tarification.kt @@ -10,6 +10,7 @@ import com.icure.cardinal.sdk.model.base.StoredDocument import com.icure.cardinal.sdk.model.embed.DecryptedValorisation import com.icure.cardinal.sdk.model.embed.LetterValue import com.icure.cardinal.sdk.model.embed.Periodicity +import com.icure.cardinal.sdk.model.embed.PricingDomain import com.icure.cardinal.sdk.utils.DefaultValue import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -63,6 +64,10 @@ data class Tarification( * The version of the tarification. Must be lexicographically searchable. */ override val version: String? = null, + /** + * The pricing domain for this tarification (ambulatory, hospital, or both). + */ + public val domain: PricingDomain? = null, /** * The author of the tarification. */ diff --git a/cardinal-sdk/src/commonMain/kotlin/com/icure/cardinal/sdk/model/data/ByteArray.kt b/cardinal-sdk/src/commonMain/kotlin/com/icure/cardinal/sdk/model/data/ByteArray.kt index 939437cd5..630ea577b 100644 --- a/cardinal-sdk/src/commonMain/kotlin/com/icure/cardinal/sdk/model/data/ByteArray.kt +++ b/cardinal-sdk/src/commonMain/kotlin/com/icure/cardinal/sdk/model/data/ByteArray.kt @@ -18,5 +18,6 @@ data class ByteArray( public val `data`: kotlin.ByteArray, ) { // region ByteArray-ByteArray + // endregion } diff --git a/cardinal-sdk/src/commonMain/kotlin/com/icure/cardinal/sdk/model/data/LabelledOccurence.kt b/cardinal-sdk/src/commonMain/kotlin/com/icure/cardinal/sdk/model/data/LabelledOccurence.kt index 55353c41a..5d97ef67d 100644 --- a/cardinal-sdk/src/commonMain/kotlin/com/icure/cardinal/sdk/model/data/LabelledOccurence.kt +++ b/cardinal-sdk/src/commonMain/kotlin/com/icure/cardinal/sdk/model/data/LabelledOccurence.kt @@ -23,5 +23,6 @@ data class LabelledOccurence( public val occurence: Long, ) { // region LabelledOccurence-LabelledOccurence + // endregion } diff --git a/cardinal-sdk/src/commonMain/kotlin/com/icure/cardinal/sdk/model/embed/PricingDomain.kt b/cardinal-sdk/src/commonMain/kotlin/com/icure/cardinal/sdk/model/embed/PricingDomain.kt new file mode 100644 index 000000000..76023cd7a --- /dev/null +++ b/cardinal-sdk/src/commonMain/kotlin/com/icure/cardinal/sdk/model/embed/PricingDomain.kt @@ -0,0 +1,25 @@ +// WARNING: This file is auto-generated. If you change it manually, your changes will be lost. +// If you want to change the way this class is generated, see [this repo](https://github.com/icure/sdk-codegen). +package com.icure.cardinal.sdk.model.embed + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlin.String + +/** + * + * Enumerates the pricing domains for tarifications. + */ +@Serializable +enum class PricingDomain( + internal val dtoSerialName: String, +) { + @SerialName("ambulatory") + Ambulatory("ambulatory"), + + @SerialName("hospital") + Hospital("hospital"), + + @SerialName("both") + Both("both"), +} diff --git a/cardinal-sdk/src/commonMain/kotlin/com/icure/cardinal/sdk/options/AuthenticationMethod.kt b/cardinal-sdk/src/commonMain/kotlin/com/icure/cardinal/sdk/options/AuthenticationMethod.kt index 372f82c1c..828637d3b 100644 --- a/cardinal-sdk/src/commonMain/kotlin/com/icure/cardinal/sdk/options/AuthenticationMethod.kt +++ b/cardinal-sdk/src/commonMain/kotlin/com/icure/cardinal/sdk/options/AuthenticationMethod.kt @@ -119,7 +119,7 @@ sealed interface AuthenticationMethod { @Serializable data class LongLivedToken(val token: String) : InitialSecret @Serializable - data class ExternalAuthenticationToken(val token: String, val configId: String) : InitialSecret + data class ExternalAuthenticationToken(val token: String, val configId: String, val doNotUseProjectIdForGroupSelection: Boolean?) : InitialSecret } } } @@ -175,7 +175,7 @@ suspend fun AuthenticationMethod.getAuthProvider( is AuthenticationMethod.UsingSecretProvider.InitialSecret.LongLivedToken -> AuthSecretDetails.LongLivedTokenDetails(initialSecret.token) is AuthenticationMethod.UsingSecretProvider.InitialSecret.ExternalAuthenticationToken -> - AuthSecretDetails.ConfiguredExternalAuthenticationDetails(initialSecret.configId, initialSecret.token) + AuthSecretDetails.ConfiguredExternalAuthenticationDetails(initialSecret.configId, initialSecret.token, AuthenticationClass.ExternalAuthentication, initialSecret.doNotUseProjectIdForGroupSelection ?: false) is AuthenticationMethod.UsingSecretProvider.InitialSecret.Password -> AuthSecretDetails.PasswordDetails(initialSecret.password) null -> null diff --git a/ts-wrapper/src/jsMain/kotlin/com/icure/cardinal/sdk/js/options/AuthenticationMethod.kt b/ts-wrapper/src/jsMain/kotlin/com/icure/cardinal/sdk/js/options/AuthenticationMethod.kt index dda301875..354040b6d 100644 --- a/ts-wrapper/src/jsMain/kotlin/com/icure/cardinal/sdk/js/options/AuthenticationMethod.kt +++ b/ts-wrapper/src/jsMain/kotlin/com/icure/cardinal/sdk/js/options/AuthenticationMethod.kt @@ -41,6 +41,7 @@ import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.await import kotlinx.coroutines.promise import kotlin.js.Promise +import kotlin.js.json @OptIn(InternalIcureApi::class) @@ -85,7 +86,8 @@ private fun InitialSecretJs.toKt(): AuthenticationMethod.UsingSecretProvider.Ini is ExternalAuthenticationTokenJs -> AuthenticationMethod.UsingSecretProvider.InitialSecret.ExternalAuthenticationToken( token = token, - configId = configId + configId = configId, + doNotUseProjectIdForGroupSelection = doNotUseProjectIdForGroupSelection ) is InitialSecretLongLivedTokenJs -> AuthenticationMethod.UsingSecretProvider.InitialSecret.LongLivedToken(token) @@ -125,20 +127,28 @@ private fun AuthSecretDetailsJs.toKt(): AuthSecretDetails = when (this) { else -> throw IllegalArgumentException("Unrecognised auth secret details: ${this::class.simpleName}") } private fun AuthSecretDetails.toJs(): AuthSecretDetailsJs = when (this) { - is AuthSecretDetails.ConfiguredExternalAuthenticationDetails -> + is AuthSecretDetails.ConfiguredExternalAuthenticationDetails -> { ConfiguredExternalAuthenticationDetailsJs( secret = secret, configId = configId, - minimumAuthenticationClass = minimumAuthenticationClass.name + props = json( + "minimumAuthenticationClass" to minimumAuthenticationClass.name, + "doNotUseProjectIdForGroupSelection" to doNotUseProjectIdForGroupSelection + ) ) - is AuthSecretDetails.LongLivedTokenDetails -> + } + is AuthSecretDetails.LongLivedTokenDetails -> { LongLivedTokenDetailsJs(secret = secret) - is AuthSecretDetails.PasswordDetails -> + } + is AuthSecretDetails.PasswordDetails -> { PasswordDetailsJs(secret = secret) - is AuthSecretDetails.ShortLivedTokenDetails -> + } + is AuthSecretDetails.ShortLivedTokenDetails -> { ShortLivedTokenDetailsJs(secret = secret, authenticationProcessInfo = authenticationProcessInfo.toJs()) - is AuthSecretDetails.TwoFactorAuthTokenDetails -> + } + is AuthSecretDetails.TwoFactorAuthTokenDetails -> { TwoFactorAuthTokenDetailsJs(secret = secret) + } } @OptIn(InternalIcureApi::class) private fun AuthenticationProcessRequest.toJs(): AuthenticationProcessRequestJs = AuthenticationProcessRequestJs( @@ -181,4 +191,4 @@ internal fun AuthenticationProcessTemplateParametersJs.toKt() = AuthenticationProcessTemplateParameters( firstName = this.firstName, lastName = this.lastName - ) \ No newline at end of file + ) diff --git a/ts-wrapper/src/jsMain/kotlin/com/icure/cardinal/sdk/js/options/external/AuthSecretDetailsJs.kt b/ts-wrapper/src/jsMain/kotlin/com/icure/cardinal/sdk/js/options/external/AuthSecretDetailsJs.kt index d27dade87..f6e322263 100644 --- a/ts-wrapper/src/jsMain/kotlin/com/icure/cardinal/sdk/js/options/external/AuthSecretDetailsJs.kt +++ b/ts-wrapper/src/jsMain/kotlin/com/icure/cardinal/sdk/js/options/external/AuthSecretDetailsJs.kt @@ -35,9 +35,12 @@ external class LongLivedTokenDetailsJs( external class ConfiguredExternalAuthenticationDetailsJs( configId: String, secret: String, - minimumAuthenticationClass: String?, + // minimumAuthenticationClass: String?, + // doNotUseProjectIdForGroupSelection: Boolean?, + props: dynamic ) : AuthSecretDetailsJs { val configId: String val secret: String val minimumAuthenticationClass: String? + val doNotUseProjectIdForGroupSelection: Boolean? } diff --git a/ts-wrapper/src/jsMain/kotlin/com/icure/cardinal/sdk/js/options/external/SecretProviderAuthenticationOptionsInitialSecretJs.kt b/ts-wrapper/src/jsMain/kotlin/com/icure/cardinal/sdk/js/options/external/SecretProviderAuthenticationOptionsInitialSecretJs.kt index c7da5a04e..252767a2e 100644 --- a/ts-wrapper/src/jsMain/kotlin/com/icure/cardinal/sdk/js/options/external/SecretProviderAuthenticationOptionsInitialSecretJs.kt +++ b/ts-wrapper/src/jsMain/kotlin/com/icure/cardinal/sdk/js/options/external/SecretProviderAuthenticationOptionsInitialSecretJs.kt @@ -15,4 +15,5 @@ external class InitialSecretLongLivedTokenJs : InitialSecretJs { external class ExternalAuthenticationTokenJs : InitialSecretJs { val token: String val configId: String + val doNotUseProjectIdForGroupSelection: Boolean? } diff --git a/ts-wrapper/src/jsMain/typescript/options/AuthenticationMethod.mts b/ts-wrapper/src/jsMain/typescript/options/AuthenticationMethod.mts index c5f887433..544454e95 100644 --- a/ts-wrapper/src/jsMain/typescript/options/AuthenticationMethod.mts +++ b/ts-wrapper/src/jsMain/typescript/options/AuthenticationMethod.mts @@ -51,6 +51,17 @@ export namespace AuthenticationMethod { } export class ExternalAuthenticationToken { + + /** + * During login consider only configurations that can provide at least this authentication class + */ + readonly minimumAuthenticationClass: AuthenticationClass | undefined + /** + * (INTERNAL USE ONLY) only use the project id specified in the initialize method to choose the configuration of + * the external token, but not the group where to log in. This is probably not the option you are looking for. + */ + readonly doNotUseProjectIdForGroupSelection: boolean | undefined + constructor( /** * The id of the configuration that specifies how the token should be validated and how it should be used to find @@ -63,11 +74,14 @@ export namespace AuthenticationMethod { * A token used to perform the external authentication */ readonly token: string, - /** - * During login consider only configurations that can provide at least this authentication class - */ - readonly minimumAuthenticationClass?: AuthenticationClass, - ) {} + props: { + minimumAuthenticationClass?: AuthenticationClass, + doNotUseProjectIdForGroupSelection?: boolean + } = {}, + ) { + this.minimumAuthenticationClass = props.minimumAuthenticationClass + this.doNotUseProjectIdForGroupSelection = props.doNotUseProjectIdForGroupSelection + } } export class JwtCredentials { @@ -154,7 +168,13 @@ export namespace SecretProviderAuthenticationOptions { export namespace InitialSecret { export class Password { constructor(readonly password: string) {} } export class LongLivedToken { constructor(readonly token: string) {} } - export class ExternalAuthenticationToken { constructor(readonly token: string, readonly configId: string) {} } + export class ExternalAuthenticationToken { + readonly doNotUseProjectIdForGroupSelection: boolean | undefined + + constructor(readonly token: string, readonly configId: string, props: { doNotUseProjectIdForGroupSelection?: boolean } = {}) { + this.doNotUseProjectIdForGroupSelection = props.doNotUseProjectIdForGroupSelection + } + } } export type InitialSecret = InitialSecret.Password | InitialSecret.LongLivedToken | InitialSecret.ExternalAuthenticationToken @@ -212,7 +232,7 @@ export namespace AuthSecretDetails { */ constructor (readonly secret: String) {} } - + export class TwoFactorAuthTokenDetails { /** * @param secret the current two-factor authentication token of the user. @@ -227,15 +247,17 @@ export namespace AuthSecretDetails { */ constructor(readonly secret: String, readonly authenticationProcessInfo: AuthenticationProcessRequest) {} } - + export class LongLivedTokenDetails { /** * @param secret a long-lived token of the user. */ constructor (readonly secret: String) {} } - + export class ConfiguredExternalAuthenticationDetails { + readonly minimumAuthenticationClass: AuthenticationClass | undefined + readonly doNotUseProjectIdForGroupSelection: boolean | undefined /** * Login using a token or other secret provided by another authentication service configured for your project. * @@ -245,10 +267,16 @@ export namespace AuthSecretDetails { * * @param configId id of the configuration to use for authentication. * @param secret the token or another secret that will be used for authentication. - * @param minimumAuthenticationClass only consider configurations that can provide at least this authentication class. The actual + * @param props + * - minimumAuthenticationClass only consider configurations that can provide at least this authentication class. The actual * authentication class obtained for the token may be higher. + * - doNotUseProjectIdForGroupSelection (INTERNAL USE ONLY) only use the project id specified in the initialize method to choose the configuration of + * the external token, but not the group where to log in. This is probably not the option you are looking for. */ - constructor (readonly configId: string, readonly secret: string, readonly minimumAuthenticationClass?: AuthenticationClass) {} + constructor (readonly configId: string, readonly secret: string, props: { minimumAuthenticationClass?: AuthenticationClass, doNotUseProjectIdForGroupSelection?: boolean } = {}) { + this.minimumAuthenticationClass = props.minimumAuthenticationClass + this.doNotUseProjectIdForGroupSelection = props.doNotUseProjectIdForGroupSelection + } } } export type AuthSecretDetails = @@ -312,4 +340,4 @@ export class AuthenticationProcessRequest { readonly specId: String, readonly requestId: String ) {} -} \ No newline at end of file +}