2024. 8. 6. 18:08ㆍSNS 프로젝트 일지/PHP
인스타그램 , FaceBook과 같은 SNS를 제작을 목표로 페이지를 만들고 있다.
먼저 제일 중요한 Feed에 대한 모델링이다.
- 게시물 테이블 (Feeds)
- id (Primary Key): 고유 게시물 ID
- user_id (Foreign Key): 게시물을 작성한 사용자 ID
- content: 게시물 내용 (텍스트)
- media_url: 사진 또는 비디오 URL
- created_at: 게시물 작성 시간
- updated_at: 게시물 수정 시간
- 댓글 테이블 (Comments)
- id (Primary Key): 고유 댓글 ID
- feed_id (Foreign Key): 댓글이 달린 게시물 ID
- user_id (Foreign Key): 댓글을 작성한 사용자 ID
- content: 댓글 내용
- created_at: 댓글 작성 시간
- 좋아요 테이블 (Likes)
- id (Primary Key): 고유 좋아요 ID
- feed_id (Foreign Key): 좋아요가 눌린 게시물 ID
- user_id (Foreign Key): 좋아요를 누른 사용자 ID
- created_at: 좋아요 누른 시간
- 팔로우 관계 테이블 (Follows)
- id (Primary Key): 고유 팔로우 ID
- follower_id (Foreign Key): 팔로우하는 사용자 ID
- followed_id (Foreign Key): 팔로우당하는 사용자 ID
- created_at: 팔로우 시작 시간
확장 테이블
- 태그 테이블 (Tags)
- id (Primary Key): 고유 태그 ID
- name: 태그 이름
- 게시물-태그 관계 테이블 (PostTags)
- id (Primary Key): 고유 ID
- feed_id (Foreign Key): 게시물 ID
- tag_id (Foreign Key): 태그 ID
- 알림 테이블 (Notifications)
- id (Primary Key): 고유 알림 ID
- user_id (Foreign Key): 알림을 받을 사용자 ID
- type: 알림 유형 (예: 'like', 'comment', 'follow')
- reference_id: 관련된 게시물 또는 댓글 ID
- created_at: 알림 생성 시간
- read_at: 알림 확인 시간
그리고
Innertia
React
를 Laravel11 Breeze와 연동시켰다.
기본제공하는 aritsan cli 에는 react 에 대한 명령어가 없기 때문에
https://recordfordev.tistory.com/23
을 기반으로
php artisan make:command MakeReactComponent
php artisan make:command MakeReactPages
php artisan make:command MakeReactService
를 만들었고 기본적으로 필요한 팩토리 데이터인 뉴스 피드를 위해
RssService class를 만들었다
<?php
namespace App\Services\Feed;
use App\Models\Feed;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Http;
use Carbon\Carbon;
class RssService
{
protected $url;
public function __construct()
{
$this->url = 'https://news.google.com/rss?hl=ko&gl=KR&ceid=KR:ko';
}
public function getRssFeed($url)
{
$feeds = [];
try {
$response = Http::get($url);
if ($response->successful()) {
$rss = simplexml_load_string($response->body());
if ($rss && isset($rss->channel->item)) {
foreach ($rss->channel->item as $item) {
$feeds[] = [
'user_id' => 53,
'type'=>'news',
'title' => (string) $item->title,
'slug' => (string) $item->guid,
'content' => $this->parseContent((string) $item->description),
'media_url' => (string) $item->link,
'created_at' => Carbon::parse($item->pubDate)->toDateTimeString(),
'updated_at' => Carbon::parse($item->pubDate)->toDateTimeString(),
];
}
}
} else {
Log::error("Failed to fetch RSS feed: " . $response->status());
}
} catch (\Exception $e) {
Log::error("Error fetching or parsing RSS feed: " . $e->getMessage());
}
return $feeds;
}
public function saveFeeds()
{
$feeds = $this->getRssFeed($this->url);
foreach ($feeds as $feed) {
Feed::updateOrCreate(['media_url' => $feed['media_url']], $feed);
}
}
private function parseContent($content)
{
// Content parsing logic here (e.g., strip tags or handle special HTML content)
return $content;
}
}
RSS 피드의 URL 은 구글 뉴스로 생성자에서 지정해 주었다.
RSS 피드는 내일 커맨드로 스케줄을 생성하여 갱신할 예정이다.
오늘자 결과물은
이고 내일 은 RSS 피드 자동 갱신과 SNS 글쓰기이다.
SNS 글쓰기에는 어떤 웹에디터를 사용해야 할지 벌써 의문이다.
깃 레포는
https://github.com/jsh9587/new_dp/tree/master/new-dp
이니 의견이나 피드백 항상 부탁드립니다.( _ _ )
P.S : 사내 DB를 집에서 사용 할 수 없기에 User 와 UserState Factory 로 가데이터를 만드는 DataSeeder 로 교체 하였다.