+ /**
+ * Ensure that cached avatar exist
+ *
+ * @param integer $cid
+ */
+ public static function checkAvatarCache(int $cid)
+ {
+ $contact = DBA::selectFirst('contact', ['url', 'avatar', 'photo', 'thumb', 'micro'], ['id' => $cid, 'uid' => 0, 'self' => false]);
+ if (!DBA::isResult($contact)) {
+ return;
+ }
+
+ if (empty($contact['avatar']) || (!empty($contact['photo']) && !empty($contact['thumb']) && !empty($contact['micro']))) {
+ return;
+ }
+
+ Logger::info('Adding avatar cache', ['id' => $cid, 'contact' => $contact]);
+
+ self::updateAvatar($cid, $contact['avatar'], true);
+ }
+
+ /**
+ * Return the photo path for a given contact array in the given size
+ *
+ * @param array $contact contact array
+ * @param string $field Fieldname of the photo in the contact array
+ * @param string $default Default path when no picture had been found
+ * @param string $size Size of the avatar picture
+ * @param string $avatar Avatar path that is displayed when no photo had been found
+ * @return string photo path
+ */
+ private static function getAvatarPath(array $contact, string $field, string $default, string $size, string $avatar)
+ {
+ if (!empty($contact)) {
+ $contact = self::checkAvatarCacheByArray($contact);
+ if (!empty($contact[$field])) {
+ $avatar = $contact[$field];
+ }
+ }
+
+ if (empty($avatar)) {
+ return $default;
+ }
+
+ if (Proxy::isLocalImage($avatar)) {
+ return $avatar;
+ } else {
+ return Proxy::proxifyUrl($avatar, false, $size);
+ }
+ }
+
+ /**
+ * Return the photo path for a given contact array
+ *
+ * @param array $contact Contact array
+ * @param string $avatar Avatar path that is displayed when no photo had been found
+ * @return string photo path
+ */
+ public static function getPhoto(array $contact, string $avatar = '')
+ {
+ return self::getAvatarPath($contact, 'photo', DI::baseUrl() . '/images/person-300.jpg', Proxy::SIZE_SMALL, $avatar);
+ }
+
+ /**
+ * Return the photo path (thumb size) for a given contact array
+ *
+ * @param array $contact Contact array
+ * @param string $avatar Avatar path that is displayed when no photo had been found
+ * @return string photo path
+ */
+ public static function getThumb(array $contact, string $avatar = '')
+ {
+ return self::getAvatarPath($contact, 'thumb', DI::baseUrl() . '/images/person-80.jpg', Proxy::SIZE_THUMB, $avatar);
+ }
+
+ /**
+ * Return the photo path (micro size) for a given contact array
+ *
+ * @param array $contact Contact array
+ * @param string $avatar Avatar path that is displayed when no photo had been found
+ * @return string photo path
+ */
+ public static function getMicro(array $contact, string $avatar = '')
+ {
+ return self::getAvatarPath($contact, 'micro', DI::baseUrl() . '/images/person-48.jpg', Proxy::SIZE_MICRO, $avatar);
+ }
+
+ /**
+ * Check the given contact array for avatar cache fields
+ *
+ * @param array $contact
+ * @return array contact array with avatar cache fields
+ */
+ private static function checkAvatarCacheByArray(array $contact)
+ {
+ $update = false;
+ $contact_fields = [];
+ $fields = ['photo', 'thumb', 'micro'];
+ foreach ($fields as $field) {
+ if (isset($contact[$field])) {
+ $contact_fields[] = $field;
+ }
+ if (isset($contact[$field]) && empty($contact[$field])) {
+ $update = true;
+ }
+ }
+
+ if (!$update) {
+ return $contact;
+ }
+
+ if (!empty($contact['id']) && !empty($contact['avatar'])) {
+ self::updateAvatar($contact['id'], $contact['avatar'], true);
+
+ $new_contact = self::getById($contact['id'], $contact_fields);
+ if (DBA::isResult($new_contact)) {
+ // We only update the cache fields
+ $contact = array_merge($contact, $new_contact);
+ }
+ }
+
+ /// add the default avatars if the fields aren't filled
+ if (isset($contact['photo']) && empty($contact['photo'])) {
+ $contact['photo'] = DI::baseUrl() . '/images/person-300.jpg';
+ }
+ if (isset($contact['thumb']) && empty($contact['thumb'])) {
+ $contact['thumb'] = DI::baseUrl() . '/images/person-80.jpg';
+ }
+ if (isset($contact['micro']) && empty($contact['micro'])) {
+ $contact['micro'] = DI::baseUrl() . '/images/person-48.jpg';
+ }
+
+ return $contact;
+ }
+