Преглед изворни кода

Merge pull request #599 from pixelfed/frontend-ui-refactor

Frontend ui refactor
daniel пре 6 година
родитељ
комит
090881829f

+ 165 - 0
app/Jobs/DeletePipeline/DeleteAccountPipeline.php

@@ -0,0 +1,165 @@
+<?php
+
+namespace App\Jobs\DeletePipeline;
+
+use Illuminate\Bus\Queueable;
+use Illuminate\Queue\SerializesModels;
+use Illuminate\Queue\InteractsWithQueue;
+use Illuminate\Contracts\Queue\ShouldQueue;
+use Illuminate\Foundation\Bus\Dispatchable;
+use App\{
+    AccountLog,
+    Activity,
+    Avatar,
+    Bookmark,
+    Collection,
+    DirectMessage,
+    EmailVerification,
+    Follower,
+    FollowRequest,
+    Hashtag,
+    Like,
+    Media,
+    Mention,
+    Notification,
+    Profile,
+    Report,
+    ReportComment,
+    ReportLog,
+    StatusHashtag,
+    Status,
+    User,
+    UserFilter,
+    UserSetting,
+};
+
+class DeleteAccountPipeline implements ShouldQueue
+{
+    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
+
+    protected $user;
+
+    /**
+     * Create a new job instance.
+     *
+     * @return void
+     */
+    public function __construct(User $user)
+    {
+        $this->user = $user;
+    }
+
+    /**
+     * Execute the job.
+     *
+     * @return void
+     */
+    public function handle()
+    {
+        $user = $this->user;
+        $this->deleteAccountLogs($user);
+        $this->deleteActivities($user);
+        $this->deleteAvatar($user);
+        $this->deleteBookmarks($user);
+        $this->deleteEmailVerification($user);
+        $this->deleteFollowRequests($user);
+        $this->deleteFollowers($user);
+        $this->deleteLikes($user);
+        $this->deleteMedia($user);
+        $this->deleteMentions($user);
+        $this->deleteNotifications($user);
+
+        // todo send Delete to every known instance sharedInbox   
+    }
+
+    public function deleteAccountLogs($user)
+    {
+        AccountLog::chunk(200, function($logs) use ($user) {
+            foreach($logs as $log) {
+                if($log->user_id == $user->id) {
+                    $log->delete();
+                }
+            }
+        });
+    }
+
+    public function deleteActivities($user)
+    {
+        // todo after AP
+    }
+
+    public function deleteAvatar($user)
+    {
+        $avatar = $user->profile->avatar;
+
+        if(is_file($avatar->media_path)) {
+            unlink($avatar->media_path);
+        }
+
+        if(is_file($avatar->thumb_path)) {
+            unlink($avatar->thumb_path);
+        }
+
+        $avatar->delete();
+    }
+
+    public function deleteBookmarks($user)
+    {
+        Bookmark::whereProfileId($user->profile->id)->delete();
+    }
+
+    public function deleteEmailVerification($user)
+    {
+        EmailVerification::whereUserId($user->id)->delete();
+    }
+
+    public function deleteFollowRequests($user)
+    {
+        $id = $user->profile->id;
+        FollowRequest::whereFollowingId($id)->orWhere('follower_id', $id)->delete();
+    }
+
+    public function deleteFollowers($user)
+    {
+        $id = $user->profile->id;
+        Follower::whereProfileId($id)->orWhere('following_id', $id)->delete();
+    }
+
+    public function deleteLikes($user)
+    {
+        $id = $user->profile->id;
+        Like::whereProfileId($id)->delete();
+    }
+
+    public function deleteMedia($user)
+    {
+        $medias = Media::whereUserId($user->id)->get();
+        foreach($medias as $media) {
+            $path = $media->media_path;
+            $thumb = $media->thumbnail_path;
+            if(is_file($path)) {
+                unlink($path);
+            }
+            if(is_file($thumb)) {
+                unlink($thumb);
+            }
+            $media->delete();
+        }
+    }
+
+    public function deleteMentions($user)
+    {
+        Mention::whereProfileId($user->profile->id)->delete();
+    }
+
+    public function deleteNotifications($user)
+    {
+        $id = $user->profile->id;
+        Notification::whereProfileId($id)->orWhere('actor_id', $id)->delete();
+    }
+
+    public function deleteProfile($user) {}
+    public function deleteReports($user) {}
+    public function deleteStatuses($user) {}
+    public function deleteUser($user) {}
+}

