Skip to content

Feature discussion #22

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 28 commits into from
Nov 22, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
7ddf5be
:card_file_box: ajout du model et migration pour les discussions
mckenziearts Nov 16, 2021
4f6e0ea
:white_check_mark: mis en place des tests unitaires pour les discussions
mckenziearts Nov 16, 2021
e68e8df
:sparkles: ajout de la creation et du detail d'une description
mckenziearts Nov 17, 2021
83258c4
:sparkles: mise en place du listing des discussions
mckenziearts Nov 17, 2021
30edba3
Apply php-cs-fixer changes
mckenziearts Nov 17, 2021
d2abd28
:sparkles: ajout de l'edition et la suppression d'une discussion
mckenziearts Nov 17, 2021
2d643cc
:bento: ajout de la config js pour webpack
mckenziearts Nov 17, 2021
91096be
:sparkles: ajout des discussions dans le profil utilisateur
mckenziearts Nov 17, 2021
926df0c
:sparkles: modification de l'affichage des dates avec le time-ago cus…
mckenziearts Nov 18, 2021
11f82c0
:card_file_box: update des tags seeder
mckenziearts Nov 19, 2021
891c119
:heavy_plus_sign: installation et configuration de preact et babel av…
mckenziearts Nov 19, 2021
3e8ade6
:sparkles: Ajout des controllers, api, et modification des services p…
mckenziearts Nov 19, 2021
82fe473
:recycle: refactoring des composants et vues
mckenziearts Nov 19, 2021
a8f909d
:wrench: ajout des variables d'environnement
mckenziearts Nov 20, 2021
2bad240
:hammer: ajout des scripts
mckenziearts Nov 20, 2021
a186c9c
:recycle: refactoring et ajout d'API
mckenziearts Nov 20, 2021
0349cda
:heavy_plus_sign: ajout des dependances markdown
mckenziearts Nov 20, 2021
74270ad
api routes
mckenziearts Nov 20, 2021
be5a741
:lipstick: modification des vues
mckenziearts Nov 20, 2021
6368265
:alien: mis en place des api des reponses
mckenziearts Nov 20, 2021
1baf323
:sparkles: ajout des customElements
mckenziearts Nov 20, 2021
9c5b90a
:sparkles: ajout des components
mckenziearts Nov 20, 2021
1e14511
:construction: wip
mckenziearts Nov 20, 2021
85228d1
:sparkles: ajout de la suppression des commentaires et des reponses d…
mckenziearts Nov 20, 2021
a8ec382
:sparkles: ajout de la creation et l'edition d'un commentaire
mckenziearts Nov 22, 2021
0fecbe4
:recycle: refactoring
mckenziearts Nov 22, 2021
c3ad9d1
:twisted_rightwards_arrows: Merge branch 'feature-discussion' of http…
mckenziearts Nov 22, 2021
df138c9
:white_check_mark: passed test
mckenziearts Nov 22, 2021
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ SLACK_TEAM_URL="https://laravelcm.slack.com"

MARKDOWNX_GIPHY_API_KEY=
TORCHLIGHT_TOKEN=
MIX_TORCHLIGHT_TOKEN="${TORCHLIGHT_TOKEN}"
UNSPLASH_ACCESS_KEY=
TELEGRAM_BOT_TOKEN=
MEDIA_DISK=media
16 changes: 16 additions & 0 deletions app/Events/CommentWasAdded.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?php

namespace App\Events;

use App\Models\Discussion;
use App\Models\Reply;
use Illuminate\Queue\SerializesModels;

class CommentWasAdded
{
use SerializesModels;

public function __construct(public Reply $reply, public Discussion $discussion)
{
}
}
85 changes: 85 additions & 0 deletions app/Http/Controllers/Api/ReplyController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
<?php

namespace App\Http\Controllers\Api;

use App\Events\CommentWasAdded;
use App\Http\Controllers\Controller;
use App\Http\Requests\Api\CreateReplyRequest;
use App\Http\Requests\Api\UpdateReplyRequest;
use App\Http\Resources\ReplyResource;
use App\Models\Discussion;
use App\Models\Reaction;
use App\Models\Reply;
use App\Models\User;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\AnonymousResourceCollection;

