Edit app-9xzmfic2e4g1/src/db/api.ts via Editor
This commit is contained in:
parent
e84b6a9cd7
commit
af845fdc33
@ -124,10 +124,112 @@ const api = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
getPhotoUrl(photoReference: string) {
|
getPhotoUrl(photoReference: string) {
|
||||||
const { data } = supabase.storage.from('dummy').getPublicUrl('dummy'); // Just to get the base URL
|
const { data } = supabase.storage.from('dummy').getPublicUrl('dummy');
|
||||||
const baseUrl = data.publicUrl.split('/storage/v1')[0];
|
const baseUrl = data.publicUrl.split('/storage/v1')[0];
|
||||||
return `${baseUrl}/functions/v1/get-place-photo?photo_reference=${photoReference}`;
|
return `${baseUrl}/functions/v1/get-place-photo?photo_reference=${photoReference}`;
|
||||||
}
|
},
|
||||||
};
|
|
||||||
|
|
||||||
export default api;
|
// ── Public Guides ──────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
/** Rehber olarak yayınla / yayından kaldır */
|
||||||
|
async publishGuide(tripId: string, opts: {
|
||||||
|
guide_intro?: string;
|
||||||
|
guide_tips?: string[];
|
||||||
|
}) {
|
||||||
|
const { data, error } = await supabase
|
||||||
|
.from('trips')
|
||||||
|
.update({
|
||||||
|
is_public: true,
|
||||||
|
guide_intro: opts.guide_intro || null,
|
||||||
|
guide_tips: opts.guide_tips || [],
|
||||||
|
published_at: new Date().toISOString(),
|
||||||
|
})
|
||||||
|
.eq('id', tripId)
|
||||||
|
.select()
|
||||||
|
.single();
|
||||||
|
if (error) throw error;
|
||||||
|
return data;
|
||||||
|
},
|
||||||
|
|
||||||
|
async unpublishGuide(tripId: string) {
|
||||||
|
const { error } = await supabase
|
||||||
|
.from('trips')
|
||||||
|
.update({ is_public: false, published_at: null })
|
||||||
|
.eq('id', tripId);
|
||||||
|
if (error) throw error;
|
||||||
|
},
|
||||||
|
|
||||||
|
/** Tüm public rehberleri getir (popülerlik sırasına göre) */
|
||||||
|
async getPublicGuides(limit = 20) {
|
||||||
|
const { data, error } = await supabase
|
||||||
|
.from('trips')
|
||||||
|
.select('id, title, destination, start_date, end_date, itinerary, guide_intro, guide_tips, views_count, likes_count, published_at, user_id, profiles(id, username)')
|
||||||
|
.eq('is_public', true)
|
||||||
|
.order('likes_count', { ascending: false })
|
||||||
|
.order('views_count', { ascending: false })
|
||||||
|
.limit(limit);
|
||||||
|
if (error) throw error;
|
||||||
|
return data || [];
|
||||||
|
},
|
||||||
|
|
||||||
|
/** Tek bir public rehberi getir + view sayacını artır */
|
||||||
|
async getPublicGuide(tripId: string) {
|
||||||
|
const { data, error } = await supabase
|
||||||
|
.from('trips')
|
||||||
|
.select('*, profiles(id, username)')
|
||||||
|
.eq('id', tripId)
|
||||||
|
.eq('is_public', true)
|
||||||
|
.single();
|
||||||
|
if (error) throw error;
|
||||||
|
// view sayacını artır (fire & forget)
|
||||||
|
supabase.rpc('increment_guide_views', { trip_id: tripId }).then(() => {});
|
||||||
|
return data;
|
||||||
|
},
|
||||||
|
|
||||||
|
/** Rehberi kopyalayarak kendi tripini oluştur */
|
||||||
|
async cloneGuide(tripId: string): Promise<Trip> {
|
||||||
|
const guide = await this.getPublicGuide(tripId);
|
||||||
|
if (!guide) throw new Error('Rehber bulunamadı');
|
||||||
|
const newTrip = await this.saveTrip({
|
||||||
|
title: `${guide.title} (Kopyam)`,
|
||||||
|
destination: guide.destination,
|
||||||
|
start_date: guide.start_date,
|
||||||
|
end_date: guide.end_date,
|
||||||
|
preferences: guide.preferences,
|
||||||
|
itinerary: guide.itinerary,
|
||||||
|
});
|
||||||
|
return newTrip;
|
||||||
|
},
|
||||||
|
|
||||||
|
/** Beğen / beğeniyi geri al */
|
||||||
|
async toggleLike(tripId: string): Promise<boolean> {
|
||||||
|
const { data: { user } } = await supabase.auth.getUser();
|
||||||
|
if (!user) throw new Error('Giriş gerekli');
|
||||||
|
|
||||||
|
const { data: existing } = await supabase
|
||||||
|
.from('guide_likes')
|
||||||
|
.select('user_id')
|
||||||
|
.eq('user_id', user.id)
|
||||||
|
.eq('trip_id', tripId)
|
||||||
|
.maybeSingle();
|
||||||
|
|
||||||
|
if (existing) {
|
||||||
|
await supabase.from('guide_likes').delete().eq('user_id', user.id).eq('trip_id', tripId);
|
||||||
|
return false; // beğeni kaldırıldı
|
||||||
|
} else {
|
||||||
|
await supabase.from('guide_likes').insert({ user_id: user.id, trip_id: tripId });
|
||||||
|
return true; // beğenildi
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
/** Kullanıcının beğendiği guide id'leri */
|
||||||
|
async getMyLikes(): Promise<string[]> {
|
||||||
|
const { data: { user } } = await supabase.auth.getUser();
|
||||||
|
if (!user) return [];
|
||||||
|
const { data } = await supabase
|
||||||
|
.from('guide_likes')
|
||||||
|
.select('trip_id')
|
||||||
|
.eq('user_id', user.id);
|
||||||
|
return (data || []).map(r => r.trip_id);
|
||||||
|
},
|
||||||
|
};
|
||||||
Loading…
x
Reference in New Issue
Block a user