+ 1 - 1
app/Jobs/StatusPipeline/StatusEntityLexer.php

@@ -82,7 +82,7 @@ class StatusEntityLexer implements ShouldQueue
 
         foreach ($tags as $tag) {
             DB::transaction(function () use ($status, $tag) {
-                $slug = str_slug($tag);
+                $slug = str_slug($tag, '-', false);
                 $hashtag = Hashtag::firstOrCreate(
                     ['name' => $tag, 'slug' => $slug]
                 );

+ 0 - 1
composer.json

@@ -30,7 +30,6 @@
         "predis/predis": "^1.1",
         "spatie/laravel-backup": "^5.0.0",
         "spatie/laravel-image-optimizer": "^1.1",
-        "spatie/laravel-partialcache": "^1.3",
         "stevebauman/purify": "2.0.*"
     },
     "require-dev": {

+ 7 - 6
config/filesystems.php

@@ -56,12 +56,13 @@ return [
         ],
 
         's3' => [
-            'driver' => 's3',
-            'key'    => env('AWS_ACCESS_KEY_ID'),
-            'secret' => env('AWS_SECRET_ACCESS_KEY'),
-            'region' => env('AWS_DEFAULT_REGION'),
-            'bucket' => env('AWS_BUCKET'),
-            'url'    => env('AWS_URL'),
+            'driver'   => 's3',
+            'key'      => env('AWS_ACCESS_KEY_ID'),
+            'secret'   => env('AWS_SECRET_ACCESS_KEY'),
+            'region'   => env('AWS_DEFAULT_REGION'),
+            'bucket'   => env('AWS_BUCKET'),
+            'url'      => env('AWS_URL'),
+            'endpoint' => env('AWS_ENDPOINT'),
         ],
 
     ],

+ 4 - 4
contrib/docker/Dockerfile.apache

@@ -4,16 +4,16 @@ ARG COMPOSER_VERSION="1.6.5"
 ARG COMPOSER_CHECKSUM="67bebe9df9866a795078bb2cf21798d8b0214f2e0b2fd81f2e907a8ef0be3434"
 
 RUN apt-get update \
- && apt-get install -y --no-install-recommends git \
+ && apt-get install -y --no-install-recommends git gosu \
       optipng pngquant jpegoptim gifsicle \
-      libfreetype6 libjpeg62-turbo libpng16-16 libxpm4 libvpx4 libmagickwand-6.q16-3 \
-      libfreetype6-dev libjpeg62-turbo-dev libpng-dev libxpm-dev libvpx-dev libmagickwand-dev \
+      libfreetype6 libjpeg62-turbo libpng16-16 libxpm4 libwebp6 libmagickwand-6.q16-3 \
+      libfreetype6-dev libjpeg62-turbo-dev libpng-dev libxpm-dev libwebp-dev libmagickwand-dev \
  && docker-php-source extract \
  && docker-php-ext-configure gd \
       --with-freetype-dir=/usr/lib/x86_64-linux-gnu/ \
       --with-jpeg-dir=/usr/lib/x86_64-linux-gnu/ \
       --with-xpm-dir=/usr/lib/x86_64-linux-gnu/ \
-      --with-vpx-dir=/usr/lib/x86_64-linux-gnu/ \
+      --with-webp-dir=/usr/lib/x86_64-linux-gnu/ \
  && docker-php-ext-install pdo_mysql pcntl gd exif bcmath \
  && pecl install imagick \
  && docker-php-ext-enable imagick pcntl imagick gd exif \

+ 59 - 26
contrib/docker/Dockerfile.fpm

@@ -1,31 +1,64 @@
-FROM php:7.2.6-fpm-alpine
+FROM php:7-fpm
 
 ARG COMPOSER_VERSION="1.6.5"
 ARG COMPOSER_CHECKSUM="67bebe9df9866a795078bb2cf21798d8b0214f2e0b2fd81f2e907a8ef0be3434"
 
-RUN apk add --no-cache --virtual .build build-base autoconf imagemagick-dev libtool && \
-  apk --no-cache add imagemagick git && \
-  docker-php-ext-install pdo_mysql pcntl && \
-  pecl install imagick && \
-  docker-php-ext-enable imagick pcntl imagick && \
-  curl -LsS https://getcomposer.org/download/${COMPOSER_VERSION}/composer.phar -o /tmp/composer.phar && \
-  echo "${COMPOSER_CHECKSUM}  /tmp/composer.phar" | sha256sum -c - && \
-  install -m0755 -o root -g root /tmp/composer.phar /usr/bin/composer.phar && \
-  ln -sf /usr/bin/composer.phar /usr/bin/composer && \
-  rm /tmp/composer.phar && \
-  apk --no-cache del --purge .build
-
-COPY . /var/www/html/
-
-WORKDIR /var/www/html
-RUN install -d -m0755 -o www-data -g www-data \
-    /var/www/html/storage \
-    /var/www/html/storage/framework \
-    /var/www/html/storage/logs \
-    /var/www/html/storage/framework/sessions \
-    /var/www/html/storage/framework/views \
-    /var/www/html/storage/framework/cache && \
-  composer install --prefer-source --no-interaction
-
-VOLUME ["/var/www/html"]
+RUN apt-get update \
+ && apt-get install -y --no-install-recommends git \
+      optipng pngquant jpegoptim gifsicle \
+      libfreetype6 libjpeg62-turbo libpng16-16 libxpm4 libvpx4 libmagickwand-6.q16-3 \
+      libfreetype6-dev libjpeg62-turbo-dev libpng-dev libxpm-dev libvpx-dev libmagickwand-dev \
+ && docker-php-source extract \
+ && docker-php-ext-configure gd \
+      --with-freetype-dir=/usr/lib/x86_64-linux-gnu/ \
+      --with-jpeg-dir=/usr/lib/x86_64-linux-gnu/ \
+      --with-xpm-dir=/usr/lib/x86_64-linux-gnu/ \
+      --with-vpx-dir=/usr/lib/x86_64-linux-gnu/ \
+ && docker-php-ext-install pdo_mysql pcntl gd exif bcmath \
+ && pecl install imagick \
+ && docker-php-ext-enable imagick pcntl imagick gd exif \
+ && curl -LsS https://getcomposer.org/download/${COMPOSER_VERSION}/composer.phar -o /usr/bin/composer \
+ && echo "${COMPOSER_CHECKSUM}  /usr/bin/composer" | sha256sum -c - \
+ && chmod 755 /usr/bin/composer \
+ && apt-get autoremove --purge -y \
+       libfreetype6-dev libjpeg62-turbo-dev libpng-dev libxpm-dev libvpx-dev libmagickwand-dev \
+ && rm -rf /var/cache/apt \
+ && docker-php-source delete
+
 ENV PATH="~/.composer/vendor/bin:./vendor/bin:${PATH}"
+
+COPY . /var/www/
+
+WORKDIR /var/www/
+RUN cp -r storage storage.skel \
+ && cp contrib/docker/php.ini /usr/local/etc/php/conf.d/pixelfed.ini \
+ && composer install --prefer-source --no-interaction \
+ && rm -rf html && ln -s public html
+
+VOLUME ["/var/www/storage", "/var/www/public.ext"]
+
+ENV APP_ENV=production \
+    APP_DEBUG=false \
+    LOG_CHANNEL=stderr \
+    DB_CONNECTION=mysql \
+    DB_PORT=3306 \
+    DB_HOST=db \
+    BROADCAST_DRIVER=log \
+    QUEUE_DRIVER=redis \
+    HORIZON_PREFIX=horizon-pixelfed \
+    REDIS_HOST=redis \
+    SESSION_SECURE_COOKIE=true \
+    API_BASE="/api/1/" \
+    API_SEARCH="/api/search" \
+    OPEN_REGISTRATION=true \
+    ENFORCE_EMAIL_VERIFICATION=true \
+    REMOTE_FOLLOW=false \
+    ACTIVITY_PUB=false
+
+CMD cp -r storage.skel/* storage/ \
+ && cp -r public/* public.ext/ \
+ && chown -R www-data:www-data storage/ \
+ && php artisan storage:link \
+ && php artisan migrate --force \
+ && php artisan update \
+ && exec php-fpm

+ 5 - 5
contrib/docker/start.sh

@@ -2,18 +2,18 @@
 
 # Create the storage tree if needed and fix permissions
 cp -r storage.skel/* storage/
-chown -R www-data:www-data storage/
+chown -R www-data:www-data storage/ bootstrap/cache/
 php artisan storage:link
 
 # Migrate database if the app was upgraded
-php artisan migrate --force
+gosu www-data:www-data php artisan migrate --force
 
 # Run other specific migratins if required
-php artisan update
+gosu www-data:www-data php artisan update
 
 # Run a worker if it is set as embedded
-if [ $HORIZON_EMBED = true ]; then
-	php artisan horizon &
+if [ "$HORIZON_EMBED" = "true" ]; then
+  gosu www-data:www-data php artisan horizon &
 fi
 
 # Finally run Apache

+ 1 - 1
docker-compose.yml

@@ -38,7 +38,7 @@ services:
   #     - "app-storage:/var/www/storage"
   #   networks:
   #     - internal
-  #   command: php artisan horizon
+  #   command: gosu www-data php artisan horizon
     
   db:
     image: mysql:5.7

+ 1 - 1
resources/lang/fr/profile.php

@@ -4,7 +4,7 @@ return [
   'emptyTimeline'  => 'Cet·te utilisateur·rice n\'a pas encore de publications !',
   'emptyFollowers' => 'Cet·te utilisateur·rice n`\'a pas encore d\'abonné·e·s !',
   'emptyFollowing' => 'Cet·te utilisateur·rice ne suit personne pour le moment !',
-  'emptySaved'     => 'Vous n\'avez sauvegardé aucune publication pour le moment !'
+  'emptySaved'     => 'Vous n\'avez sauvegardé aucune publication pour le moment !',
   'savedWarning'   => 'Vous seul pouvez voir ce que vous avez enregistré',
   'privateProfileWarning' => 'Ce compte est privé',
   'alreadyFollow'         => 'N\'êtes vous pas déjà abonné·e à :username ?',

+ 2 - 2
resources/views/timeline/template.blade.php

@@ -15,7 +15,7 @@
 
 <div class="container d-none timeline-container">
   <div class="row">
-    <div class="col-md-10 col-lg-8 pt-4 px-0 my-3">
+    <div class="col-md-8 col-lg-8 pt-4 px-0 my-3">
         @if (session('status'))
             <div class="alert alert-success">
                 <span class="font-weight-bold">{!! session('status') !!}</span>
@@ -72,7 +72,7 @@
       </div>
 
     </div>
-    <div class="col-md-2 col-lg-4 pt-4 my-3">
+    <div class="col-md-4 col-lg-4 pt-4 my-3">
         <div class="media d-flex align-items-center mb-4">
           <a href="{{Auth::user()->profile->url()}}">
             <img class="mr-3 rounded-circle box-shadow" src="{{Auth::user()->profile->avatarUrl()}}" alt="{{Auth::user()->username}}'s avatar" width="64px">