Browse Source

feat(server): Add week numbers for templating (#4263)

* add week numbers as template option

* generate api

* fix tests

* change example date to show week padding

* change example date to immich birthday
Daniel Dietzler 1 year ago
parent
commit
521436dd21

+ 6 - 0
cli/src/api/open-api/api.ts

@@ -3542,6 +3542,12 @@ export interface SystemConfigTemplateStorageOptionDto {
      * @memberof SystemConfigTemplateStorageOptionDto
      */
     'secondOptions': Array<string>;
+    /**
+     * 
+     * @type {Array<string>}
+     * @memberof SystemConfigTemplateStorageOptionDto
+     */
+    'weekOptions': Array<string>;
     /**
      * 
      * @type {Array<string>}

+ 1 - 0
mobile/openapi/doc/SystemConfigTemplateStorageOptionDto.md

@@ -14,6 +14,7 @@ Name | Type | Description | Notes
 **monthOptions** | **List<String>** |  | [default to const []]
 **presetOptions** | **List<String>** |  | [default to const []]
 **secondOptions** | **List<String>** |  | [default to const []]
+**weekOptions** | **List<String>** |  | [default to const []]
 **yearOptions** | **List<String>** |  | [default to const []]
 
 [[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

+ 11 - 1
mobile/openapi/lib/model/system_config_template_storage_option_dto.dart

@@ -19,6 +19,7 @@ class SystemConfigTemplateStorageOptionDto {
     this.monthOptions = const [],
     this.presetOptions = const [],
     this.secondOptions = const [],
+    this.weekOptions = const [],
     this.yearOptions = const [],
   });
 
@@ -34,6 +35,8 @@ class SystemConfigTemplateStorageOptionDto {
 
   List<String> secondOptions;
 
+  List<String> weekOptions;
+
   List<String> yearOptions;
 
   @override
@@ -44,6 +47,7 @@ class SystemConfigTemplateStorageOptionDto {
      other.monthOptions == monthOptions &&
      other.presetOptions == presetOptions &&
      other.secondOptions == secondOptions &&
+     other.weekOptions == weekOptions &&
      other.yearOptions == yearOptions;
 
   @override
@@ -55,10 +59,11 @@ class SystemConfigTemplateStorageOptionDto {
     (monthOptions.hashCode) +
     (presetOptions.hashCode) +
     (secondOptions.hashCode) +
+    (weekOptions.hashCode) +
     (yearOptions.hashCode);
 
   @override
-  String toString() => 'SystemConfigTemplateStorageOptionDto[dayOptions=$dayOptions, hourOptions=$hourOptions, minuteOptions=$minuteOptions, monthOptions=$monthOptions, presetOptions=$presetOptions, secondOptions=$secondOptions, yearOptions=$yearOptions]';
+  String toString() => 'SystemConfigTemplateStorageOptionDto[dayOptions=$dayOptions, hourOptions=$hourOptions, minuteOptions=$minuteOptions, monthOptions=$monthOptions, presetOptions=$presetOptions, secondOptions=$secondOptions, weekOptions=$weekOptions, yearOptions=$yearOptions]';
 
   Map<String, dynamic> toJson() {
     final json = <String, dynamic>{};
@@ -68,6 +73,7 @@ class SystemConfigTemplateStorageOptionDto {
       json[r'monthOptions'] = this.monthOptions;
       json[r'presetOptions'] = this.presetOptions;
       json[r'secondOptions'] = this.secondOptions;
+      json[r'weekOptions'] = this.weekOptions;
       json[r'yearOptions'] = this.yearOptions;
     return json;
   }
@@ -98,6 +104,9 @@ class SystemConfigTemplateStorageOptionDto {
         secondOptions: json[r'secondOptions'] is List
             ? (json[r'secondOptions'] as List).cast<String>()
             : const [],
+        weekOptions: json[r'weekOptions'] is List
+            ? (json[r'weekOptions'] as List).cast<String>()
+            : const [],
         yearOptions: json[r'yearOptions'] is List
             ? (json[r'yearOptions'] as List).cast<String>()
             : const [],
@@ -154,6 +163,7 @@ class SystemConfigTemplateStorageOptionDto {
     'monthOptions',
     'presetOptions',
     'secondOptions',
+    'weekOptions',
     'yearOptions',
   };
 }

+ 5 - 0
mobile/openapi/test/system_config_template_storage_option_dto_test.dart

@@ -46,6 +46,11 @@ void main() {
       // TODO
     });
 
+    // List<String> weekOptions (default value: const [])
+    test('to test the property `weekOptions`', () async {
+      // TODO
+    });
+
     // List<String> yearOptions (default value: const [])
     test('to test the property `yearOptions`', () async {
       // TODO

+ 7 - 0
server/immich-openapi-specs.json

@@ -7924,6 +7924,12 @@
             },
             "type": "array"
           },
+          "weekOptions": {
+            "items": {
+              "type": "string"
+            },
+            "type": "array"
+          },
           "yearOptions": {
             "items": {
               "type": "string"
@@ -7934,6 +7940,7 @@
         "required": [
           "yearOptions",
           "monthOptions",
+          "weekOptions",
           "dayOptions",
           "hourOptions",
           "minuteOptions",

+ 2 - 0
server/src/domain/storage-template/storage-template.service.ts

@@ -16,6 +16,7 @@ import {
   supportedMinuteTokens,
   supportedMonthTokens,
   supportedSecondTokens,
+  supportedWeekTokens,
   supportedYearTokens,
 } from '../system-config';
 import { SystemConfigCore } from '../system-config/system-config.core';
@@ -239,6 +240,7 @@ export class StorageTemplateService {
     const dateTokens = [
       ...supportedYearTokens,
       ...supportedMonthTokens,
+      ...supportedWeekTokens,
       ...supportedDayTokens,
       ...supportedHourTokens,
       ...supportedMinuteTokens,

+ 1 - 0
server/src/domain/system-config/response-dto/system-config-template-storage-option.dto.ts

@@ -1,6 +1,7 @@
 export class SystemConfigTemplateStorageOptionDto {
   yearOptions!: string[];
   monthOptions!: string[];
+  weekOptions!: string[];
   dayOptions!: string[];
   hourOptions!: string[];
   minuteOptions!: string[];

+ 2 - 0
server/src/domain/system-config/system-config.constants.ts

@@ -1,5 +1,6 @@
 export const supportedYearTokens = ['y', 'yy'];
 export const supportedMonthTokens = ['M', 'MM', 'MMM', 'MMMM'];
+export const supportedWeekTokens = ['W', 'WW'];
 export const supportedDayTokens = ['d', 'dd'];
 export const supportedHourTokens = ['h', 'hh', 'H', 'HH'];
 export const supportedMinuteTokens = ['m', 'mm'];
@@ -18,6 +19,7 @@ export const supportedPresetTokens = [
   '{{y}}-{{MMM}}-{{dd}}/{{filename}}',
   '{{y}}-{{MMMM}}-{{dd}}/{{filename}}',
   '{{y}}/{{y}}-{{MM}}/{{filename}}',
+  '{{y}}/{{y}}-{{WW}}/{{filename}}',
 ];
 
 export const INITIAL_SYSTEM_CONFIG = 'INITIAL_SYSTEM_CONFIG';

+ 2 - 0
server/src/domain/system-config/system-config.service.spec.ts

@@ -221,8 +221,10 @@ describe(SystemConfigService.name, () => {
           '{{y}}-{{MMM}}-{{dd}}/{{filename}}',
           '{{y}}-{{MMMM}}-{{dd}}/{{filename}}',
           '{{y}}/{{y}}-{{MM}}/{{filename}}',
+          '{{y}}/{{y}}-{{WW}}/{{filename}}',
         ],
         secondOptions: ['s', 'ss'],
+        weekOptions: ['W', 'WW'],
         yearOptions: ['y', 'yy'],
       });
     });

+ 2 - 0
server/src/domain/system-config/system-config.service.ts

@@ -10,6 +10,7 @@ import {
   supportedMonthTokens,
   supportedPresetTokens,
   supportedSecondTokens,
+  supportedWeekTokens,
   supportedYearTokens,
 } from './system-config.constants';
 import { SystemConfigCore, SystemConfigValidator } from './system-config.core';
@@ -57,6 +58,7 @@ export class SystemConfigService {
     const options = new SystemConfigTemplateStorageOptionDto();
 
     options.dayOptions = supportedDayTokens;
+    options.weekOptions = supportedWeekTokens;
     options.monthOptions = supportedMonthTokens;
     options.yearOptions = supportedYearTokens;
     options.hourOptions = supportedHourTokens;

+ 6 - 0
web/src/api/open-api/api.ts

@@ -3542,6 +3542,12 @@ export interface SystemConfigTemplateStorageOptionDto {
      * @memberof SystemConfigTemplateStorageOptionDto
      */
     'secondOptions': Array<string>;
+    /**
+     * 
+     * @type {Array<string>}
+     * @memberof SystemConfigTemplateStorageOptionDto
+     */
+    'weekOptions': Array<string>;
     /**
      * 
      * @type {Array<string>}

+ 2 - 1
web/src/lib/components/admin-page/settings/storage-template/storage-template-settings.svelte

@@ -58,11 +58,12 @@
       filetypefull: 'IMAGE',
     };
 
-    const dt = luxon.DateTime.fromISO(new Date('2022-09-04T20:03:05.250').toISOString());
+    const dt = luxon.DateTime.fromISO(new Date('2022-02-03T04:56:05.250').toISOString());
 
     const dateTokens = [
       ...templateOptions.yearOptions,
       ...templateOptions.monthOptions,
+      ...templateOptions.weekOptions,
       ...templateOptions.dayOptions,
       ...templateOptions.hourOptions,
       ...templateOptions.minuteOptions,

+ 11 - 2
web/src/lib/components/admin-page/settings/storage-template/supported-datetime-panel.svelte

@@ -16,9 +16,9 @@
 <div class="mt-2 rounded-lg bg-gray-200 p-4 text-xs dark:bg-gray-700 dark:text-immich-dark-fg">
   <div class="mb-2 text-gray-600 dark:text-immich-dark-fg">
     <p>Asset's creation timestamp is used for the datetime information</p>
-    <p>Sample time 2022-09-04T20:03:05.250</p>
+    <p>Sample time 2022-02-03T04:56:05.250</p>
   </div>
-  <div class="flex gap-[50px]">
+  <div class="flex gap-[40px]">
     <div>
       <p class="font-medium text-immich-primary dark:text-immich-dark-primary">YEAR</p>
       <ul>
@@ -37,6 +37,15 @@
       </ul>
     </div>
 
+    <div>
+      <p class="font-medium text-immich-primary dark:text-immich-dark-primary">WEEK</p>
+      <ul>
+        {#each options.weekOptions as weekFormat}
+          <li>{'{{'}{weekFormat}{'}}'} - {getLuxonExample(weekFormat)}</li>
+        {/each}
+      </ul>
+    </div>
+
     <div>
       <p class="font-medium text-immich-primary dark:text-immich-dark-primary">DAY</p>
       <ul>