loged in users saved to db
This commit is contained in:
parent
91e5838b00
commit
0af7a5060e
11
.env
Normal file
11
.env
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
EXPO_PUBLIC_APPWRITE_PROJECT_ID=mobilemk
|
||||||
|
EXPO_PUBLIC_APPWRITE_ENDPOINT=https://cloud.appwrite.io/v1
|
||||||
|
EXPO_PUBLIC_APPWRITE_DATABASE_ID=677bd04b002bbdbe424f
|
||||||
|
EXPO_PUBLIC_APPWRITE_OGLASUVAC_COLLECTION_ID=677bd0e000393afd25b9
|
||||||
|
EXPO_PUBLIC_APPWRITE_GALERIES_COLLECTION_ID=6787d073000bc4bdb6cb
|
||||||
|
EXPO_PUBLIC_APPWRITE_REVIEWS_COLLECTION_ID=6787d165001e6877d572
|
||||||
|
EXPO_PUBLIC_APPWRITE_CARS_COLLECTION_ID=6787d2cb00199e6ea873
|
||||||
|
EXPO_PUBLIC_APPWRITE_VEHICLE_COLLECTION_ID=67892473000c84b108c4
|
||||||
|
EXPO_PUBLIC_APPWRITE_USERS_COLLECTION_ID=679289990026ad25c429
|
||||||
|
|
||||||
|
|
||||||
97
dbstructure.md
Normal file
97
dbstructure.md
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
# DB
|
||||||
|
|
||||||
|
Collections and Fields
|
||||||
|
|
||||||
|
1. Users
|
||||||
|
|
||||||
|
ID (default, auto-generated)
|
||||||
|
Name (string) - Full name of the user.
|
||||||
|
Email (email) - User's email address.
|
||||||
|
Phone (string) - Contact number.
|
||||||
|
ProfileImage (file) - Profile picture of the user.
|
||||||
|
Location (geo-point) - Geographical location (latitude and longitude).
|
||||||
|
CreatedAt (timestamp) - When the user registered.
|
||||||
|
|
||||||
|
2. Cars
|
||||||
|
|
||||||
|
ID (default, auto-generated)
|
||||||
|
Title (string) - Title or headline for the car listing.
|
||||||
|
Description (text) - Detailed description of the car.
|
||||||
|
Price (number) - Price of the car.
|
||||||
|
Make (string) - Car manufacturer (e.g., Toyota, Ford).
|
||||||
|
Model (string) - Specific model of the car.
|
||||||
|
Year (number) - Year of manufacture.
|
||||||
|
Mileage (number) - Total kilometers or miles driven.
|
||||||
|
FuelType (enum) - Type of fuel (e.g., Petrol, Diesel, Electric).
|
||||||
|
Transmission (enum) - Transmission type (e.g., Manual, Automatic).
|
||||||
|
Condition (enum) - Condition of the car (e.g., New, Used).
|
||||||
|
Images (file array) - Images of the car.
|
||||||
|
Location (geo-point) - Where the car is located.
|
||||||
|
PostedBy (relationship) - Reference to the User who posted the car.
|
||||||
|
CreatedAt (timestamp) - When the listing was created.
|
||||||
|
|
||||||
|
3. Favorites
|
||||||
|
|
||||||
|
ID (default, auto-generated)
|
||||||
|
UserID (relationship) - Reference to the User who favorited the car.
|
||||||
|
CarID (relationship) - Reference to the Car being favorited.
|
||||||
|
CreatedAt (timestamp) - When the favorite was added.
|
||||||
|
|
||||||
|
4. Messages
|
||||||
|
|
||||||
|
ID (default, auto-generated)
|
||||||
|
SenderID (relationship) - Reference to the User sending the message.
|
||||||
|
ReceiverID (relationship) - Reference to the User receiving the message.
|
||||||
|
CarID (relationship) - Reference to the Car related to the conversation.
|
||||||
|
Message (text) - Message content.
|
||||||
|
CreatedAt (timestamp) - When the message was sent.
|
||||||
|
|
||||||
|
5. Reviews
|
||||||
|
|
||||||
|
ID (default, auto-generated)
|
||||||
|
UserID (relationship) - Reference to the User being reviewed.
|
||||||
|
ReviewerID (relationship) - Reference to the User leaving the review.
|
||||||
|
Rating (number) - Rating score (e.g., 1–5).
|
||||||
|
Comment (text) - Review content.
|
||||||
|
CreatedAt (timestamp) - When the review was created.
|
||||||
|
|
||||||
|
Relationships
|
||||||
|
|
||||||
|
Users ↔ Cars: One-to-Many (A User can post multiple Cars).
|
||||||
|
Users ↔ Favorites: One-to-Many (A User can have multiple favorite Cars).
|
||||||
|
Users ↔ Messages: One-to-Many (A User can send and receive multiple Messages).
|
||||||
|
Users ↔ Reviews: One-to-Many (A User can give and receive Reviews).
|
||||||
|
|
||||||
|
Indexes
|
||||||
|
|
||||||
|
Cars Collection
|
||||||
|
Index on Location for geo-based searches.
|
||||||
|
Index on Price for filtering by price range.
|
||||||
|
Index on Make and Model for specific searches.
|
||||||
|
Messages Collection
|
||||||
|
Composite index on SenderID and ReceiverID for efficient message retrieval.
|
||||||
|
|
||||||
|
CommercialSlots
|
||||||
|
|
||||||
|
ID (default, auto-generated)
|
||||||
|
UserID (relationship) - Reference to the User who purchased the slot.
|
||||||
|
CarID (relationship) - Reference to the Car being featured.
|
||||||
|
SlotType (enum) - Type of slot (e.g., Featured, Regular).
|
||||||
|
StartDate (timestamp) - When the slot starts.
|
||||||
|
EndDate (timestamp) - When the slot ends.
|
||||||
|
Price (number) - Price paid for the slot.
|
||||||
|
PaymentStatus (enum) - Payment status (Pending, Completed, Failed).
|
||||||
|
CreatedAt (timestamp) - When the slot was purchased.
|
||||||
|
|
||||||
|
Updated Relationships
|
||||||
|
|
||||||
|
Users ↔ CommercialSlots: One-to-Many (A User can buy multiple commercial slots).
|
||||||
|
Cars ↔ CommercialSlots: One-to-Many (A Car can appear in multiple commercial slots of different types).
|
||||||
|
|
||||||
|
Additional Notes
|
||||||
|
|
||||||
|
SlotType: You can use an enum to differentiate between Featured and Regular.
|
||||||
|
Payment Tracking: If you plan to integrate payment gateways, consider adding a Transactions collection to track payments comprehensively.
|
||||||
|
Slot Duration Logic: Ensure validations in your backend (or Appwrite Functions) to enforce slot duration limits and prevent overlapping slots for the same car.
|
||||||
|
|
||||||
|
Would you like me to expand on payment tracking or slot scheduling logic?
|
||||||
103
lib/appwrite.ts
103
lib/appwrite.ts
@ -4,15 +4,26 @@ import {openAuthSessionAsync} from "expo-web-browser";
|
|||||||
import {attribute} from "postcss-selector-parser";
|
import {attribute} from "postcss-selector-parser";
|
||||||
import limit from "ajv-formats/src/limit";
|
import limit from "ajv-formats/src/limit";
|
||||||
|
|
||||||
|
// Add this debug log
|
||||||
|
// console.log('Environment Variables:', {
|
||||||
|
// endpoint: process.env.EXPO_PUBLIC_APPWRITE_ENDPOINT,
|
||||||
|
// projectId: process.env.EXPO_PUBLIC_APPWRITE_PROJECT_ID,
|
||||||
|
// });
|
||||||
|
|
||||||
|
if (!process.env.EXPO_PUBLIC_APPWRITE_ENDPOINT || !process.env.EXPO_PUBLIC_APPWRITE_PROJECT_ID) {
|
||||||
|
throw new Error('Missing required Appwrite environment variables');
|
||||||
|
}
|
||||||
|
|
||||||
export const config = {
|
export const config = {
|
||||||
platform: 'com.placebomk.mobilemk',
|
platform: 'com.placebomk.mobilemk',
|
||||||
endpoint: process.env.EXPO_PUBLIC_APPWRITE_ENDPOINT,
|
endpoint: process.env.EXPO_PUBLIC_APPWRITE_ENDPOINT,
|
||||||
projectId: process.env.EXPO_PUBLIC_APPWRITE_PROJECT_ID,
|
projectId: process.env.EXPO_PUBLIC_APPWRITE_PROJECT_ID,
|
||||||
databaseId: process.env.EXPO_PUBLIC_APPWRITE_DATABASE_ID,
|
databaseId: process.env.EXPO_PUBLIC_APPWRITE_DATABASE_ID,
|
||||||
oglasuvacId: process.env.EXPO_PUBLIC_APPWRITE_OGLASUVAC_COLLECTION_ID,
|
usersId: process.env.EXPO_PUBLIC_APPWRITE_USERS_COLLECTION_ID,
|
||||||
galleryId: process.env.EXPO_PUBLIC_APPWRITE_GALERIES_COLLECTION_ID,
|
// oglasuvacId: process.env.EXPO_PUBLIC_APPWRITE_OGLASUVAC_COLLECTION_ID,
|
||||||
reviewId: process.env.EXPO_PUBLIC_APPWRITE_REVIEWS_COLLECTION_ID,
|
// galleryId: process.env.EXPO_PUBLIC_APPWRITE_GALERIES_COLLECTION_ID,
|
||||||
vehicleId: process.env.EXPO_PUBLIC_APPWRITE_VEHICLE_COLLECTION_ID,
|
// reviewId: process.env.EXPO_PUBLIC_APPWRITE_REVIEWS_COLLECTION_ID,
|
||||||
|
// vehicleId: process.env.EXPO_PUBLIC_APPWRITE_VEHICLE_COLLECTION_ID,
|
||||||
}
|
}
|
||||||
|
|
||||||
export const client = new Client();
|
export const client = new Client();
|
||||||
@ -80,35 +91,73 @@ export async function getCurrentUser() {
|
|||||||
|
|
||||||
export async function logOut(): Promise<boolean> {
|
export async function logOut(): Promise<boolean> {
|
||||||
try {
|
try {
|
||||||
const result = await account.deleteSession('current');
|
await account.deleteSession('current');
|
||||||
return result
|
return true;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("Failed to log out user:", error);
|
console.error("Failed to log out user:", error);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function getData() {
|
// export async function getData() {
|
||||||
|
// try {
|
||||||
|
// const result =await databases.listDocuments(
|
||||||
|
// config.databaseId!,
|
||||||
|
// config.vehicleId!,
|
||||||
|
// [Query.orderAsc(`$createdAt`), Query.limit(5)],
|
||||||
|
|
||||||
|
// )
|
||||||
|
// console.log(result.documents)
|
||||||
|
// return result.documents;
|
||||||
|
// }
|
||||||
|
// catch (error) {
|
||||||
|
// console.error("Failed to fetch data:", error);
|
||||||
|
// return [];
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// export async function getVehicles({filter, query, limit}: {
|
||||||
|
// filter?: string;
|
||||||
|
// query?: string;
|
||||||
|
// limit?: number;
|
||||||
|
// }){
|
||||||
|
|
||||||
|
// }
|
||||||
|
|
||||||
|
export async function saveUserToDatabase(userData: {
|
||||||
|
userId: string;
|
||||||
|
name: string;
|
||||||
|
email: string;
|
||||||
|
avatar: string;
|
||||||
|
}) {
|
||||||
try {
|
try {
|
||||||
const result =await databases.listDocuments(
|
// First check if user already exists
|
||||||
config.databaseId!,
|
try {
|
||||||
config.vehicleId!,
|
await databases.getDocument(
|
||||||
[Query.orderAsc(`$createdAt`), Query.limit(5)],
|
config.databaseId!,
|
||||||
|
config.usersId!,
|
||||||
)
|
userData.userId
|
||||||
console.log(result.documents)
|
);
|
||||||
return result.documents;
|
console.log('User already exists in database');
|
||||||
}
|
return null;
|
||||||
catch (error) {
|
} catch (error) {
|
||||||
console.error("Failed to fetch data:", error);
|
// User doesn't exist, proceed with creation
|
||||||
return [];
|
const result = await databases.createDocument(
|
||||||
|
config.databaseId!,
|
||||||
|
config.usersId!,
|
||||||
|
userData.userId,
|
||||||
|
{
|
||||||
|
name: userData.name,
|
||||||
|
email: userData.email,
|
||||||
|
avatar: userData.avatar,
|
||||||
|
createdAt: new Date().toISOString(),
|
||||||
|
}
|
||||||
|
);
|
||||||
|
console.log('User created successfully');
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error("Failed to save user data:", error);
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function getVehicles({filter, query, limit}: {
|
|
||||||
filter?: string;
|
|
||||||
query?: string;
|
|
||||||
limit?: number;
|
|
||||||
}){
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -1,9 +1,10 @@
|
|||||||
import React, { createContext, useContext, ReactNode } from "react";
|
import React, { createContext, useContext, ReactNode, useEffect } from "react";
|
||||||
|
import { saveUserToDatabase } from "./appwrite";
|
||||||
import { getCurrentUser } from "./appwrite";
|
import { getCurrentUser } from "./appwrite";
|
||||||
import { useAppwrite } from "./useAppwrite";
|
import { useAppwrite } from "./useAppwrite";
|
||||||
import { Redirect } from "expo-router";
|
import { Redirect } from "expo-router";
|
||||||
// import {replace} from "@remix-run/router";
|
// import {replace} from "@remix-run/router";
|
||||||
|
import { config } from "./appwrite";
|
||||||
|
|
||||||
interface GlobalContextType {
|
interface GlobalContextType {
|
||||||
isLoggedIn: boolean;
|
isLoggedIn: boolean;
|
||||||
@ -34,6 +35,18 @@ export const GlobalProvider = ({ children }: {children: ReactNode}) => {
|
|||||||
fn: getCurrentUser,
|
fn: getCurrentUser,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (user && !loading) {
|
||||||
|
// Save user data when they first log in
|
||||||
|
saveUserToDatabase({
|
||||||
|
userId: user.$id,
|
||||||
|
name: user.name,
|
||||||
|
email: user.email,
|
||||||
|
avatar: user.avatar,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, [user, loading]);
|
||||||
|
|
||||||
const isLoggedIn = !!user;
|
const isLoggedIn = !!user;
|
||||||
console.log(JSON.stringify(user));
|
console.log(JSON.stringify(user));
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user