diff --git a/packages/backend/src/apps/flickr/info.json b/packages/backend/src/apps/flickr/info.json index 195ca2f7..a524dc6b 100644 --- a/packages/backend/src/apps/flickr/info.json +++ b/packages/backend/src/apps/flickr/info.json @@ -270,6 +270,22 @@ "name": "Test trigger" } ] + }, + { + "name": "New photo", + "key": "newPhoto", + "interval": "15m", + "description": "Triggers when you add a new photo.", + "substeps": [ + { + "key": "chooseAccount", + "name": "Choose account" + }, + { + "key": "testStep", + "name": "Test trigger" + } + ] } ] } diff --git a/packages/backend/src/apps/flickr/triggers.ts b/packages/backend/src/apps/flickr/triggers.ts index d73f90f4..88268827 100644 --- a/packages/backend/src/apps/flickr/triggers.ts +++ b/packages/backend/src/apps/flickr/triggers.ts @@ -1,13 +1,16 @@ import { IJSONObject } from '@automatisch/types'; import FavoritePhoto from './triggers/favorite-photo'; import NewPhotoInAlbum from './triggers/new-photo-in-album'; +import NewPhoto from './triggers/new-photo'; export default class Triggers { favoritePhoto: FavoritePhoto; newPhotoInAlbum: NewPhotoInAlbum; + newPhoto: NewPhoto; constructor(connectionData: IJSONObject, parameters: IJSONObject) { this.favoritePhoto = new FavoritePhoto(connectionData); this.newPhotoInAlbum = new NewPhotoInAlbum(connectionData, parameters); + this.newPhoto = new NewPhoto(connectionData); } } diff --git a/packages/backend/src/apps/flickr/triggers/new-photo-in-album.ts b/packages/backend/src/apps/flickr/triggers/new-photo-in-album.ts index 3454777d..01f90659 100644 --- a/packages/backend/src/apps/flickr/triggers/new-photo-in-album.ts +++ b/packages/backend/src/apps/flickr/triggers/new-photo-in-album.ts @@ -1,4 +1,3 @@ -import { DateTime } from 'luxon'; import FlickrApi from 'flickr-sdk'; import { IJSONObject } from '@automatisch/types'; diff --git a/packages/backend/src/apps/flickr/triggers/new-photo.ts b/packages/backend/src/apps/flickr/triggers/new-photo.ts new file mode 100644 index 00000000..de630e6f --- /dev/null +++ b/packages/backend/src/apps/flickr/triggers/new-photo.ts @@ -0,0 +1,88 @@ +import { DateTime } from 'luxon'; +import FlickrApi from 'flickr-sdk'; +import { IJSONObject } from '@automatisch/types'; + +export default class NewPhoto { + client?: typeof FlickrApi; + connectionData?: IJSONObject; + extraFields = [ + 'description', + 'license', + 'date_upload', + 'date_taken', + 'owner_name', + 'icon_server', + 'original_format', + 'last_update', + 'geo', + 'tags', + 'machine_tags', + 'o_dims', + 'views', + 'media', + 'path_alias', + 'url_sq', + 'url_t', + 'url_s', + 'url_q', + 'url_m', + 'url_n', + 'url_z', + 'url_c', + 'url_l', + 'url_o', + ].join(','); + + constructor(connectionData: IJSONObject) { + if ( + connectionData.consumerKey && + connectionData.consumerSecret && + connectionData.accessToken && + connectionData.accessSecret + ) { + this.client = new FlickrApi( + FlickrApi.OAuth.createPlugin( + connectionData.consumerKey, + connectionData.consumerSecret, + connectionData.accessToken, + connectionData.accessSecret + ) + ); + + this.connectionData = connectionData; + } + } + + async getPhotos(options: { perPage?: number, page?: number, minUploadDate?: string } = {}) { + const { perPage, page, minUploadDate } = options; + const payload = { + page, + per_page: perPage, + user_id: this.connectionData.userId, + extras: this.extraFields, + min_upload_date: minUploadDate, + }; + const { photos } = (await this.client.photos.search(payload)).body; + + return photos; + } + + async run(startTime: Date) { + const minUploadDate = DateTime.fromJSDate(startTime).toSeconds().toString(); + const photos = await this.getPhotos({ page: 1, minUploadDate }); + const allPhotos = [...photos.photo]; + + for (let page = photos.page + 1; page <= photos.pages; page++) { + const photos = (await this.getPhotos({ page, minUploadDate })); + allPhotos.push(...photos.photo); + } + + return allPhotos; + } + + async testRun(startTime: Date) { + const { photo } = await this.getPhotos({ perPage: 1 }); + + return photo; + } +}