mirror of
https://github.com/pixelfed/pixelfed.git
synced 2025-01-11 06:30:46 +00:00
Merge pull request #599 from pixelfed/frontend-ui-refactor
Frontend ui refactor
This commit is contained in:
commit
090881829f
10 changed files with 244 additions and 46 deletions
165
app/Jobs/DeletePipeline/DeleteAccountPipeline.php
Normal file
165
app/Jobs/DeletePipeline/DeleteAccountPipeline.php
Normal file
|
@ -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) {}
|
||||||
|
}
|
|
@ -82,7 +82,7 @@ class StatusEntityLexer implements ShouldQueue
|
||||||
|
|
||||||
foreach ($tags as $tag) {
|
foreach ($tags as $tag) {
|
||||||
DB::transaction(function () use ($status, $tag) {
|
DB::transaction(function () use ($status, $tag) {
|
||||||
$slug = str_slug($tag);
|
$slug = str_slug($tag, '-', false);
|
||||||
$hashtag = Hashtag::firstOrCreate(
|
$hashtag = Hashtag::firstOrCreate(
|
||||||
['name' => $tag, 'slug' => $slug]
|
['name' => $tag, 'slug' => $slug]
|
||||||
);
|
);
|
||||||
|
|
|
@ -30,7 +30,6 @@
|
||||||
"predis/predis": "^1.1",
|
"predis/predis": "^1.1",
|
||||||
"spatie/laravel-backup": "^5.0.0",
|
"spatie/laravel-backup": "^5.0.0",
|
||||||
"spatie/laravel-image-optimizer": "^1.1",
|
"spatie/laravel-image-optimizer": "^1.1",
|
||||||
"spatie/laravel-partialcache": "^1.3",
|
|
||||||
"stevebauman/purify": "2.0.*"
|
"stevebauman/purify": "2.0.*"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
|
|
|
@ -56,12 +56,13 @@ return [
|
||||||
],
|
],
|
||||||
|
|
||||||
's3' => [
|
's3' => [
|
||||||
'driver' => 's3',
|
'driver' => 's3',
|
||||||
'key' => env('AWS_ACCESS_KEY_ID'),
|
'key' => env('AWS_ACCESS_KEY_ID'),
|
||||||
'secret' => env('AWS_SECRET_ACCESS_KEY'),
|
'secret' => env('AWS_SECRET_ACCESS_KEY'),
|
||||||
'region' => env('AWS_DEFAULT_REGION'),
|
'region' => env('AWS_DEFAULT_REGION'),
|
||||||
'bucket' => env('AWS_BUCKET'),
|
'bucket' => env('AWS_BUCKET'),
|
||||||
'url' => env('AWS_URL'),
|
'url' => env('AWS_URL'),
|
||||||
|
'endpoint' => env('AWS_ENDPOINT'),
|
||||||
],
|
],
|
||||||
|
|
||||||
],
|
],
|
||||||
|
|
|
@ -4,16 +4,16 @@ ARG COMPOSER_VERSION="1.6.5"
|
||||||
ARG COMPOSER_CHECKSUM="67bebe9df9866a795078bb2cf21798d8b0214f2e0b2fd81f2e907a8ef0be3434"
|
ARG COMPOSER_CHECKSUM="67bebe9df9866a795078bb2cf21798d8b0214f2e0b2fd81f2e907a8ef0be3434"
|
||||||
|
|
||||||
RUN apt-get update \
|
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 \
|
optipng pngquant jpegoptim gifsicle \
|
||||||
libfreetype6 libjpeg62-turbo libpng16-16 libxpm4 libvpx4 libmagickwand-6.q16-3 \
|
libfreetype6 libjpeg62-turbo libpng16-16 libxpm4 libwebp6 libmagickwand-6.q16-3 \
|
||||||
libfreetype6-dev libjpeg62-turbo-dev libpng-dev libxpm-dev libvpx-dev libmagickwand-dev \
|
libfreetype6-dev libjpeg62-turbo-dev libpng-dev libxpm-dev libwebp-dev libmagickwand-dev \
|
||||||
&& docker-php-source extract \
|
&& docker-php-source extract \
|
||||||
&& docker-php-ext-configure gd \
|
&& docker-php-ext-configure gd \
|
||||||
--with-freetype-dir=/usr/lib/x86_64-linux-gnu/ \
|
--with-freetype-dir=/usr/lib/x86_64-linux-gnu/ \
|
||||||
--with-jpeg-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-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 \
|
&& docker-php-ext-install pdo_mysql pcntl gd exif bcmath \
|
||||||
&& pecl install imagick \
|
&& pecl install imagick \
|
||||||
&& docker-php-ext-enable imagick pcntl imagick gd exif \
|
&& docker-php-ext-enable imagick pcntl imagick gd exif \
|
||||||
|
|
|
@ -1,31 +1,64 @@
|
||||||
FROM php:7.2.6-fpm-alpine
|
FROM php:7-fpm
|
||||||
|
|
||||||
ARG COMPOSER_VERSION="1.6.5"
|
ARG COMPOSER_VERSION="1.6.5"
|
||||||
ARG COMPOSER_CHECKSUM="67bebe9df9866a795078bb2cf21798d8b0214f2e0b2fd81f2e907a8ef0be3434"
|
ARG COMPOSER_CHECKSUM="67bebe9df9866a795078bb2cf21798d8b0214f2e0b2fd81f2e907a8ef0be3434"
|
||||||
|
|
||||||
RUN apk add --no-cache --virtual .build build-base autoconf imagemagick-dev libtool && \
|
RUN apt-get update \
|
||||||
apk --no-cache add imagemagick git && \
|
&& apt-get install -y --no-install-recommends git \
|
||||||
docker-php-ext-install pdo_mysql pcntl && \
|
optipng pngquant jpegoptim gifsicle \
|
||||||
pecl install imagick && \
|
libfreetype6 libjpeg62-turbo libpng16-16 libxpm4 libvpx4 libmagickwand-6.q16-3 \
|
||||||
docker-php-ext-enable imagick pcntl imagick && \
|
libfreetype6-dev libjpeg62-turbo-dev libpng-dev libxpm-dev libvpx-dev libmagickwand-dev \
|
||||||
curl -LsS https://getcomposer.org/download/${COMPOSER_VERSION}/composer.phar -o /tmp/composer.phar && \
|
&& docker-php-source extract \
|
||||||
echo "${COMPOSER_CHECKSUM} /tmp/composer.phar" | sha256sum -c - && \
|
&& docker-php-ext-configure gd \
|
||||||
install -m0755 -o root -g root /tmp/composer.phar /usr/bin/composer.phar && \
|
--with-freetype-dir=/usr/lib/x86_64-linux-gnu/ \
|
||||||
ln -sf /usr/bin/composer.phar /usr/bin/composer && \
|
--with-jpeg-dir=/usr/lib/x86_64-linux-gnu/ \
|
||||||
rm /tmp/composer.phar && \
|
--with-xpm-dir=/usr/lib/x86_64-linux-gnu/ \
|
||||||
apk --no-cache del --purge .build
|
--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
|
||||||
|
|
||||||
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"]
|
|
||||||
ENV PATH="~/.composer/vendor/bin:./vendor/bin:${PATH}"
|
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
|
||||||
|
|
|
@ -2,18 +2,18 @@
|
||||||
|
|
||||||
# Create the storage tree if needed and fix permissions
|
# Create the storage tree if needed and fix permissions
|
||||||
cp -r storage.skel/* storage/
|
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
|
php artisan storage:link
|
||||||
|
|
||||||
# Migrate database if the app was upgraded
|
# 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
|
# 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
|
# Run a worker if it is set as embedded
|
||||||
if [ $HORIZON_EMBED = true ]; then
|
if [ "$HORIZON_EMBED" = "true" ]; then
|
||||||
php artisan horizon &
|
gosu www-data:www-data php artisan horizon &
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Finally run Apache
|
# Finally run Apache
|
||||||
|
|
|
@ -38,7 +38,7 @@ services:
|
||||||
# - "app-storage:/var/www/storage"
|
# - "app-storage:/var/www/storage"
|
||||||
# networks:
|
# networks:
|
||||||
# - internal
|
# - internal
|
||||||
# command: php artisan horizon
|
# command: gosu www-data php artisan horizon
|
||||||
|
|
||||||
db:
|
db:
|
||||||
image: mysql:5.7
|
image: mysql:5.7
|
||||||
|
|
|
@ -4,7 +4,7 @@ return [
|
||||||
'emptyTimeline' => 'Cet·te utilisateur·rice n\'a pas encore de publications !',
|
'emptyTimeline' => 'Cet·te utilisateur·rice n\'a pas encore de publications !',
|
||||||
'emptyFollowers' => 'Cet·te utilisateur·rice n`\'a pas encore d\'abonné·e·s !',
|
'emptyFollowers' => 'Cet·te utilisateur·rice n`\'a pas encore d\'abonné·e·s !',
|
||||||
'emptyFollowing' => 'Cet·te utilisateur·rice ne suit personne pour le moment !',
|
'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é',
|
'savedWarning' => 'Vous seul pouvez voir ce que vous avez enregistré',
|
||||||
'privateProfileWarning' => 'Ce compte est privé',
|
'privateProfileWarning' => 'Ce compte est privé',
|
||||||
'alreadyFollow' => 'N\'êtes vous pas déjà abonné·e à :username ?',
|
'alreadyFollow' => 'N\'êtes vous pas déjà abonné·e à :username ?',
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
|
|
||||||
<div class="container d-none timeline-container">
|
<div class="container d-none timeline-container">
|
||||||
<div class="row">
|
<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'))
|
@if (session('status'))
|
||||||
<div class="alert alert-success">
|
<div class="alert alert-success">
|
||||||
<span class="font-weight-bold">{!! session('status') !!}</span>
|
<span class="font-weight-bold">{!! session('status') !!}</span>
|
||||||
|
@ -72,7 +72,7 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</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">
|
<div class="media d-flex align-items-center mb-4">
|
||||||
<a href="{{Auth::user()->profile->url()}}">
|
<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">
|
<img class="mr-3 rounded-circle box-shadow" src="{{Auth::user()->profile->avatarUrl()}}" alt="{{Auth::user()->username}}'s avatar" width="64px">
|
||||||
|
|
Loading…
Reference in a new issue