+
+ /**
+ * Upload a user avatar
+ *
+ * @param int $uid User ID
+ * @param array $files uploaded file array
+ * @param string $url External image url
+ * @return string avatar resource
+ */
+ public static function uploadAvatar(int $uid, array $files, string $url = ''): string
+ {
+ if (!empty($files)) {
+ $data = self::uploadImage($files);
+ if (empty($data)) {
+ Logger::info('upload failed');
+ return '';
+ }
+ } elseif (!empty($url)) {
+ $data = self::loadImageFromURL($url);
+ if (empty($data)) {
+ Logger::info('loading from external url failed');
+ return '';
+ }
+ } else {
+ Logger::info('Neither files nor url provided');
+ return '';
+ }
+
+ $Image = $data['image'];
+ $filename = $data['filename'];
+ $width = $Image->getWidth();
+ $height = $Image->getHeight();
+
+ $resource_id = self::newResource();
+ $album = DI::l10n()->t(self::PROFILE_PHOTOS);
+
+ // upload profile image (scales 4, 5, 6)
+ logger::info('starting new profile image upload');
+
+ if ($width > 300 || $height > 300) {
+ $Image->scaleDown(300);
+ }
+
+ $r = self::store($Image, $uid, 0, $resource_id, $filename, $album, 4, self::USER_AVATAR);
+ if (!$r) {
+ logger::notice('profile image upload with scale 4 (300) failed');
+ }
+
+ if ($width > 80 || $height > 80) {
+ $Image->scaleDown(80);
+ }
+
+ $r = self::store($Image, $uid, 0, $resource_id, $filename, $album, 5, self::USER_AVATAR);
+ if (!$r) {
+ logger::notice('profile image upload with scale 5 (80) failed');
+ }
+
+ if ($width > 48 || $height > 48) {
+ $Image->scaleDown(48);
+ }
+
+ $r = self::store($Image, $uid, 0, $resource_id, $filename, $album, 6, self::USER_AVATAR);
+ if (!$r) {
+ logger::notice('profile image upload with scale 6 (48) failed');
+ }
+
+ logger::info('new profile image upload ended');
+
+ $condition = ["`profile` AND `resource-id` != ? AND `uid` = ?", $resource_id, $uid];
+ self::update(['profile' => false, 'photo-type' => self::DEFAULT], $condition);
+
+ Contact::updateSelfFromUserID($uid, true);
+
+ // Update global directory in background
+ Profile::publishUpdate($uid);
+
+ return $resource_id;
+ }
+
+ /**
+ * Upload a user banner
+ *
+ * @param int $uid User ID
+ * @param array $files uploaded file array
+ * @param string $url External image url
+ * @return string avatar resource
+ */
+ public static function uploadBanner(int $uid, array $files = [], string $url = ''): string
+ {
+ if (!empty($files)) {
+ $data = self::uploadImage($files);
+ if (empty($data)) {
+ Logger::info('upload failed');
+ return '';
+ }
+ } elseif (!empty($url)) {
+ $data = self::loadImageFromURL($url);
+ if (empty($data)) {
+ Logger::info('loading from external url failed');
+ return '';
+ }
+ } else {
+ Logger::info('Neither files nor url provided');
+ return '';
+ }
+
+ $Image = $data['image'];
+ $filename = $data['filename'];
+ $width = $Image->getWidth();
+ $height = $Image->getHeight();
+
+ $resource_id = self::newResource();
+ $album = DI::l10n()->t(self::BANNER_PHOTOS);
+
+ if ($width > 960) {
+ $Image->scaleDown(960);
+ }
+
+ $r = self::store($Image, $uid, 0, $resource_id, $filename, $album, 3, self::USER_BANNER);
+ if (!$r) {
+ logger::notice('profile banner upload with scale 3 (960) failed');
+ }
+
+ logger::info('new profile banner upload ended');
+
+ $condition = ["`photo-type` = ? AND `resource-id` != ? AND `uid` = ?", self::USER_BANNER, $resource_id, $uid];
+ self::update(['photo-type' => self::DEFAULT], $condition);
+
+ Contact::updateSelfFromUserID($uid, true);
+
+ // Update global directory in background
+ Profile::publishUpdate($uid);
+
+ return $resource_id;
+ }