diff --git a/apps/server/src/modules/tool/external-tool/entity/external-tool.entity.ts b/apps/server/src/modules/tool/external-tool/entity/external-tool.entity.ts index d73a57b54f4..e5a6fbbf6f8 100644 --- a/apps/server/src/modules/tool/external-tool/entity/external-tool.entity.ts +++ b/apps/server/src/modules/tool/external-tool/entity/external-tool.entity.ts @@ -1,5 +1,4 @@ import { Embedded, Entity, Property, Unique } from '@mikro-orm/core'; - import { BaseEntityWithTimestamps } from '@shared/domain/entity/base.entity'; import { EntityId } from '@shared/domain/types'; import { ToolContextType } from '../../common/enum'; diff --git a/apps/server/src/modules/user-license/domain/media-source-oauth-config.ts b/apps/server/src/modules/user-license/domain/media-source-oauth-config.ts new file mode 100644 index 00000000000..7846c782191 --- /dev/null +++ b/apps/server/src/modules/user-license/domain/media-source-oauth-config.ts @@ -0,0 +1,17 @@ +import { AuthorizableObject, DomainObject } from '@shared/domain/domain-object'; +import { EntityId } from '@shared/domain/types'; +import { MediaSourceAuthMethod } from '../enum'; + +export interface MediaSourceOauthConfigProps extends AuthorizableObject { + id: EntityId; + + clientId: string; + + clientSecret: string; + + authEndpoint: string; + + method: MediaSourceAuthMethod; +} + +export class MediaSourceOauthConfig extends DomainObject {} diff --git a/apps/server/src/modules/user-license/domain/media-source.ts b/apps/server/src/modules/user-license/domain/media-source.ts index 7759d36bb4e..62147d86d0a 100644 --- a/apps/server/src/modules/user-license/domain/media-source.ts +++ b/apps/server/src/modules/user-license/domain/media-source.ts @@ -1,11 +1,17 @@ -import { DomainObject } from '@shared/domain/domain-object'; +import { AuthorizableObject, DomainObject } from '@shared/domain/domain-object'; +import { MediaSourceOauthConfig } from './media-source-oauth-config'; +import { MediaSourceDataFormat } from '../enum'; -export interface MediaSourceProps { +export interface MediaSourceProps extends AuthorizableObject { id: string; name?: string; sourceId: string; + + format?: MediaSourceDataFormat; + + config?: MediaSourceOauthConfig; } export class MediaSource extends DomainObject { @@ -16,4 +22,12 @@ export class MediaSource extends DomainObject { get sourceId(): string { return this.props.sourceId; } + + get format(): MediaSourceDataFormat | undefined { + return this.props.format; + } + + get config(): MediaSourceOauthConfig | undefined { + return this.props.config; + } } diff --git a/apps/server/src/modules/user-license/entity/index.ts b/apps/server/src/modules/user-license/entity/index.ts index 7b7925040ed..7343a42f18b 100644 --- a/apps/server/src/modules/user-license/entity/index.ts +++ b/apps/server/src/modules/user-license/entity/index.ts @@ -1,4 +1,6 @@ -export { UserLicenseType } from './user-license-type'; +export { UserLicenseType } from '../enum/user-license-type'; export { MediaUserLicenseEntity, MediaUserLicenseEntityProps } from './media-user-license.entity'; export { UserLicenseEntity } from './user-license.entity'; export { MediaSourceEntity, MediaSourceEntityProps } from './media-source.entity'; +export { MediaSourceDataFormat } from '../enum/media-source-data-format.enum'; +export { MediaSourceAuthMethod } from '../enum/media-source-auth-method.enum'; diff --git a/apps/server/src/modules/user-license/entity/media-source-oauth-config.embeddable.ts b/apps/server/src/modules/user-license/entity/media-source-oauth-config.embeddable.ts new file mode 100644 index 00000000000..a236c308865 --- /dev/null +++ b/apps/server/src/modules/user-license/entity/media-source-oauth-config.embeddable.ts @@ -0,0 +1,41 @@ +import { Embeddable, Enum, Property } from '@mikro-orm/core'; +import { ObjectId } from '@mikro-orm/mongodb'; +import { MediaSourceAuthMethod } from '../enum/media-source-auth-method.enum'; + +export interface MediaSourceConfigEmbeddableProps { + _id: ObjectId; + + clientId: string; + + clientSecret: string; + + authEndpoint: string; + + method: MediaSourceAuthMethod; +} + +@Embeddable() +export class MediaSourceConfigEmbeddable { + @Property() + _id: ObjectId; + + @Property() + clientId: string; + + @Property() + clientSecret: string; + + @Property() + authEndpoint: string; + + @Enum({ nullable: false }) + method: MediaSourceAuthMethod; + + constructor(props: MediaSourceConfigEmbeddableProps) { + this._id = props._id; + this.clientId = props.clientId; + this.clientSecret = props.clientSecret; + this.authEndpoint = props.authEndpoint; + this.method = props.method; + } +} diff --git a/apps/server/src/modules/user-license/entity/media-source.entity.ts b/apps/server/src/modules/user-license/entity/media-source.entity.ts index 57ee3b55cfa..bd3f9da8b79 100644 --- a/apps/server/src/modules/user-license/entity/media-source.entity.ts +++ b/apps/server/src/modules/user-license/entity/media-source.entity.ts @@ -1,6 +1,8 @@ -import { Entity, Index, Property } from '@mikro-orm/core'; +import { Embedded, Entity, Index, Property } from '@mikro-orm/core'; import { BaseEntityWithTimestamps } from '@shared/domain/entity/base.entity'; import { EntityId } from '@shared/domain/types'; +import { MediaSourceDataFormat } from '../enum/media-source-data-format.enum'; +import { MediaSourceConfigEmbeddable } from './media-source-oauth-config.embeddable'; export interface MediaSourceEntityProps { id?: EntityId; @@ -8,23 +10,35 @@ export interface MediaSourceEntityProps { name?: string; sourceId: string; + + config?: MediaSourceConfigEmbeddable; + + format?: MediaSourceDataFormat; } @Entity({ tableName: 'media-sources' }) export class MediaSourceEntity extends BaseEntityWithTimestamps { constructor(props: MediaSourceEntityProps) { super(); - if (props.id != null) { + if (props.id) { this.id = props.id; } - this.name = props.name; this.sourceId = props.sourceId; + this.name = props.name; + this.format = props.format; + this.config = props.config; } - @Property({ nullable: true }) - name?: string; - @Index() @Property() sourceId: string; + + @Property({ nullable: true }) + name?: string; + + @Property({ nullable: true }) + format?: MediaSourceDataFormat; + + @Embedded(() => MediaSourceConfigEmbeddable, { object: true, nullable: true }) + config?: MediaSourceConfigEmbeddable; } diff --git a/apps/server/src/modules/user-license/entity/media-user-license.entity.ts b/apps/server/src/modules/user-license/entity/media-user-license.entity.ts index 4cc501c4975..ded564bdce3 100644 --- a/apps/server/src/modules/user-license/entity/media-user-license.entity.ts +++ b/apps/server/src/modules/user-license/entity/media-user-license.entity.ts @@ -1,6 +1,6 @@ import { Entity, ManyToOne, Property } from '@mikro-orm/core'; import { MediaSourceEntity } from './media-source.entity'; -import { UserLicenseType } from './user-license-type'; +import { UserLicenseType } from '../enum/user-license-type'; import { UserLicenseEntity, UserLicenseProps } from './user-license.entity'; export interface MediaUserLicenseEntityProps extends UserLicenseProps { diff --git a/apps/server/src/modules/user-license/entity/user-license.entity.ts b/apps/server/src/modules/user-license/entity/user-license.entity.ts index 1e3ddcd7b71..0d8948a1126 100644 --- a/apps/server/src/modules/user-license/entity/user-license.entity.ts +++ b/apps/server/src/modules/user-license/entity/user-license.entity.ts @@ -2,7 +2,7 @@ import { Entity, Enum, Index, ManyToOne } from '@mikro-orm/core'; import { BaseEntityWithTimestamps } from '@shared/domain/entity/base.entity'; import { User as UserEntity } from '@shared/domain/entity/user.entity'; import { EntityId } from '@shared/domain/types'; -import { UserLicenseType } from './user-license-type'; +import { UserLicenseType } from '../enum/user-license-type'; export interface UserLicenseProps { id?: EntityId; diff --git a/apps/server/src/modules/user-license/enum/index.ts b/apps/server/src/modules/user-license/enum/index.ts new file mode 100644 index 00000000000..66d96a9a346 --- /dev/null +++ b/apps/server/src/modules/user-license/enum/index.ts @@ -0,0 +1,3 @@ +export { UserLicenseType } from './user-license-type'; +export { MediaSourceDataFormat } from './media-source-data-format.enum'; +export { MediaSourceAuthMethod } from './media-source-auth-method.enum'; diff --git a/apps/server/src/modules/user-license/enum/media-source-auth-method.enum.ts b/apps/server/src/modules/user-license/enum/media-source-auth-method.enum.ts new file mode 100644 index 00000000000..5f839c307c2 --- /dev/null +++ b/apps/server/src/modules/user-license/enum/media-source-auth-method.enum.ts @@ -0,0 +1,3 @@ +export enum MediaSourceAuthMethod { + CLIENT_CREDENTIALS = 'CLIENT_CREDENTIALS', +} diff --git a/apps/server/src/modules/user-license/enum/media-source-data-format.enum.ts b/apps/server/src/modules/user-license/enum/media-source-data-format.enum.ts new file mode 100644 index 00000000000..98bfa8f4b73 --- /dev/null +++ b/apps/server/src/modules/user-license/enum/media-source-data-format.enum.ts @@ -0,0 +1,3 @@ +export enum MediaSourceDataFormat { + BILDUNGSLOGIN = 'BILDUNGSLOGIN', +} diff --git a/apps/server/src/modules/user-license/entity/user-license-type.ts b/apps/server/src/modules/user-license/enum/user-license-type.ts similarity index 100% rename from apps/server/src/modules/user-license/entity/user-license-type.ts rename to apps/server/src/modules/user-license/enum/user-license-type.ts diff --git a/apps/server/src/modules/user-license/index.ts b/apps/server/src/modules/user-license/index.ts index ebb28ca5a46..7a37a14200c 100644 --- a/apps/server/src/modules/user-license/index.ts +++ b/apps/server/src/modules/user-license/index.ts @@ -1,10 +1,11 @@ -export { UserLicenseModule } from './user-license.module'; -export { MediaUserLicenseService, MediaSourceService } from './service'; -export { MediaUserLicense, MediaSource, MediaUserLicenseProps, MediaSourceProps, AnyUserLicense } from './domain'; -export { UserLicenseType } from './entity/user-license-type'; +export { AnyUserLicense, MediaSource, MediaSourceProps, MediaUserLicense, MediaUserLicenseProps } from './domain'; +export { MediaSourceEntity } from './entity'; +export { UserLicenseType } from './enum/user-license-type'; +export { MediaSourceService, MediaUserLicenseService } from './service'; export { - mediaUserLicenseFactory, - mediaSourceFactory, mediaSourceEntityFactory, + mediaSourceFactory, mediaUserLicenseEntityFactory, + mediaUserLicenseFactory, } from './testing'; +export { UserLicenseModule } from './user-license.module'; diff --git a/apps/server/src/modules/user-license/repo/index.ts b/apps/server/src/modules/user-license/repo/index.ts index 102b731f497..0aed70e9853 100644 --- a/apps/server/src/modules/user-license/repo/index.ts +++ b/apps/server/src/modules/user-license/repo/index.ts @@ -1,3 +1,4 @@ +export { MediaSourceConfigMapper } from './media-source-config.mapper'; +export { MediaSourceRepo } from './media-source.repo'; export { MediaUserLicenseRepo } from './media-user-license.repo'; export { UserLicenseQuery } from './user-license-query'; -export { MediaSourceRepo } from './media-source.repo'; diff --git a/apps/server/src/modules/user-license/repo/media-source-config.mapper.spec.ts b/apps/server/src/modules/user-license/repo/media-source-config.mapper.spec.ts new file mode 100644 index 00000000000..0a73a28f018 --- /dev/null +++ b/apps/server/src/modules/user-license/repo/media-source-config.mapper.spec.ts @@ -0,0 +1,79 @@ +import { ObjectId } from '@mikro-orm/mongodb'; +import { setupEntities } from '@shared/testing'; +import { MediaSourceOauthConfig } from '../domain/media-source-oauth-config'; +import { MediaSourceConfigEmbeddable } from '../entity/media-source-oauth-config.embeddable'; +import { mediaSourceConfigEmbeddableFactory } from '../testing/media-source-config.embeddable.factory'; +import { mediaSourceConfigFactory } from '../testing/media-source-config.factory'; +import { MediaSourceConfigMapper } from './media-source-config.mapper'; + +describe('MediaSourceConfigMapper', () => { + describe('mapToDo', () => { + describe('when entity is passed', () => { + const setup = async () => { + await setupEntities(); + + const entity = mediaSourceConfigEmbeddableFactory.build(); + const expected = new MediaSourceOauthConfig({ + id: entity._id.toHexString(), + clientId: entity.clientId, + clientSecret: entity.clientSecret, + authEndpoint: entity.authEndpoint, + method: entity.method, + }); + + return { entity, expected }; + }; + + it('should return an instance of config', async () => { + const { entity } = await setup(); + + const result = MediaSourceConfigMapper.mapToDo(entity); + + expect(result).toBeInstanceOf(MediaSourceOauthConfig); + }); + + it('should return a do with all properties', async () => { + const { entity, expected } = await setup(); + + const result = MediaSourceConfigMapper.mapToDo(entity); + + expect(result).toEqual(expected); + }); + }); + }); + + describe('mapToEntity', () => { + describe('when config do is passed', () => { + const setup = async () => { + await setupEntities(); + + const configDo = mediaSourceConfigFactory.build(); + const expected = new MediaSourceConfigEmbeddable({ + _id: new ObjectId(configDo.id), + clientId: configDo.getProps().clientId, + clientSecret: configDo.getProps().clientSecret, + authEndpoint: configDo.getProps().authEndpoint, + method: configDo.getProps().method, + }); + + return { configDo, expected }; + }; + + it('should return an instance of config embeddable', async () => { + const { configDo } = await setup(); + + const result = MediaSourceConfigMapper.mapToEntity(configDo); + + expect(result).toBeInstanceOf(MediaSourceConfigEmbeddable); + }); + + it('should return an embeddable with all properties', async () => { + const { configDo, expected } = await setup(); + + const result = MediaSourceConfigMapper.mapToEntity(configDo); + + expect(result).toEqual(expected); + }); + }); + }); +}); diff --git a/apps/server/src/modules/user-license/repo/media-source-config.mapper.ts b/apps/server/src/modules/user-license/repo/media-source-config.mapper.ts new file mode 100644 index 00000000000..5a2f4fcfce1 --- /dev/null +++ b/apps/server/src/modules/user-license/repo/media-source-config.mapper.ts @@ -0,0 +1,25 @@ +import { ObjectId } from '@mikro-orm/mongodb'; +import { MediaSourceOauthConfig } from '../domain/media-source-oauth-config'; +import { MediaSourceConfigEmbeddable } from '../entity/media-source-oauth-config.embeddable'; + +export class MediaSourceConfigMapper { + static mapToEntity(config: MediaSourceOauthConfig): MediaSourceConfigEmbeddable { + const configProps = config.getProps(); + + const configEmbeddable = new MediaSourceConfigEmbeddable({ ...configProps, _id: new ObjectId(configProps.id) }); + + return configEmbeddable; + } + + static mapToDo(embeddable: MediaSourceConfigEmbeddable): MediaSourceOauthConfig { + const config = new MediaSourceOauthConfig({ + id: embeddable._id.toHexString(), + clientId: embeddable.clientId, + clientSecret: embeddable.clientSecret, + method: embeddable.method, + authEndpoint: embeddable.authEndpoint, + }); + + return config; + } +} diff --git a/apps/server/src/modules/user-license/repo/media-source.mapper.ts b/apps/server/src/modules/user-license/repo/media-source.mapper.ts index f1ae887a3b0..20b46bdd6cb 100644 --- a/apps/server/src/modules/user-license/repo/media-source.mapper.ts +++ b/apps/server/src/modules/user-license/repo/media-source.mapper.ts @@ -1,12 +1,15 @@ import { EntityData } from '@mikro-orm/core'; import { MediaSource } from '../domain'; import { MediaSourceEntity } from '../entity'; +import { MediaSourceConfigMapper } from './media-source-config.mapper'; export class MediaSourceMapper { public static mapToEntityProperties(entityDO: MediaSource): EntityData { const entityProps: EntityData = { name: entityDO.name, sourceId: entityDO.sourceId, + config: entityDO.config ? MediaSourceConfigMapper.mapToEntity(entityDO.config) : undefined, + format: entityDO.format, }; return entityProps; @@ -17,6 +20,8 @@ export class MediaSourceMapper { id: entity.id, name: entity.name, sourceId: entity.sourceId, + config: entity.config ? MediaSourceConfigMapper.mapToDo(entity.config) : undefined, + format: entity.format, }); return domainObject; diff --git a/apps/server/src/modules/user-license/repo/media-source.repo.spec.ts b/apps/server/src/modules/user-license/repo/media-source.repo.spec.ts index 12708211687..63ae61b3a4c 100644 --- a/apps/server/src/modules/user-license/repo/media-source.repo.spec.ts +++ b/apps/server/src/modules/user-license/repo/media-source.repo.spec.ts @@ -6,6 +6,9 @@ import { MediaSource } from '../domain'; import { MediaSourceEntity } from '../entity'; import { mediaSourceEntityFactory, mediaSourceFactory } from '../testing'; import { MediaSourceRepo } from './media-source.repo'; +import { MediaSourceConfigEmbeddable } from '../entity/media-source-oauth-config.embeddable'; +import { mediaSourceConfigEmbeddableFactory } from '../testing/media-source-config.embeddable.factory'; +import { MediaSourceConfigMapper } from './media-source-config.mapper'; describe(MediaSourceRepo.name, () => { let module: TestingModule; @@ -33,7 +36,9 @@ describe(MediaSourceRepo.name, () => { describe('findBySourceId', () => { describe('when a media source exists', () => { const setup = async () => { - const mediaSource: MediaSourceEntity = mediaSourceEntityFactory.build(); + const config: MediaSourceConfigEmbeddable = mediaSourceConfigEmbeddableFactory.build(); + + const mediaSource: MediaSourceEntity = mediaSourceEntityFactory.build({ config }); await em.persistAndFlush([mediaSource]); @@ -41,11 +46,12 @@ describe(MediaSourceRepo.name, () => { return { mediaSource, + config, }; }; it('should return user licenses for user', async () => { - const { mediaSource } = await setup(); + const { mediaSource, config } = await setup(); const result = await repo.findBySourceId(mediaSource.sourceId); @@ -54,6 +60,8 @@ describe(MediaSourceRepo.name, () => { id: mediaSource.id, name: mediaSource.name, sourceId: mediaSource.sourceId, + format: mediaSource.format, + config: MediaSourceConfigMapper.mapToDo(config), }) ); }); diff --git a/apps/server/src/modules/user-license/repo/media-user-license.repo.spec.ts b/apps/server/src/modules/user-license/repo/media-user-license.repo.spec.ts index 5940d568137..f8a29727842 100644 --- a/apps/server/src/modules/user-license/repo/media-user-license.repo.spec.ts +++ b/apps/server/src/modules/user-license/repo/media-user-license.repo.spec.ts @@ -12,6 +12,9 @@ import { mediaUserLicenseFactory, } from '../testing'; import { MediaUserLicenseRepo } from './media-user-license.repo'; +import { MediaSourceConfigMapper } from './media-source-config.mapper'; +import { MediaSourceConfigEmbeddable } from '../entity/media-source-oauth-config.embeddable'; +import { mediaSourceConfigEmbeddableFactory } from '../testing/media-source-config.embeddable.factory'; describe(MediaUserLicenseRepo.name, () => { let module: TestingModule; @@ -40,7 +43,8 @@ describe(MediaUserLicenseRepo.name, () => { describe('when searching for a users media licences', () => { const setup = async () => { const user: UserEntity = userFactory.build(); - const mediaSource: MediaSourceEntity = mediaSourceEntityFactory.build(); + const config: MediaSourceConfigEmbeddable = mediaSourceConfigEmbeddableFactory.build(); + const mediaSource: MediaSourceEntity = mediaSourceEntityFactory.build({ config }); const mediaUserLicense: MediaUserLicenseEntity = mediaUserLicenseEntityFactory.build({ user, mediaSource }); const otherMediaUserLicense: MediaUserLicenseEntity = mediaUserLicenseEntityFactory.build(); @@ -52,11 +56,12 @@ describe(MediaUserLicenseRepo.name, () => { user, mediaUserLicense, mediaSource, + config, }; }; it('should return user licenses for user', async () => { - const { user, mediaUserLicense, mediaSource } = await setup(); + const { user, mediaUserLicense, mediaSource, config } = await setup(); const result: MediaUserLicense[] = await repo.findMediaUserLicensesForUser(user.id); @@ -70,6 +75,8 @@ describe(MediaUserLicenseRepo.name, () => { id: mediaSource.id, name: mediaSource.name, sourceId: mediaSource.sourceId, + format: mediaSource.format, + config: MediaSourceConfigMapper.mapToDo(config), }), }), ]); diff --git a/apps/server/src/modules/user-license/repo/media-user-license.repo.ts b/apps/server/src/modules/user-license/repo/media-user-license.repo.ts index 19685fd8656..004984b07ec 100644 --- a/apps/server/src/modules/user-license/repo/media-user-license.repo.ts +++ b/apps/server/src/modules/user-license/repo/media-user-license.repo.ts @@ -5,6 +5,7 @@ import { EntityId } from '@shared/domain/types'; import { BaseDomainObjectRepo } from '@shared/repo/base-domain-object.repo'; import { MediaSource, MediaUserLicense } from '../domain'; import { MediaSourceEntity, MediaUserLicenseEntity, UserLicenseType } from '../entity'; +import { MediaSourceConfigMapper } from './media-source-config.mapper'; @Injectable() export class MediaUserLicenseRepo extends BaseDomainObjectRepo { @@ -20,6 +21,8 @@ export class MediaUserLicenseRepo extends BaseDomainObjectRepo(MediaSourceConfigEmbeddable, ({ sequence }) => { + return { + _id: new ObjectId(), + clientId: `media-source-client-id-${sequence}`, + clientSecret: `media-source-client-secret-${sequence}`, + authEndpoint: `media-source-auth-endpoint-${sequence}`, + method: MediaSourceAuthMethod.CLIENT_CREDENTIALS, + }; +}); diff --git a/apps/server/src/modules/user-license/testing/media-source-config.factory.ts b/apps/server/src/modules/user-license/testing/media-source-config.factory.ts new file mode 100644 index 00000000000..d43d288b9b7 --- /dev/null +++ b/apps/server/src/modules/user-license/testing/media-source-config.factory.ts @@ -0,0 +1,19 @@ +import { ObjectId } from '@mikro-orm/mongodb'; +import { BaseFactory } from '@shared/testing'; +import { MediaSourceAuthMethod } from '../entity'; +import { MediaSourceOauthConfig, MediaSourceOauthConfigProps } from '../domain/media-source-oauth-config'; + +export const mediaSourceConfigFactory = BaseFactory.define( + MediaSourceOauthConfig, + ({ sequence }) => { + const config = { + id: new ObjectId().toHexString(), + clientId: `media-source-client-id-${sequence}`, + clientSecret: `media-source-client-secret-${sequence}`, + authEndpoint: `media-source-auth-endpoint-${sequence}`, + method: MediaSourceAuthMethod.CLIENT_CREDENTIALS, + }; + + return config; + } +); diff --git a/apps/server/src/modules/user-license/testing/media-source-entity.factory.ts b/apps/server/src/modules/user-license/testing/media-source-entity.factory.ts index 801927dca57..48013f5364c 100644 --- a/apps/server/src/modules/user-license/testing/media-source-entity.factory.ts +++ b/apps/server/src/modules/user-license/testing/media-source-entity.factory.ts @@ -1,6 +1,7 @@ import { ObjectId } from '@mikro-orm/mongodb'; import { BaseFactory } from '@shared/testing'; -import { MediaSourceEntity, MediaSourceEntityProps } from '../entity'; +import { MediaSourceDataFormat, MediaSourceEntity, MediaSourceEntityProps } from '../entity'; +import { mediaSourceConfigEmbeddableFactory } from './media-source-config.embeddable.factory'; export const mediaSourceEntityFactory = BaseFactory.define( MediaSourceEntity, @@ -9,6 +10,8 @@ export const mediaSourceEntityFactory = BaseFactory.define(MediaSource, ({ sequence }) => { return { id: new ObjectId().toHexString(), name: `media-source-${sequence}`, sourceId: `source-id-${sequence}`, + format: MediaSourceDataFormat.BILDUNGSLOGIN, + config: mediaSourceConfigFactory.build(), }; });