fix merge

This commit is contained in:
martabal 2023-10-04 13:52:51 +02:00
parent f6170e5f7f
commit 698e45a5cb
No known key found for this signature in database
GPG key ID: C00196E3148A52BD
11 changed files with 442 additions and 18 deletions

View file

@ -4,7 +4,7 @@
* Immich
* Immich API
*
* The version of the OpenAPI document: 1.78.1
* The version of the OpenAPI document: 1.81.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
@ -392,6 +392,12 @@ export interface AllJobStatusResponseDto {
* @memberof AllJobStatusResponseDto
*/
'metadataExtraction': JobStatusDto;
/**
*
* @type {JobStatusDto}
* @memberof AllJobStatusResponseDto
*/
'migration': JobStatusDto;
/**
*
* @type {JobStatusDto}
@ -1466,6 +1472,22 @@ export interface CheckExistingAssetsResponseDto {
*/
'existingIds': Array<string>;
}
/**
*
* @export
* @enum {string}
*/
export const CitiesFile = {
Cities15000: 'cities15000',
Cities5000: 'cities5000',
Cities1000: 'cities1000',
Cities500: 'cities500'
} as const;
export type CitiesFile = typeof CitiesFile[keyof typeof CitiesFile];
/**
*
* @export
@ -1895,12 +1917,24 @@ export interface ExifEntity {
* @memberof ExifEntity
*/
'assetId': string;
/**
*
* @type {number}
* @memberof ExifEntity
*/
'bitsPerSample': number | null;
/**
*
* @type {string}
* @memberof ExifEntity
*/
'city': string | null;
/**
*
* @type {string}
* @memberof ExifEntity
*/
'colorspace': string | null;
/**
*
* @type {string}
@ -2021,6 +2055,12 @@ export interface ExifEntity {
* @memberof ExifEntity
*/
'orientation': string | null;
/**
*
* @type {string}
* @memberof ExifEntity
*/
'profileDescription': string | null;
/**
*
* @type {string}
@ -2359,6 +2399,7 @@ export const JobName = {
ClipEncoding: 'clipEncoding',
BackgroundTask: 'backgroundTask',
StorageTemplateMigration: 'storageTemplateMigration',
Migration: 'migration',
Search: 'search',
Sidecar: 'sidecar',
Library: 'library'
@ -3395,6 +3436,12 @@ export interface ServerFeaturesDto {
* @memberof ServerFeaturesDto
*/
'passwordLogin': boolean;
/**
*
* @type {boolean}
* @memberof ServerFeaturesDto
*/
'reverseGeocoding': boolean;
/**
*
* @type {boolean}
@ -3974,6 +4021,12 @@ export interface SystemConfigDto {
* @memberof SystemConfigDto
*/
'passwordLogin': SystemConfigPasswordLoginDto;
/**
*
* @type {SystemConfigReverseGeocodingDto}
* @memberof SystemConfigDto
*/
'reverseGeocoding': SystemConfigReverseGeocodingDto;
/**
*
* @type {SystemConfigStorageTemplateDto}
@ -4128,6 +4181,12 @@ export interface SystemConfigJobDto {
* @memberof SystemConfigJobDto
*/
'metadataExtraction': JobSettingsDto;
/**
*
* @type {JobSettingsDto}
* @memberof SystemConfigJobDto
*/
'migration': JobSettingsDto;
/**
*
* @type {JobSettingsDto}
@ -4313,6 +4372,27 @@ export interface SystemConfigPasswordLoginDto {
*/
'enabled': boolean;
}
/**
*
* @export
* @interface SystemConfigReverseGeocodingDto
*/
export interface SystemConfigReverseGeocodingDto {
/**
*
* @type {CitiesFile}
* @memberof SystemConfigReverseGeocodingDto
*/
'citiesFileOverride': CitiesFile;
/**
*
* @type {boolean}
* @memberof SystemConfigReverseGeocodingDto
*/
'enabled': boolean;
}
/**
*
* @export
@ -4368,6 +4448,12 @@ export interface SystemConfigTemplateStorageOptionDto {
* @memberof SystemConfigTemplateStorageOptionDto
*/
'secondOptions': Array<string>;
/**
*
* @type {Array<string>}
* @memberof SystemConfigTemplateStorageOptionDto
*/
'weekOptions': Array<string>;
/**
*
* @type {Array<string>}
@ -7358,6 +7444,49 @@ export const AssetApiAxiosParamCreator = function (configuration?: Configuration
setSearchParams(localVarUrlObj, localVarQueryParameter);
let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
return {
url: toPathString(localVarUrlObj),
options: localVarRequestOptions,
};
},
/**
*
* @param {number} [count]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
getRandom: async (count?: number, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
const localVarPath = `/asset/random`;
// use dummy base URL string because the URL constructor only accepts absolute URLs.
const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
let baseOptions;
if (configuration) {
baseOptions = configuration.baseOptions;
}
const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options};
const localVarHeaderParameter = {} as any;
const localVarQueryParameter = {} as any;
// authentication cookie required
// authentication api_key required
await setApiKeyToObject(localVarHeaderParameter, "x-api-key", configuration)
// authentication bearer required
// http bearer authentication required
await setBearerAuthToObject(localVarHeaderParameter, configuration)
if (count !== undefined) {
localVarQueryParameter['count'] = count;
}
setSearchParams(localVarUrlObj, localVarQueryParameter);
let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
@ -8098,6 +8227,16 @@ export const AssetApiFp = function(configuration?: Configuration) {
const localVarAxiosArgs = await localVarAxiosParamCreator.getMemoryLane(timestamp, options);
return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration);
},
/**
*
* @param {number} [count]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
async getRandom(count?: number, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<Array<AssetResponseDto>>> {
const localVarAxiosArgs = await localVarAxiosParamCreator.getRandom(count, options);
return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration);
},
/**
*
* @param {TimeBucketSize} size
@ -8373,6 +8512,15 @@ export const AssetApiFactory = function (configuration?: Configuration, basePath
getMemoryLane(requestParameters: AssetApiGetMemoryLaneRequest, options?: AxiosRequestConfig): AxiosPromise<Array<MemoryLaneResponseDto>> {
return localVarFp.getMemoryLane(requestParameters.timestamp, options).then((request) => request(axios, basePath));
},
/**
*
* @param {AssetApiGetRandomRequest} requestParameters Request parameters.
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
getRandom(requestParameters: AssetApiGetRandomRequest = {}, options?: AxiosRequestConfig): AxiosPromise<Array<AssetResponseDto>> {
return localVarFp.getRandom(requestParameters.count, options).then((request) => request(axios, basePath));
},
/**
*
* @param {AssetApiGetTimeBucketsRequest} requestParameters Request parameters.
@ -8807,6 +8955,20 @@ export interface AssetApiGetMemoryLaneRequest {
readonly timestamp: string
}
/**
* Request parameters for getRandom operation in AssetApi.
* @export
* @interface AssetApiGetRandomRequest
*/
export interface AssetApiGetRandomRequest {
/**
*
* @type {number}
* @memberof AssetApiGetRandom
*/
readonly count?: number
}
/**
* Request parameters for getTimeBuckets operation in AssetApi.
* @export
@ -9299,6 +9461,17 @@ export class AssetApi extends BaseAPI {
return AssetApiFp(this.configuration).getMemoryLane(requestParameters.timestamp, options).then((request) => request(this.axios, this.basePath));
}
/**
*
* @param {AssetApiGetRandomRequest} requestParameters Request parameters.
* @param {*} [options] Override http request option.
* @throws {RequiredError}
* @memberof AssetApi
*/
public getRandom(requestParameters: AssetApiGetRandomRequest = {}, options?: AxiosRequestConfig) {
return AssetApiFp(this.configuration).getRandom(requestParameters.count, options).then((request) => request(this.axios, this.basePath));
}
/**
*
* @param {AssetApiGetTimeBucketsRequest} requestParameters Request parameters.

View file

@ -48,6 +48,7 @@ doc/CheckDuplicateAssetDto.md
doc/CheckDuplicateAssetResponseDto.md
doc/CheckExistingAssetsDto.md
doc/CheckExistingAssetsResponseDto.md
doc/CitiesFile.md
doc/ClassificationConfig.md
doc/Colorspace.md
doc/CreateAlbumDto.md
@ -136,6 +137,7 @@ doc/SystemConfigMachineLearningDto.md
doc/SystemConfigMapDto.md
doc/SystemConfigOAuthDto.md
doc/SystemConfigPasswordLoginDto.md
doc/SystemConfigReverseGeocodingDto.md
doc/SystemConfigStorageTemplateDto.md
doc/SystemConfigTemplateStorageOptionDto.md
doc/SystemConfigThumbnailDto.md
@ -224,6 +226,7 @@ lib/model/check_duplicate_asset_dto.dart
lib/model/check_duplicate_asset_response_dto.dart
lib/model/check_existing_assets_dto.dart
lib/model/check_existing_assets_response_dto.dart
lib/model/cities_file.dart
lib/model/classification_config.dart
lib/model/clip_config.dart
lib/model/clip_mode.dart
@ -306,6 +309,7 @@ lib/model/system_config_machine_learning_dto.dart
lib/model/system_config_map_dto.dart
lib/model/system_config_o_auth_dto.dart
lib/model/system_config_password_login_dto.dart
lib/model/system_config_reverse_geocoding_dto.dart
lib/model/system_config_storage_template_dto.dart
lib/model/system_config_template_storage_option_dto.dart
lib/model/system_config_thumbnail_dto.dart
@ -372,6 +376,7 @@ test/check_duplicate_asset_dto_test.dart
test/check_duplicate_asset_response_dto_test.dart
test/check_existing_assets_dto_test.dart
test/check_existing_assets_response_dto_test.dart
test/cities_file_test.dart
test/classification_config_test.dart
test/clip_config_test.dart
test/clip_mode_test.dart
@ -463,6 +468,7 @@ test/system_config_machine_learning_dto_test.dart
test/system_config_map_dto_test.dart
test/system_config_o_auth_dto_test.dart
test/system_config_password_login_dto_test.dart
test/system_config_reverse_geocoding_dto_test.dart
test/system_config_storage_template_dto_test.dart
test/system_config_template_storage_option_dto_test.dart
test/system_config_thumbnail_dto_test.dart

View file

@ -3,7 +3,7 @@ Immich API
This Dart package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project:
- API version: 1.78.1
- API version: 1.81.0
- Build package: org.openapitools.codegen.languages.DartClientCodegen
## Requirements
@ -104,6 +104,7 @@ Class | Method | HTTP request | Description
*AssetApi* | [**getDownloadInfo**](doc//AssetApi.md#getdownloadinfo) | **POST** /asset/download/info |
*AssetApi* | [**getMapMarkers**](doc//AssetApi.md#getmapmarkers) | **GET** /asset/map-marker |
*AssetApi* | [**getMemoryLane**](doc//AssetApi.md#getmemorylane) | **GET** /asset/memory-lane |
*AssetApi* | [**getRandom**](doc//AssetApi.md#getrandom) | **GET** /asset/random |
*AssetApi* | [**getTimeBuckets**](doc//AssetApi.md#gettimebuckets) | **GET** /asset/time-buckets |
*AssetApi* | [**getUserAssetsByDeviceId**](doc//AssetApi.md#getuserassetsbydeviceid) | **GET** /asset/{deviceId} |
*AssetApi* | [**importFile**](doc//AssetApi.md#importfile) | **POST** /asset/import |
@ -234,6 +235,7 @@ Class | Method | HTTP request | Description
- [CheckDuplicateAssetResponseDto](doc//CheckDuplicateAssetResponseDto.md)
- [CheckExistingAssetsDto](doc//CheckExistingAssetsDto.md)
- [CheckExistingAssetsResponseDto](doc//CheckExistingAssetsResponseDto.md)
- [CitiesFile](doc//CitiesFile.md)
- [ClassificationConfig](doc//ClassificationConfig.md)
- [Colorspace](doc//Colorspace.md)
- [CreateAlbumDto](doc//CreateAlbumDto.md)
@ -313,6 +315,7 @@ Class | Method | HTTP request | Description
- [SystemConfigMapDto](doc//SystemConfigMapDto.md)
- [SystemConfigOAuthDto](doc//SystemConfigOAuthDto.md)
- [SystemConfigPasswordLoginDto](doc//SystemConfigPasswordLoginDto.md)
- [SystemConfigReverseGeocodingDto](doc//SystemConfigReverseGeocodingDto.md)
- [SystemConfigStorageTemplateDto](doc//SystemConfigStorageTemplateDto.md)
- [SystemConfigTemplateStorageOptionDto](doc//SystemConfigTemplateStorageOptionDto.md)
- [SystemConfigThumbnailDto](doc//SystemConfigThumbnailDto.md)

View file

@ -10,7 +10,9 @@ Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**asset** | [**AssetEntity**](AssetEntity.md) | | [optional]
**assetId** | **String** | |
**bitsPerSample** | **num** | |
**city** | **String** | |
**colorspace** | **String** | |
**country** | **String** | |
**dateTimeOriginal** | [**DateTime**](DateTime.md) | |
**description** | **String** | General info |
@ -31,6 +33,7 @@ Name | Type | Description | Notes
**model** | **String** | |
**modifyDate** | [**DateTime**](DateTime.md) | |
**orientation** | **String** | |
**profileDescription** | **String** | |
**projectionType** | **String** | |
**state** | **String** | |
**timeZone** | **String** | |

View file

@ -85,6 +85,7 @@ part 'model/check_duplicate_asset_dto.dart';
part 'model/check_duplicate_asset_response_dto.dart';
part 'model/check_existing_assets_dto.dart';
part 'model/check_existing_assets_response_dto.dart';
part 'model/cities_file.dart';
part 'model/classification_config.dart';
part 'model/colorspace.dart';
part 'model/create_album_dto.dart';
@ -164,6 +165,7 @@ part 'model/system_config_machine_learning_dto.dart';
part 'model/system_config_map_dto.dart';
part 'model/system_config_o_auth_dto.dart';
part 'model/system_config_password_login_dto.dart';
part 'model/system_config_reverse_geocoding_dto.dart';
part 'model/system_config_storage_template_dto.dart';
part 'model/system_config_template_storage_option_dto.dart';
part 'model/system_config_thumbnail_dto.dart';

View file

@ -261,6 +261,8 @@ class ApiClient {
return CheckExistingAssetsDto.fromJson(value);
case 'CheckExistingAssetsResponseDto':
return CheckExistingAssetsResponseDto.fromJson(value);
case 'CitiesFile':
return CitiesFileTypeTransformer().decode(value);
case 'ClassificationConfig':
return ClassificationConfig.fromJson(value);
case 'Colorspace':
@ -419,6 +421,8 @@ class ApiClient {
return SystemConfigOAuthDto.fromJson(value);
case 'SystemConfigPasswordLoginDto':
return SystemConfigPasswordLoginDto.fromJson(value);
case 'SystemConfigReverseGeocodingDto':
return SystemConfigReverseGeocodingDto.fromJson(value);
case 'SystemConfigStorageTemplateDto':
return SystemConfigStorageTemplateDto.fromJson(value);
case 'SystemConfigTemplateStorageOptionDto':

View file

@ -15,7 +15,9 @@ class ExifEntity {
ExifEntity({
this.asset,
required this.assetId,
required this.bitsPerSample,
required this.city,
required this.colorspace,
required this.country,
required this.dateTimeOriginal,
required this.description,
@ -36,6 +38,7 @@ class ExifEntity {
required this.model,
required this.modifyDate,
required this.orientation,
required this.profileDescription,
required this.projectionType,
required this.state,
required this.timeZone,
@ -51,8 +54,12 @@ class ExifEntity {
String assetId;
num? bitsPerSample;
String? city;
String? colorspace;
String? country;
DateTime? dateTimeOriginal;
@ -96,6 +103,8 @@ class ExifEntity {
String? orientation;
String? profileDescription;
String? projectionType;
String? state;
@ -106,7 +115,9 @@ class ExifEntity {
bool operator ==(Object other) => identical(this, other) || other is ExifEntity &&
other.asset == asset &&
other.assetId == assetId &&
other.bitsPerSample == bitsPerSample &&
other.city == city &&
other.colorspace == colorspace &&
other.country == country &&
other.dateTimeOriginal == dateTimeOriginal &&
other.description == description &&
@ -127,6 +138,7 @@ class ExifEntity {
other.model == model &&
other.modifyDate == modifyDate &&
other.orientation == orientation &&
other.profileDescription == profileDescription &&
other.projectionType == projectionType &&
other.state == state &&
other.timeZone == timeZone;
@ -136,7 +148,9 @@ class ExifEntity {
// ignore: unnecessary_parenthesis
(asset == null ? 0 : asset!.hashCode) +
(assetId.hashCode) +
(bitsPerSample == null ? 0 : bitsPerSample!.hashCode) +
(city == null ? 0 : city!.hashCode) +
(colorspace == null ? 0 : colorspace!.hashCode) +
(country == null ? 0 : country!.hashCode) +
(dateTimeOriginal == null ? 0 : dateTimeOriginal!.hashCode) +
(description.hashCode) +
@ -157,12 +171,13 @@ class ExifEntity {
(model == null ? 0 : model!.hashCode) +
(modifyDate == null ? 0 : modifyDate!.hashCode) +
(orientation == null ? 0 : orientation!.hashCode) +
(profileDescription == null ? 0 : profileDescription!.hashCode) +
(projectionType == null ? 0 : projectionType!.hashCode) +
(state == null ? 0 : state!.hashCode) +
(timeZone == null ? 0 : timeZone!.hashCode);
@override
String toString() => 'ExifEntity[asset=$asset, assetId=$assetId, city=$city, country=$country, dateTimeOriginal=$dateTimeOriginal, description=$description, exifImageHeight=$exifImageHeight, exifImageWidth=$exifImageWidth, exifTextSearchableColumn=$exifTextSearchableColumn, exposureTime=$exposureTime, fNumber=$fNumber, fileSizeInByte=$fileSizeInByte, focalLength=$focalLength, fps=$fps, iso=$iso, latitude=$latitude, lensModel=$lensModel, livePhotoCID=$livePhotoCID, longitude=$longitude, make=$make, model=$model, modifyDate=$modifyDate, orientation=$orientation, projectionType=$projectionType, state=$state, timeZone=$timeZone]';
String toString() => 'ExifEntity[asset=$asset, assetId=$assetId, bitsPerSample=$bitsPerSample, city=$city, colorspace=$colorspace, country=$country, dateTimeOriginal=$dateTimeOriginal, description=$description, exifImageHeight=$exifImageHeight, exifImageWidth=$exifImageWidth, exifTextSearchableColumn=$exifTextSearchableColumn, exposureTime=$exposureTime, fNumber=$fNumber, fileSizeInByte=$fileSizeInByte, focalLength=$focalLength, fps=$fps, iso=$iso, latitude=$latitude, lensModel=$lensModel, livePhotoCID=$livePhotoCID, longitude=$longitude, make=$make, model=$model, modifyDate=$modifyDate, orientation=$orientation, profileDescription=$profileDescription, projectionType=$projectionType, state=$state, timeZone=$timeZone]';
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
@ -172,11 +187,21 @@ class ExifEntity {
// json[r'asset'] = null;
}
json[r'assetId'] = this.assetId;
if (this.bitsPerSample != null) {
json[r'bitsPerSample'] = this.bitsPerSample;
} else {
// json[r'bitsPerSample'] = null;
}
if (this.city != null) {
json[r'city'] = this.city;
} else {
// json[r'city'] = null;
}
if (this.colorspace != null) {
json[r'colorspace'] = this.colorspace;
} else {
// json[r'colorspace'] = null;
}
if (this.country != null) {
json[r'country'] = this.country;
} else {
@ -269,6 +294,11 @@ class ExifEntity {
} else {
// json[r'orientation'] = null;
}
if (this.profileDescription != null) {
json[r'profileDescription'] = this.profileDescription;
} else {
// json[r'profileDescription'] = null;
}
if (this.projectionType != null) {
json[r'projectionType'] = this.projectionType;
} else {
@ -297,7 +327,11 @@ class ExifEntity {
return ExifEntity(
asset: AssetEntity.fromJson(json[r'asset']),
assetId: mapValueOfType<String>(json, r'assetId')!,
bitsPerSample: json[r'bitsPerSample'] == null
? null
: num.parse(json[r'bitsPerSample'].toString()),
city: mapValueOfType<String>(json, r'city'),
colorspace: mapValueOfType<String>(json, r'colorspace'),
country: mapValueOfType<String>(json, r'country'),
dateTimeOriginal: mapDateTime(json, r'dateTimeOriginal', ''),
description: mapValueOfType<String>(json, r'description')!,
@ -336,6 +370,7 @@ class ExifEntity {
model: mapValueOfType<String>(json, r'model'),
modifyDate: mapDateTime(json, r'modifyDate', ''),
orientation: mapValueOfType<String>(json, r'orientation'),
profileDescription: mapValueOfType<String>(json, r'profileDescription'),
projectionType: mapValueOfType<String>(json, r'projectionType'),
state: mapValueOfType<String>(json, r'state'),
timeZone: mapValueOfType<String>(json, r'timeZone'),
@ -387,7 +422,9 @@ class ExifEntity {
/// The list of required keys that must be present in a JSON.
static const requiredKeys = <String>{
'assetId',
'bitsPerSample',
'city',
'colorspace',
'country',
'dateTimeOriginal',
'description',
@ -407,6 +444,7 @@ class ExifEntity {
'model',
'modifyDate',
'orientation',
'profileDescription',
'projectionType',
'state',
'timeZone',

View file

@ -26,11 +26,21 @@ void main() {
// TODO
});
// num bitsPerSample
test('to test the property `bitsPerSample`', () async {
// TODO
});
// String city
test('to test the property `city`', () async {
// TODO
});
// String colorspace
test('to test the property `colorspace`', () async {
// TODO
});
// String country
test('to test the property `country`', () async {
// TODO
@ -134,6 +144,11 @@ void main() {
// TODO
});
// String profileDescription
test('to test the property `profileDescription`', () async {
// TODO
});
// String projectionType
test('to test the property `projectionType`', () async {
// TODO

View file

@ -6804,10 +6804,18 @@
"assetId": {
"type": "string"
},
"bitsPerSample": {
"nullable": true,
"type": "number"
},
"city": {
"nullable": true,
"type": "string"
},
"colorspace": {
"nullable": true,
"type": "string"
},
"country": {
"nullable": true,
"type": "string"
@ -6891,6 +6899,10 @@
"nullable": true,
"type": "string"
},
"profileDescription": {
"nullable": true,
"type": "string"
},
"projectionType": {
"nullable": true,
"type": "string"
@ -6928,6 +6940,9 @@
"focalLength",
"iso",
"exposureTime",
"profileDescription",
"colorspace",
"bitsPerSample",
"exifTextSearchableColumn"
],
"type": "object"

View file

@ -198,7 +198,7 @@ export class PersonService {
async getFaceEntity(authUser: AuthUserDto, personId: string, assetId: string): Promise<AssetFaceEntity> {
await this.access.requirePermission(authUser, Permission.PERSON_READ, personId);
const face = await this.repository.getFaceById({ personId, assetId });
const [face] = await this.repository.getFacesByIds([{ personId, assetId }]);
if (!face) {
throw new BadRequestException('Invalid assetId for feature face');
}
@ -217,7 +217,7 @@ export class PersonService {
id: newPerson.id,
faceAssetId: data.assetId,
});
const face = await this.repository.getFaceById({ personId: newPerson.id, assetId: data.assetId });
const [face] = await this.repository.getFacesByIds([{ personId: newPerson.id, assetId: data.assetId }]);
const oldPerson = await this.findOrFail(data.personId);
if (oldPerson.faceAssetId === face?.assetId) {
//TODO: create a new feature photo
@ -227,18 +227,9 @@ export class PersonService {
}
if (!hasGeneratedFaceThumbnail) {
await this.jobRepository.queue({
name: JobName.GENERATE_FACE_THUMBNAIL,
name: JobName.GENERATE_PERSON_THUMBNAIL,
data: {
personId: newPerson.id,
assetId: data.assetId,
boundingBox: {
x1: face.boundingBoxX1,
x2: face.boundingBoxX2,
y1: face.boundingBoxY1,
y2: face.boundingBoxY2,
},
imageHeight: face.imageHeight,
imageWidth: face.imageWidth,
id: newPerson.id,
},
});
hasGeneratedFaceThumbnail = true;
@ -258,7 +249,7 @@ export class PersonService {
for (const data of dto.data) {
try {
const face = await this.repository.getFaceById({ personId: data.personId, assetId: data.assetId });
const [face] = await this.repository.getFacesByIds([{ personId: data.personId, assetId: data.assetId }]);
const oldPerson = await this.findOrFail(data.personId);
if (oldPerson.faceAssetId === face?.assetId) {
//TODO: create a new feature photo
@ -271,6 +262,7 @@ export class PersonService {
}
}
return result;
}
async handleRecognizeFaces({ id }: IEntityJob) {
const { machineLearning } = await this.configCore.getConfig();
if (!machineLearning.enabled || !machineLearning.facialRecognition.enabled) {

View file

@ -4,7 +4,7 @@
* Immich
* Immich API
*
* The version of the OpenAPI document: 1.78.1
* The version of the OpenAPI document: 1.81.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
@ -392,6 +392,12 @@ export interface AllJobStatusResponseDto {
* @memberof AllJobStatusResponseDto
*/
'metadataExtraction': JobStatusDto;
/**
*
* @type {JobStatusDto}
* @memberof AllJobStatusResponseDto
*/
'migration': JobStatusDto;
/**
*
* @type {JobStatusDto}
@ -1466,6 +1472,22 @@ export interface CheckExistingAssetsResponseDto {
*/
'existingIds': Array<string>;
}
/**
*
* @export
* @enum {string}
*/
export const CitiesFile = {
Cities15000: 'cities15000',
Cities5000: 'cities5000',
Cities1000: 'cities1000',
Cities500: 'cities500'
} as const;
export type CitiesFile = typeof CitiesFile[keyof typeof CitiesFile];
/**
*
* @export
@ -1895,12 +1917,24 @@ export interface ExifEntity {
* @memberof ExifEntity
*/
'assetId': string;
/**
*
* @type {number}
* @memberof ExifEntity
*/
'bitsPerSample': number | null;
/**
*
* @type {string}
* @memberof ExifEntity
*/
'city': string | null;
/**
*
* @type {string}
* @memberof ExifEntity
*/
'colorspace': string | null;
/**
*
* @type {string}
@ -2021,6 +2055,12 @@ export interface ExifEntity {
* @memberof ExifEntity
*/
'orientation': string | null;
/**
*
* @type {string}
* @memberof ExifEntity
*/
'profileDescription': string | null;
/**
*
* @type {string}
@ -2359,6 +2399,7 @@ export const JobName = {
ClipEncoding: 'clipEncoding',
BackgroundTask: 'backgroundTask',
StorageTemplateMigration: 'storageTemplateMigration',
Migration: 'migration',
Search: 'search',
Sidecar: 'sidecar',
Library: 'library'
@ -3395,6 +3436,12 @@ export interface ServerFeaturesDto {
* @memberof ServerFeaturesDto
*/
'passwordLogin': boolean;
/**
*
* @type {boolean}
* @memberof ServerFeaturesDto
*/
'reverseGeocoding': boolean;
/**
*
* @type {boolean}
@ -3974,6 +4021,12 @@ export interface SystemConfigDto {
* @memberof SystemConfigDto
*/
'passwordLogin': SystemConfigPasswordLoginDto;
/**
*
* @type {SystemConfigReverseGeocodingDto}
* @memberof SystemConfigDto
*/
'reverseGeocoding': SystemConfigReverseGeocodingDto;
/**
*
* @type {SystemConfigStorageTemplateDto}
@ -4128,6 +4181,12 @@ export interface SystemConfigJobDto {
* @memberof SystemConfigJobDto
*/
'metadataExtraction': JobSettingsDto;
/**
*
* @type {JobSettingsDto}
* @memberof SystemConfigJobDto
*/
'migration': JobSettingsDto;
/**
*
* @type {JobSettingsDto}
@ -4313,6 +4372,27 @@ export interface SystemConfigPasswordLoginDto {
*/
'enabled': boolean;
}
/**
*
* @export
* @interface SystemConfigReverseGeocodingDto
*/
export interface SystemConfigReverseGeocodingDto {
/**
*
* @type {CitiesFile}
* @memberof SystemConfigReverseGeocodingDto
*/
'citiesFileOverride': CitiesFile;
/**
*
* @type {boolean}
* @memberof SystemConfigReverseGeocodingDto
*/
'enabled': boolean;
}
/**
*
* @export
@ -4368,6 +4448,12 @@ export interface SystemConfigTemplateStorageOptionDto {
* @memberof SystemConfigTemplateStorageOptionDto
*/
'secondOptions': Array<string>;
/**
*
* @type {Array<string>}
* @memberof SystemConfigTemplateStorageOptionDto
*/
'weekOptions': Array<string>;
/**
*
* @type {Array<string>}
@ -7358,6 +7444,49 @@ export const AssetApiAxiosParamCreator = function (configuration?: Configuration
setSearchParams(localVarUrlObj, localVarQueryParameter);
let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
return {
url: toPathString(localVarUrlObj),
options: localVarRequestOptions,
};
},
/**
*
* @param {number} [count]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
getRandom: async (count?: number, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
const localVarPath = `/asset/random`;
// use dummy base URL string because the URL constructor only accepts absolute URLs.
const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
let baseOptions;
if (configuration) {
baseOptions = configuration.baseOptions;
}
const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options};
const localVarHeaderParameter = {} as any;
const localVarQueryParameter = {} as any;
// authentication cookie required
// authentication api_key required
await setApiKeyToObject(localVarHeaderParameter, "x-api-key", configuration)
// authentication bearer required
// http bearer authentication required
await setBearerAuthToObject(localVarHeaderParameter, configuration)
if (count !== undefined) {
localVarQueryParameter['count'] = count;
}
setSearchParams(localVarUrlObj, localVarQueryParameter);
let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
@ -8098,6 +8227,16 @@ export const AssetApiFp = function(configuration?: Configuration) {
const localVarAxiosArgs = await localVarAxiosParamCreator.getMemoryLane(timestamp, options);
return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration);
},
/**
*
* @param {number} [count]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
async getRandom(count?: number, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<Array<AssetResponseDto>>> {
const localVarAxiosArgs = await localVarAxiosParamCreator.getRandom(count, options);
return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration);
},
/**
*
* @param {TimeBucketSize} size
@ -8373,6 +8512,15 @@ export const AssetApiFactory = function (configuration?: Configuration, basePath
getMemoryLane(requestParameters: AssetApiGetMemoryLaneRequest, options?: AxiosRequestConfig): AxiosPromise<Array<MemoryLaneResponseDto>> {
return localVarFp.getMemoryLane(requestParameters.timestamp, options).then((request) => request(axios, basePath));
},
/**
*
* @param {AssetApiGetRandomRequest} requestParameters Request parameters.
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
getRandom(requestParameters: AssetApiGetRandomRequest = {}, options?: AxiosRequestConfig): AxiosPromise<Array<AssetResponseDto>> {
return localVarFp.getRandom(requestParameters.count, options).then((request) => request(axios, basePath));
},
/**
*
* @param {AssetApiGetTimeBucketsRequest} requestParameters Request parameters.
@ -8807,6 +8955,20 @@ export interface AssetApiGetMemoryLaneRequest {
readonly timestamp: string
}
/**
* Request parameters for getRandom operation in AssetApi.
* @export
* @interface AssetApiGetRandomRequest
*/
export interface AssetApiGetRandomRequest {
/**
*
* @type {number}
* @memberof AssetApiGetRandom
*/
readonly count?: number
}
/**
* Request parameters for getTimeBuckets operation in AssetApi.
* @export
@ -9299,6 +9461,17 @@ export class AssetApi extends BaseAPI {
return AssetApiFp(this.configuration).getMemoryLane(requestParameters.timestamp, options).then((request) => request(this.axios, this.basePath));
}
/**
*
* @param {AssetApiGetRandomRequest} requestParameters Request parameters.
* @param {*} [options] Override http request option.
* @throws {RequiredError}
* @memberof AssetApi
*/
public getRandom(requestParameters: AssetApiGetRandomRequest = {}, options?: AxiosRequestConfig) {
return AssetApiFp(this.configuration).getRandom(requestParameters.count, options).then((request) => request(this.axios, this.basePath));
}
/**
*
* @param {AssetApiGetTimeBucketsRequest} requestParameters Request parameters.