class ReplyController extends Controller
{
public function all(int $target): AnonymousResourceCollection
{
/** @var Discussion $discussion */
$discussion = Discussion::findOrFail($target);
$replies = collect();

foreach ($discussion->replies as $reply) {
if ($reply->allChildReplies->isNotEmpty()) {
foreach ($reply->allChildReplies as $childReply) {
$replies->add($childReply);
}
}

$replies->add($reply);
}

return ReplyResource::collection($replies);
}

public function store(CreateReplyRequest $request): ReplyResource
{
// dd($request->all());
// if ($request->parent) {}
$reply = new Reply(['body' => $request->body]);
$author = User::find($request->user_id);

$target = Discussion::find($request->target);
$reply->authoredBy($author);
$reply->to($target);
$reply->save();

// On envoie un event pour une nouvelle réponse à tous les abonnés de la discussion
event(new CommentWasAdded($reply, $target));

return new ReplyResource($reply);
}

public function update(UpdateReplyRequest $request, int $id): ReplyResource
{
$reply = Reply::find($id);
$reply->update(['body' => $request->body]);

return new ReplyResource($reply);
}

public function like(Request $request, int $id): ReplyResource
{
$reply = Reply::findOrFail($id);
$react = Reaction::where('name', 'love')->first();
/** @var User $user */
$user = User::findOrFail($request->userId);

$user->reactTo($reply, $react);

return new ReplyResource($reply);
}

public function delete(int $id): JsonResponse
{
/** @var Reply $reply */
$reply = Reply::findOrFail($id);
$reply->delete();

return response()->json(['message' => 'Commentaire supprimé avec succès']);
}
}
48 changes: 48 additions & 0 deletions app/Http/Controllers/DiscussionController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
<?php

namespace App\Http\Controllers;

use App\Models\Discussion;
use App\Policies\DiscussionPolicy;

class DiscussionController extends Controller
{
public function __construct()
{
$this->middleware(['auth', 'verified'], ['except' => ['index', 'show']]);
}

public function index()
{
return view('discussions.index');
}

public function show(Discussion $discussion)
{
views($discussion)->record();

seo()
->title($discussion->title)
->description($discussion->excerpt(100))
->image(asset('images/socialcard.png'))
->twitterTitle($discussion->title)
->twitterDescription($discussion->excerpt(100))
->twitterImage(asset('images/socialcard.png'))
->twitterSite('laravelcm')
->withUrl();

return view('discussions.show', ['discussion' => $discussion->load('tags')]);
}

public function create()
{
return view('discussions.new');
}

public function edit(Discussion $discussion)
{
$this->authorize(DiscussionPolicy::UPDATE, $discussion);

return view('discussions.edit', compact('discussion'));
}
}
12 changes: 0 additions & 12 deletions app/Http/Controllers/Forum/ReplyController.php

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
<?php

namespace App\Http\Controllers\Forum;
namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use App\Models\Channel;
use App\Models\Thread;
use Illuminate\Http\Request;
Expand Down
21 changes: 2 additions & 19 deletions app/Http/Livewire/Articles/Browse.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,35 +5,18 @@
use App\Models\Article;
use App\Models\Tag;
use App\Traits\WithInfiniteScroll;
use App\Traits\WithTags;
use Livewire\Component;

