feat: add hasMany flag to enforce in app link uniqueness (#12039)

* feat: add createMultiple flag to enforce inApp link uniqueness

* changes

* mocks

* default

* many to many

---------

Co-authored-by: Carlos R. L. Rodrigues <rodrigolr@gmail.com>
This commit is contained in:
Harminder Virk
2025-04-02 14:16:51 +05:30
committed by GitHub
parent f441362f4a
commit d3e725a907
25 changed files with 316 additions and 70 deletions

View File

@@ -85,6 +85,7 @@ type ModuleLinkableKeyConfig = {
deleteCascade?: boolean
primaryKey: string
alias: string
hasMany?: boolean
shortcut?: Shortcut | Shortcut[]
}
@@ -125,8 +126,7 @@ function buildFieldAlias(fieldAliases?: Shortcut | Shortcut[]) {
}
function prepareServiceConfig(
input: DefineLinkInputSource | DefineReadOnlyLinkInputSource,
defaultOptions?: { isList?: boolean }
input: DefineLinkInputSource | DefineReadOnlyLinkInputSource
) {
let serviceConfig = {} as ModuleLinkableKeyConfig
@@ -138,7 +138,8 @@ function prepareServiceConfig(
alias: source.alias ?? camelToSnakeCase(source.field ?? ""),
field: input.field ?? source.field,
primaryKey: source.primaryKey,
isList: defaultOptions?.isList ?? false,
isList: false,
hasMany: false,
deleteCascade: false,
module: source.serviceName,
entity: source.entity,
@@ -148,12 +149,15 @@ function prepareServiceConfig(
? input.linkable.toJSON()
: input.linkable
const hasMany = !!input.isList
serviceConfig = {
key: source.linkable,
alias: source.alias ?? camelToSnakeCase(source.field ?? ""),
field: input.field ?? source.field,
primaryKey: source.primaryKey,
isList: input.isList ?? defaultOptions?.isList ?? false,
isList: input.isList ?? false,
hasMany,
deleteCascade: input.deleteCascade ?? false,
module: source.serviceName,
entity: source.entity,
@@ -184,8 +188,8 @@ export function defineLink(
rightService: DefineLinkInputSource | DefineReadOnlyLinkInputSource,
linkServiceOptions?: ExtraOptions | ReadOnlyExtraOptions
): DefineLinkExport {
const serviceAObj = prepareServiceConfig(leftService, { isList: true })
const serviceBObj = prepareServiceConfig(rightService, { isList: false })
const serviceAObj = prepareServiceConfig(leftService)
const serviceBObj = prepareServiceConfig(rightService)
if (linkServiceOptions?.readOnly) {
return defineReadOnlyLink(
@@ -374,7 +378,7 @@ ${serviceBObj.module}: {
methodSuffix: serviceAMethodSuffix,
},
deleteCascade: serviceAObj.deleteCascade,
isList: serviceAObj.isList,
hasMany: serviceAObj.hasMany,
},
{
serviceName: serviceBObj.module,
@@ -386,7 +390,7 @@ ${serviceBObj.module}: {
methodSuffix: serviceBMethodSuffix,
},
deleteCascade: serviceBObj.deleteCascade,
isList: serviceBObj.isList,
hasMany: serviceBObj.hasMany,
},
],
extends: [