class Browse extends Component
{
use WithInfiniteScroll;

public string $sortBy = 'recent';
public ?string $tag = null;
use WithInfiniteScroll, WithTags;

protected $queryString = [
'tag' => ['except' => ''],
'sortBy' => ['except' => 'recent'],
];

public function toggleTag($tag): void
{
$this->tag = $this->tag !== $tag && $this->tagExists($tag) ? $tag : null;
}

public function sortBy($sort): void
{
$this->sortBy = $this->validSort($sort) ? $sort : 'recent';
}

public function tagExists($tag): bool
{
return Tag::where('slug', $tag)->exists();
}

public function validSort($sort): bool
{
return in_array($sort, [
Expand Down
19 changes: 13 additions & 6 deletions app/Http/Livewire/Articles/Create.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
use App\Models\Tag;
use App\Traits\WithArticleAttributes;
use App\Traits\WithTagsAssociation;
use Illuminate\Support\Facades\Auth;
use Livewire\Component;
use Livewire\WithFileUploads;

Expand All @@ -17,9 +18,11 @@ class Create extends Component

public function mount()
{
$this->submitted = ! auth()->user()->hasAnyRole(['admin', 'moderator']);
$this->submitted_at = auth()->user()->hasAnyRole(['admin', 'moderator']) ? now() : null;
$this->approved_at = auth()->user()->hasAnyRole(['admin', 'moderator']) ? now() : null;
$user = Auth::user();

$this->submitted = ! $user->hasAnyRole(['admin', 'moderator']);
$this->submitted_at = $user->hasAnyRole(['admin', 'moderator']) ? now() : null;
$this->approved_at = $user->hasAnyRole(['admin', 'moderator']) ? now() : null;
}

public function onMarkdownUpdate(string $content)
Expand All @@ -43,6 +46,8 @@ public function store()
{
$this->validate();

$user = Auth::user();

$article = Article::create([
'title' => $this->title,
'slug' => $this->slug,
Expand All @@ -52,10 +57,12 @@ public function store()
'approved_at' => $this->approved_at,
'show_toc' => $this->show_toc,
'canonical_url' => $this->canonical_url,
'user_id' => auth()->id(),
'user_id' => $user->id,
]);

$article->syncTags($this->associateTags);
if (collect($this->associateTags)->isNotEmpty()) {
$article->syncTags($this->associateTags);
}

if ($this->file) {
$article->addMedia($this->file->getRealPath())->toMediaCollection('media');
Expand All @@ -66,7 +73,7 @@ public function store()
session()->flash('success', 'Merci d\'avoir soumis votre article. Vous aurez des nouvelles que lorsque nous accepterons votre article.');
}

auth()->user()->hasRole('user') ?
$user->hasRole('user') ?
$this->redirect('/articles/me') :
$this->redirect('/admin/articles');
}
Expand Down
52 changes: 52 additions & 0 deletions app/Http/Livewire/Discussions/Browse.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
<?php

namespace App\Http\Livewire\Discussions;

use App\Models\Discussion;
use App\Models\Tag;
use App\Traits\WithInfiniteScroll;
use App\Traits\WithTags;
use Livewire\Component;

class Browse extends Component
{
use WithInfiniteScroll, WithTags;

protected $queryString = [
'tag' => ['except' => ''],
'sortBy' => ['except' => 'recent'],
];

public function validSort($sort): bool
{
return in_array($sort, [
'recent',
'popular',
'active',
]);
}

public function render()
{
$discussions = Discussion::with('tags')
->withCount('replies')
->notPinned();

$tags = Tag::whereJsonContains('concerns', ['discussion'])->orderBy('name')->get();

$selectedTag = Tag::where('name', $this->tag)->first();

if ($this->tag) {
$discussions->forTag($this->tag);
}

$discussions->{$this->sortBy}();

return view('livewire.discussions.browse', [
'discussions' => $discussions->paginate($this->perPage),
'tags' => $tags,
'selectedTag' => $selectedTag,
'selectedSortBy' => $this->sortBy,
]);
}
}
57 changes: 57 additions & 0 deletions app/Http/Livewire/Discussions/Create.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
<?php

namespace App\Http\Livewire\Discussions;

use App\Models\Discussion;
use App\Models\Tag;
use App\Notifications\PostDiscussionToTelegram;
use App\Traits\WithTagsAssociation;
use Illuminate\Support\Facades\Auth;
use Livewire\Component;

class Create extends Component
{
use WithTagsAssociation;

public string $title = '';
public string $body = '';

protected $listeners = ['markdown-x:update' => 'onMarkdownUpdate'];
protected $rules = [
'title' => ['required', 'max:150'],
'body' => ['required'],
'tags_selected' => 'nullable|array',
];

public function onMarkdownUpdate(string $content)
{
$this->body = $content;
}

public function store()
{
$this->validate();

$discussion = Discussion::create([
'title' => $this->title,
'slug' => $this->title,
'body' => $this->body,
'user_id' => Auth::id(),
]);

if (collect($this->associateTags)->isNotEmpty()) {
$discussion->syncTags($this->associateTags);
}

Auth::user()->notify(new PostDiscussionToTelegram($discussion));

$this->redirectRoute('discussions.show', $discussion);
}

public function render()
{
return view('livewire.discussions.create', [
'tags' => Tag::whereJsonContains('concerns', ['discussion'])->get(),
]);
}
}
Loading