/
memoryspeak
/
MemoryspeakServer
Обзор
Документация
Войти
/
memoryspeak
/
MemoryspeakServer
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
index.php
986 строк
43 KB
funxplay
create share note struct
10 дек 2025, 21:02
10 дек 2025, 21:02
5dec893
Код
Авторство
О чём код?
<?php require_once 'config.php'; require_once 'functions.php'; $db_host = DB_HOST; $db_user = DB_USER; $db_pass = DB_PASS; $db_name = DB_NAME; header('Content-type: application/json'); $input = json_decode(file_get_contents('php://input')); $input_method = $input->method ?? ''; $input_username = $input->username ?? ''; $input_md5password = $input->md5password ?? ''; $input_settings_theme = $input->settings_theme ?? 'light'; $input_settings_language = $input->settings_language ?? 'en'; $input_settings_note_time_format = $input->settings_note_time_format ?? 'source'; $input_tag = $input->tag ?? []; $input_title = $input->title ?? ''; $input_body = $input->body ?? ''; $input_files = $input->files ?? []; $input_search = $input->search ?? []; $input_file_id = $input->file_id ?? 0; $input_notes_id = $input->notes_id ?? 0; $input_note_token = $input->note_token ?? ''; $input_users_id = $input->users_id ?? []; $input_fcm_token = $input->fcm_token ?? ''; $input_device_info = $input->device_info ?? ''; $input_platform = $input->platform ?? ''; $headers = getallheaders(); $authHeader = $headers['Authorization'] ?? ''; $deviceInfo = $headers['Device-Info'] ?? ''; $platform = $headers['Platform'] ?? ''; $input_jwt = extractJWT($authHeader); try { /************************************ * CONNECT, INIT DATABASE * ************************************/ $db_connect = new PDO("mysql:host={$db_host};dbname={$db_name}", $db_user, $db_pass); $db_connect->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $db_init = $db_connect->prepare( "CREATE TABLE IF NOT EXISTS users (". "id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,". "username TEXT NOT NULL,". "md5password TEXT NOT NULL,". "settings_theme TEXT DEFAULT 'light',". "settings_language TEXT DEFAULT 'en',". "settings_note_time_format TEXT DEFAULT 'source',". "UNIQUE (username)". ");". "CREATE TABLE IF NOT EXISTS users_fcm_tokens (". "id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,". "user_id INT NOT NULL,". "fcm_token TEXT NOT NULL,". "device_info TEXT DEFAULT NULL,". "platform ENUM('android', 'ios', 'web', 'windows', 'linux') DEFAULT 'android',". "active BOOLEAN DEFAULT TRUE,". "created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,". "updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,". "FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE ON UPDATE CASCADE,". "UNIQUE KEY unique_user_token (user_id, fcm_token(255))". ");". "CREATE TABLE IF NOT EXISTS notes (". "id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,". "title TEXT DEFAULT '',". "body LONGTEXT DEFAULT '',". "created TIMESTAMP DEFAULT CURRENT_TIMESTAMP,". "datetime TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,". "token TEXT DEFAULT '',". "views INT DEFAULT 0,". "color TEXT DEFAULT '#f8f9fa',". "users_id INT NOT NULL,". "FOREIGN KEY (users_id) REFERENCES users (id) ON DELETE SET DEFAULT ON UPDATE CASCADE,". "UNIQUE (title, users_id),". "UNIQUE (token)". ");". "CREATE TABLE IF NOT EXISTS tags (". "id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,". "tag TEXT NOT NULL,". "notes_id INT NOT NULL,". "users_id INT NOT NULL,". "FOREIGN KEY (notes_id) REFERENCES notes (id) ON DELETE SET DEFAULT ON UPDATE CASCADE,". "FOREIGN KEY (users_id) REFERENCES users (id) ON DELETE SET DEFAULT ON UPDATE CASCADE". ");". "CREATE TABLE IF NOT EXISTS files (". "id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,". "filename TEXT NOT NULL,". "size INT NOT NULL,". "type TEXT DEFAULT NULL,". "extention TEXT DEFAULT NULL,". "base64 LONGTEXT NOT NULL,". "notes_id INT NOT NULL,". "users_id INT NOT NULL,". "FOREIGN KEY (notes_id) REFERENCES notes (id) ON DELETE SET DEFAULT ON UPDATE CASCADE,". "FOREIGN KEY (users_id) REFERENCES users (id) ON DELETE SET DEFAULT ON UPDATE CASCADE". ");". "INSERT IGNORE INTO users (username, md5password) VALUES (:username_0, :md5password_0);". "INSERT IGNORE INTO users (username, md5password) VALUES (:username_1, :md5password_1);". "INSERT IGNORE INTO users (username, md5password) VALUES (:username_2, :md5password_2);" ); /* !!!! DONT DELETE !!!! SET foreign_key_checks = 0; -- Drop tables drop table ... -- Drop views drop view ... SET foreign_key_checks = 1; */ $db_init->execute(DEFAULT_DATABASE_USERS_DATA); $db_init_fetchAll = $db_init->fetchAll(PDO::FETCH_ASSOC); $db_init->closeCursor(); /******************************* * GET USER FROM JWT * *******************************/ $user = getAuthenticatedUser($input_jwt, JWT_SECRET_KEY, $db_connect); /********************************** * CHECK LOGIN/PASSWORD * **********************************/ $db_get_user_id = $db_connect-> prepare("SELECT * FROM users WHERE username = :username AND md5password = :md5password;"); $db_get_user_id_answer = $db_get_user_id->execute(array('username' => $input_username, 'md5password' => $input_md5password)); $db_get_user_id_fetch = $db_get_user_id->fetch(PDO::FETCH_ASSOC); $db_get_user_id-> closeCursor(); /********************************* * NOTES COUNT BY USER * *********************************/ $db_get_notes_count = $db_connect-> prepare("SELECT COUNT(id) AS total FROM notes WHERE users_id = :users_id;"); $db_get_notes_count_answer = $db_get_notes_count->execute(array('users_id' => $db_get_user_id_fetch["id"])); $db_get_notes_count_fetch = $db_get_notes_count->fetch(PDO::FETCH_ASSOC); $db_get_notes_count-> closeCursor(); /*************************** * SWITCH METHOD * ***************************/ switch ($input_method) { /******************* * LOGIN * *******************/ case 'login': if ($db_get_user_id_fetch["username"] == $input_username && $db_get_user_id_fetch["md5password"] == $input_md5password) { /***** CREATE JWT *****/ $output_jwt = createJWT($db_get_user_id_fetch["id"], $db_get_user_id_fetch["username"], JWT_SECRET_KEY); /***** LOGIN OUTPUT *****/ $output = array( 'method' => $input_method, 'jwt' => $output_jwt, 'username' => $input_username, 'md5password' => $input_md5password, 'settings_theme' => $db_get_user_id_fetch["settings_theme"], 'settings_language' => $db_get_user_id_fetch["settings_language"], 'settings_note_time_format' => $db_get_user_id_fetch["settings_note_time_format"] ); } else { /***** LOGIN OUTPUT *****/ $output = array( 'method' => $input_method, 'exception' => 'unknown user' ); }; break; /************************** * SET SETTINGS * **************************/ case 'setsettings': /***** UPDATE NOTE *****/ $queryUpdateSettings = "UPDATE users SET settings_theme = :settings_theme, settings_language = :settings_language, settings_note_time_format = :settings_note_time_format WHERE id = :users_id;"; $executeArrayUpdateSettings = array('settings_theme' => $input_settings_theme, 'settings_language' => $input_settings_language, 'settings_note_time_format' => $input_settings_note_time_format, 'users_id' => $db_get_user_id_fetch["id"]); $dbUpdateSettings = $db_connect-> prepare($queryUpdateSettings); $dbUpdateSettings->execute($executeArrayUpdateSettings); $updateCountSettings = $dbUpdateSettings->rowCount(); $dbUpdateSettings-> closeCursor(); /***** SET SETTINGS OUTPUT *****/ $output = array( 'method' => $input_method ); break; /********************** * GET TAGS * **********************/ case 'gettag': $db_get_tags = $db_connect-> prepare( "SELECT id, tag FROM tags WHERE users_id = :users_id;" ); $db_get_tags_answer = $db_get_tags->execute( array( 'users_id' => $db_get_user_id_fetch["id"] ) ); $db_get_tags_fetch = $db_get_tags->fetchAll(PDO::FETCH_ASSOC); $db_get_tags-> closeCursor(); /***** GET TAGS OUTPUT *****/ $output = array( 'method' => $input_method, 'tags' => $db_get_tags_fetch ); break; /*************************** * GET ALL USERS * ***************************/ case 'getallusers': if ($db_get_user_id_fetch["username"] == $input_username && $db_get_user_id_fetch["md5password"] == $input_md5password) { $db_get_all_users = $db_connect-> prepare( "SELECT id, username FROM users;" ); $db_get_all_users_answer = $db_get_all_users->execute(); $db_get_all_users_fetch = $db_get_all_users->fetchAll(PDO::FETCH_ASSOC); $db_get_all_users-> closeCursor(); /***** GET ALL USERS OUTPUT *****/ $output = array( 'method' => $input_method, 'all_users' => $db_get_all_users_fetch ); } else { /***** GET ALL USERS OUTPUT *****/ $output = array( 'method' => $input_method, 'exception' => 'unregistered user' ); }; break; /********************** * SET NOTE * **********************/ case 'setnote': $db_insert_note = $db_connect->prepare( "INSERT INTO notes (title, body, token, users_id) VALUES (:title, :body, :token, :users_id);" ); $db_insert_note_answer = $db_insert_note->execute( array( 'title' => $input_title, 'body' => $input_body, 'token' => bin2hex(random_bytes(32)), 'users_id' => $db_get_user_id_fetch["id"] ) ); $lastInsertNotesId = $db_connect->lastInsertId(); $db_insert_note_fetchAll = $db_insert_note->fetchAll(PDO::FETCH_ASSOC); $db_insert_note->closeCursor(); /***** SET TAGS *****/ $lastInsertTagsIdArray = []; for ($tag_index = 0; $tag_index < count($input_tag); $tag_index++) { $db_insert_tag = $db_connect->prepare( "INSERT INTO tags (tag, users_id, notes_id) VALUES (:tag, :users_id, :notes_id);" ); $db_insert_tag_answer = $db_insert_tag->execute( array( 'tag' => $input_tag[$tag_index], 'users_id' => $db_get_user_id_fetch["id"], 'notes_id' => $lastInsertNotesId ) ); $lastInsertTagsId = $db_connect->lastInsertId(); $db_insert_tag_fetchAll = $db_insert_tag->fetchAll(PDO::FETCH_ASSOC); $db_insert_tag->closeCursor(); array_push($lastInsertTagsIdArray, $lastInsertTagsId); }; /***** SET FILES *****/ $lastInsertFilesIdArray = []; for ($file_index = 0; $file_index < count($input_files); $file_index++) { $db_insert_file = $db_connect->prepare( "INSERT INTO files (filename, size, type, extention, base64, users_id, notes_id) VALUES (:filename, :size, :type, :extention, :base64, :users_id, :notes_id);" ); $db_insert_file_answer = $db_insert_file->execute( array( 'filename' => $input_files[$file_index]->filename, 'size' => $input_files[$file_index]->size, 'type' => $input_files[$file_index]->type, 'extention' => $input_files[$file_index]->extention, 'base64' => $input_files[$file_index]->base64, 'users_id' => $db_get_user_id_fetch["id"], 'notes_id' => $lastInsertNotesId ) ); $lastInsertFilesId = $db_connect->lastInsertId(); $db_insert_file_fetchAll = $db_insert_file->fetchAll(PDO::FETCH_ASSOC); $db_insert_file->closeCursor(); array_push($lastInsertFilesIdArray, $lastInsertFilesId); }; /***** SET NOTE OUTPUT *****/ $output = array( 'method' => $input_method ); break; /************************* * CHANGE NOTE * *************************/ case 'changenote': /***** UPDATE NOTE *****/ $queryUpdateNote = "UPDATE notes SET title = :title, body = :body, token = :token WHERE id = :id AND users_id = :users_id;"; $executeArrayUpdateNote = array('title' => $input_title, 'body' => $input_body, 'token' => $input_note_token, 'id' => $input_notes_id, 'users_id' => $db_get_user_id_fetch["id"]); $dbUpdateNote = $db_connect-> prepare($queryUpdateNote); $dbUpdateNote->execute($executeArrayUpdateNote); $updateCountNotes = $dbUpdateNote->rowCount(); $dbUpdateNote-> closeCursor(); /***** DELETE TAGS *****/ $queryDeleteTags = "DELETE FROM tags WHERE notes_id = :id AND users_id = :users_id;"; $executeArrayDeleteTags = array('id' => $input_notes_id, 'users_id' => $db_get_user_id_fetch["id"]); $dbDeleteTags = $db_connect-> prepare($queryDeleteTags); $dbDeleteTags->execute($executeArrayDeleteTags); $deleteCountTags = $dbDeleteTags->rowCount(); $dbDeleteTags-> closeCursor(); /***** SET NEW TAGS *****/ $lastInsertTagsIdArray = []; for ($tag_index = 0; $tag_index < count($input_tag); $tag_index++) { $db_insert_tag = $db_connect->prepare( "INSERT INTO tags (tag, users_id, notes_id) VALUES (:tag, :users_id, :notes_id);" ); $db_insert_tag_answer = $db_insert_tag->execute( array( 'tag' => $input_tag[$tag_index], 'users_id' => $db_get_user_id_fetch["id"], 'notes_id' => $input_notes_id ) ); $lastInsertTagsId = $db_connect->lastInsertId(); $db_insert_tag_fetchAll = $db_insert_tag->fetchAll(PDO::FETCH_ASSOC); $db_insert_tag->closeCursor(); array_push($lastInsertTagsIdArray, $lastInsertTagsId); }; /***** UPDATE FILES *****/ $lastInsertFilesIdArray = []; $updateCountFiles = 0; for ($file_index = 0; $file_index < count($input_files); $file_index++) { if (is_null($input_files[$file_index]->id)) { $db_insert_file = $db_connect->prepare("INSERT INTO files (filename, size, type, extention, base64, users_id, notes_id) VALUES (:filename, :size, :type, :extention, :base64, :users_id, :notes_id);"); $db_insert_file_answer = $db_insert_file->execute( array( 'filename' => $input_files[$file_index]->filename, 'size' => $input_files[$file_index]->size, 'type' => $input_files[$file_index]->type, 'extention' => $input_files[$file_index]->extention, 'base64' => $input_files[$file_index]->base64, 'users_id' => $db_get_user_id_fetch["id"], 'notes_id' => $input_notes_id ) ); $lastInsertFilesId = $db_connect->lastInsertId(); $db_insert_file_fetchAll = $db_insert_file->fetchAll(PDO::FETCH_ASSOC); $db_insert_file->closeCursor(); array_push($lastInsertFilesIdArray, $lastInsertFilesId); } else { $queryUpdateFile = "UPDATE files SET filename = :filename, extention = :extention WHERE id = :id AND users_id = :users_id;"; $executeArrayUpdateFile = array('filename' => $input_files[$file_index]->filename, 'extention' => $input_files[$file_index]->extention, 'id' => $input_files[$file_index]->id, 'users_id' => $db_get_user_id_fetch["id"]); $dbUpdateFile = $db_connect-> prepare($queryUpdateFile); $dbUpdateFile->execute($executeArrayUpdateFile); $updateCountFiles += $dbUpdateFile->rowCount(); $dbUpdateFile-> closeCursor(); }; }; /***** CHANGE NOTE OUTPUT *****/ $output = array( 'method' => $input_method ); break; /*********************** * UPDATE TOKEN * ***********************/ case 'updatetoken': $queryUpdateToken = "UPDATE notes SET token = :token WHERE id = :notes_id AND users_id = :users_id;"; $executeArrayUpdateToken = array('token' => $input_note_token == '' ? '' : bin2hex(random_bytes(32)), 'notes_id' => $input_notes_id, 'users_id' => $db_get_user_id_fetch["id"]); $dbUpdateToken = $db_connect-> prepare($queryUpdateToken); $dbUpdateToken->execute($executeArrayUpdateToken); $updateCountToken = $dbUpdateToken->rowCount(); $dbUpdateToken-> closeCursor(); /***** SET TOKEN OUTPUT *****/ $output = array( 'method' => $input_method ); break; /********************** * GET NOTE * **********************/ case 'getnote': $resultArray = []; /***** RUN FROM INPUT SEARCH *****/ for ($indexOfInputSearch = 0; $indexOfInputSearch < count($input_search); $indexOfInputSearch++) { /***** RESULT ARRAY FOR EVERY INPUT SEARCH *****/ $result = []; /***** GET QUERIES FROM INPUT SEARCH *****/ $queries = $input_search[$indexOfInputSearch]->queries; $queriesLength = count($queries); /***** GET TAGS FROM INPUT SEARCH *****/ $tags = $input_search[$indexOfInputSearch]->tags; $tagsLength = count($tags); $notes_id = []; /***** GET NOTES ID ARRAY FROM QUARIES AND TAGS *****/ if ($queries != []) { /***** IF QUERIES IS NOT EMPTY *****/ $queryStringTitleAndBodyLike = "SELECT id FROM notes WHERE (users_id = :users_id"; $queryStringTitleLike = ""; $queryStringBodyLike = ""; $queryStringFilenameLike = "SELECT notes_id FROM files WHERE users_id = :users_id"; $executeArrayTitleAndBodyLike = array('users_id' => $db_get_user_id_fetch["id"]); $executeArrayFilenameLike = array('users_id' => $db_get_user_id_fetch["id"]); for ($indexOfQueries = 0; $indexOfQueries < $queriesLength; $indexOfQueries++) { /***** GENERATE "LIKE" QUERIES FOR TITLE, BODY AND FILENAME *****/ $queryNameTitleLike = "query_title_like_".$indexOfQueries; $queryNameBodyLike = "query_body_like_".$indexOfQueries; $queryNameFilenameLike = "query_filename_like_".$indexOfQueries; $queryStringTitleLike .= " AND title LIKE :".$queryNameTitleLike; $queryStringBodyLike .= " AND body LIKE :".$queryNameBodyLike; $queryStringFilenameLike .= " AND filename LIKE :".$queryNameFilenameLike; $executeArrayTitleAndBodyLike[$queryNameTitleLike] = '%'.$queries[$indexOfQueries].'%'; $executeArrayTitleAndBodyLike[$queryNameBodyLike] = '%'.$queries[$indexOfQueries].'%'; $executeArrayFilenameLike[$queryNameFilenameLike] = '%'.$queries[$indexOfQueries].'%'; }; /***** SET DB FULL QUERY TO GET NOTES ID *****/ $queryStringTitleAndBodyLike .= $queryStringTitleLike.") OR (users_id = :users_id".$queryStringBodyLike.");"; $dbGetNotesIds = $db_connect-> prepare($queryStringTitleAndBodyLike); $dbGetNotesIds->execute($executeArrayTitleAndBodyLike); $dbGetNotesIdsFetch = $dbGetNotesIds->fetchAll(PDO::FETCH_ASSOC); $dbGetNotesIds-> closeCursor(); /***** SET DB FULL QUERY TO GET FILES ID *****/ $queryStringFilenameLike .= ";"; $dbGetFilesIds = $db_connect-> prepare($queryStringFilenameLike); $dbGetFilesIds->execute($executeArrayFilenameLike); $dbGetFilesIdsFetch = $dbGetFilesIds->fetchAll(PDO::FETCH_ASSOC); $dbGetFilesIds-> closeCursor(); /***** FILL NOTES ID ARRAY *****/ for ($indexOfDbGetNotesIdsFetch = 0; $indexOfDbGetNotesIdsFetch < count($dbGetNotesIdsFetch); $indexOfDbGetNotesIdsFetch++) { array_push($notes_id, $dbGetNotesIdsFetch[$indexOfDbGetNotesIdsFetch]["id"]); }; for ($indexOfDbGetFilesIdsFetch = 0; $indexOfDbGetFilesIdsFetch < count($dbGetFilesIdsFetch); $indexOfDbGetFilesIdsFetch++) { array_push($notes_id, $dbGetFilesIdsFetch[$indexOfDbGetFilesIdsFetch]["notes_id"]); }; /***** SORTED NOTES ID ARRAY *****/ $notes_id = array_unique($notes_id, SORT_REGULAR); if ($tags != []) { /***** GENERATE TAGS LIKE RESULT *****/ $queryStringTagLike = "SELECT notes_id FROM tags WHERE users_id = :users_id AND ("; $executeArrayTagLike = array('users_id' => $db_get_user_id_fetch["id"]); for ($indexOfTags = 0; $indexOfTags < $tagsLength; $indexOfTags++) { if ($indexOfTags != ($tagsLength - 1)) { $queryNameTagLike = "query_tag_like_".$indexOfTags; $queryStringTagLike .= "tag LIKE :".$queryNameTagLike." OR "; $executeArrayTagLike[$queryNameTagLike] = '%'.$tags[$indexOfTags].'%'; } else { $queryNameTagLike = "query_tag_like_".$indexOfTags; $queryStringTagLike .= "tag LIKE :".$queryNameTagLike; $executeArrayTagLike[$queryNameTagLike] = '%'.$tags[$indexOfTags].'%'; }; }; $queryStringTagLike .= ");"; $dbGetTagsIds = $db_connect-> prepare($queryStringTagLike); $dbGetTagsIds->execute($executeArrayTagLike); $dbGetTagsIdsFetch = $dbGetTagsIds->fetchAll(PDO::FETCH_ASSOC); $dbGetTagsIds-> closeCursor(); $notes_id_cross_tags = []; for ($indexOfDbGetTagsIdsFetch = 0; $indexOfDbGetTagsIdsFetch < count($dbGetTagsIdsFetch); $indexOfDbGetTagsIdsFetch++) { for ($indexOfNotesIdArray = 0; $indexOfNotesIdArray < count($notes_id); $indexOfNotesIdArray++) { if ($notes_id[$indexOfNotesIdArray] == $dbGetTagsIdsFetch[$indexOfDbGetTagsIdsFetch]["notes_id"]) { array_push($notes_id_cross_tags, $notes_id[$indexOfNotesIdArray]); }; }; }; $notes_id_cross_tags = array_unique($notes_id_cross_tags, SORT_REGULAR); $notes_id = $notes_id_cross_tags; }; } else { /***** IF QUERIES IS EMPTY *****/ /***** GENERATE ONLY TAGS LIKE RESULT *****/ $queryStringTagLike = "SELECT notes_id FROM tags WHERE users_id = :users_id AND ("; $executeArrayTagLike = array('users_id' => $db_get_user_id_fetch["id"]); for ($indexOfTags = 0; $indexOfTags < $tagsLength; $indexOfTags++) { if ($indexOfTags != ($tagsLength - 1)) { $queryNameTagLike = "query_tag_like_".$indexOfTags; $queryStringTagLike .= "tag LIKE :".$queryNameTagLike." OR "; $executeArrayTagLike[$queryNameTagLike] = '%'.$tags[$indexOfTags].'%'; } else { $queryNameTagLike = "query_tag_like_".$indexOfTags; $queryStringTagLike .= "tag LIKE :".$queryNameTagLike; $executeArrayTagLike[$queryNameTagLike] = '%'.$tags[$indexOfTags].'%'; }; }; $queryStringTagLike .= ");"; $dbGetTagsIds = $db_connect-> prepare($queryStringTagLike); $dbGetTagsIds->execute($executeArrayTagLike); $dbGetTagsIdsFetch = $dbGetTagsIds->fetchAll(PDO::FETCH_ASSOC); $dbGetTagsIds-> closeCursor(); for ($indexOfDbGetTagsIdsFetch = 0; $indexOfDbGetTagsIdsFetch < count($dbGetTagsIdsFetch); $indexOfDbGetTagsIdsFetch++) { array_push($notes_id, $dbGetTagsIdsFetch[$indexOfDbGetTagsIdsFetch]["notes_id"]); }; $notes_id = array_unique($notes_id, SORT_REGULAR); }; if ($notes_id != []) { /***** GENERATE NOTES RESULT *****/ for ($note_id = 0; $note_id < count($notes_id); $note_id++) { $queryUpdateNote = "UPDATE notes SET views = views + 1 WHERE id = :notes_id;"; $executeArrayUpdateNote = array('notes_id' => $notes_id[$note_id]); $dbUpdateNote = $db_connect-> prepare($queryUpdateNote); $dbUpdateNote->execute($executeArrayUpdateNote); $updateCountNotes = $dbUpdateNote->rowCount(); $dbUpdateNote-> closeCursor(); $queryStringByNotesId = "SELECT title, body, created, datetime, token, views, users_id FROM notes WHERE id = :id;"; $executeArrayByNotesId = array('id' => $notes_id[$note_id]); $dbGetByNotesId = $db_connect-> prepare($queryStringByNotesId); $dbGetByNotesId->execute($executeArrayByNotesId); $dbGetByNotesIdFetch = $dbGetByNotesId->fetch(PDO::FETCH_ASSOC); $dbGetByNotesId-> closeCursor(); $queryStringTagsByNotesId = "SELECT tag FROM tags WHERE notes_id = :notes_id;"; $executeArrayTagsByNotesId = array('notes_id' => $notes_id[$note_id]); $dbGetTagsByNotesId = $db_connect-> prepare($queryStringTagsByNotesId); $dbGetTagsByNotesId->execute($executeArrayTagsByNotesId); $dbGetTagsByNotesIdFetch = $dbGetTagsByNotesId->fetchAll(PDO::FETCH_ASSOC); $dbGetTagsByNotesId-> closeCursor(); $queryStringFilesByNotesId = "SELECT id, filename, size, type, extention FROM files WHERE notes_id = :notes_id;"; $executeArrayFilesByNotesId = array('notes_id' => $notes_id[$note_id]); $dbGetFilesByNotesId = $db_connect-> prepare($queryStringFilesByNotesId); $dbGetFilesByNotesId->execute($executeArrayFilesByNotesId); $dbGetFilesByNotesIdFetch = $dbGetFilesByNotesId->fetchAll(PDO::FETCH_ASSOC); $dbGetFilesByNotesId-> closeCursor(); $queryStringUsernameByUsersId = "SELECT username FROM users WHERE id = :users_id;"; $executeArrayUsernameByUsersId = array('users_id' => $dbGetByNotesIdFetch["users_id"]); $dbGetUsernameByUsersId = $db_connect-> prepare($queryStringUsernameByUsersId); $dbGetUsernameByUsersId->execute($executeArrayUsernameByUsersId); $dbGetUsernameByUsersIdFetch = $dbGetUsernameByUsersId->fetch(PDO::FETCH_ASSOC); $dbGetUsernameByUsersId-> closeCursor(); array_push($result, array( "id" => $notes_id[$note_id], "tags" => $dbGetTagsByNotesIdFetch, "title" => $dbGetByNotesIdFetch["title"], "body" => $dbGetByNotesIdFetch["body"], "note_token" => $dbGetByNotesIdFetch["token"], "views" => $dbGetByNotesIdFetch["views"], "files" => $dbGetFilesByNotesIdFetch, "created" => $dbGetByNotesIdFetch["created"], "datetime" => $dbGetByNotesIdFetch["datetime"], "username" => $dbGetUsernameByUsersIdFetch["username"] )); }; }; /***** SORTED RESULT *****/ $result = array_unique($result, SORT_REGULAR); array_push($resultArray, $result); }; /***** GET NOTE OUTPUT *****/ $output = array( 'method' => $input_method, 'result' => $resultArray, 'notescount' => $db_get_notes_count_fetch["total"], ); break; /*************************** * GET ALL NOTES * ***************************/ case 'getallnotes': $resultArray = []; /***** RESULT ARRAY FOR EVERY INPUT SEARCH *****/ $result = []; $notes_id = []; /***** GET NOTES ID ARRAY *****/ $queryStringGetNotesIds = "SELECT id FROM notes WHERE users_id = :users_id;"; $executeArrayGetNotesIds = array('users_id' => $db_get_user_id_fetch["id"]); $dbGetNotesIds = $db_connect-> prepare($queryStringGetNotesIds); $dbGetNotesIds->execute($executeArrayGetNotesIds); $dbGetNotesIdsFetch = $dbGetNotesIds->fetchAll(PDO::FETCH_ASSOC); $dbGetNotesIds-> closeCursor(); for ($indexOfDbGetNotesIdsFetch = 0; $indexOfDbGetNotesIdsFetch < count($dbGetNotesIdsFetch); $indexOfDbGetNotesIdsFetch++) { array_push($notes_id, $dbGetNotesIdsFetch[$indexOfDbGetNotesIdsFetch]["id"]); }; $notes_id = array_unique($notes_id, SORT_REGULAR); if ($notes_id != []) { /***** GENERATE NOTES RESULT *****/ for ($note_id = 0; $note_id < count($notes_id); $note_id++) { $queryUpdateNote = "UPDATE notes SET views = views + 1 WHERE id = :notes_id;"; $executeArrayUpdateNote = array('notes_id' => $notes_id[$note_id]); $dbUpdateNote = $db_connect-> prepare($queryUpdateNote); $dbUpdateNote->execute($executeArrayUpdateNote); $updateCountNotes = $dbUpdateNote->rowCount(); $dbUpdateNote-> closeCursor(); $queryStringByNotesId = "SELECT title, body, created, datetime, token, views, users_id FROM notes WHERE id = :id;"; $executeArrayByNotesId = array('id' => $notes_id[$note_id]); $dbGetByNotesId = $db_connect-> prepare($queryStringByNotesId); $dbGetByNotesId->execute($executeArrayByNotesId); $dbGetByNotesIdFetch = $dbGetByNotesId->fetch(PDO::FETCH_ASSOC); $dbGetByNotesId-> closeCursor(); $queryStringTagsByNotesId = "SELECT tag FROM tags WHERE notes_id = :notes_id;"; $executeArrayTagsByNotesId = array('notes_id' => $notes_id[$note_id]); $dbGetTagsByNotesId = $db_connect-> prepare($queryStringTagsByNotesId); $dbGetTagsByNotesId->execute($executeArrayTagsByNotesId); $dbGetTagsByNotesIdFetch = $dbGetTagsByNotesId->fetchAll(PDO::FETCH_ASSOC); $dbGetTagsByNotesId-> closeCursor(); $queryStringFilesByNotesId = "SELECT id, filename, size, type, extention FROM files WHERE notes_id = :notes_id;"; $executeArrayFilesByNotesId = array('notes_id' => $notes_id[$note_id]); $dbGetFilesByNotesId = $db_connect-> prepare($queryStringFilesByNotesId); $dbGetFilesByNotesId->execute($executeArrayFilesByNotesId); $dbGetFilesByNotesIdFetch = $dbGetFilesByNotesId->fetchAll(PDO::FETCH_ASSOC); $dbGetFilesByNotesId-> closeCursor(); $queryStringUsernameByUsersId = "SELECT username FROM users WHERE id = :users_id;"; $executeArrayUsernameByUsersId = array('users_id' => $dbGetByNotesIdFetch["users_id"]); $dbGetUsernameByUsersId = $db_connect-> prepare($queryStringUsernameByUsersId); $dbGetUsernameByUsersId->execute($executeArrayUsernameByUsersId); $dbGetUsernameByUsersIdFetch = $dbGetUsernameByUsersId->fetch(PDO::FETCH_ASSOC); $dbGetUsernameByUsersId-> closeCursor(); array_push($result, array( "id" => $notes_id[$note_id], "tags" => $dbGetTagsByNotesIdFetch, "title" => $dbGetByNotesIdFetch["title"], "body" => $dbGetByNotesIdFetch["body"], "note_token" => $dbGetByNotesIdFetch["token"], "views" => $dbGetByNotesIdFetch["views"], "files" => $dbGetFilesByNotesIdFetch, "created" => $dbGetByNotesIdFetch["created"], "datetime" => $dbGetByNotesIdFetch["datetime"], "username" => $dbGetUsernameByUsersIdFetch["username"] )); }; }; /***** SORTED RESULT *****/ $result = array_unique($result, SORT_REGULAR); array_push($resultArray, $result); /***** GET ALL NOTES OUTPUT *****/ $output = array( 'method' => $input_method, 'result' => $resultArray, 'notescount' => $db_get_notes_count_fetch["total"], ); break; /********************** * GET FILE * **********************/ case 'getfile': $queryBase64 = "SELECT base64 FROM files WHERE id = :id;"; $executeArrayBase64 = array('id' => $input_file_id); $dbGetBase64 = $db_connect-> prepare($queryBase64); $dbGetBase64->execute($executeArrayBase64); $dbGetBase64Fetch = $dbGetBase64->fetch(PDO::FETCH_ASSOC); $dbGetBase64-> closeCursor(); /***** GET FILE OUTPUT *****/ $output = array( 'method' => $input_method, 'file_id' =>$input_file_id, 'base64' => $dbGetBase64Fetch["base64"] ); break; /******************************** * GET JSON SIZE FILE * ********************************/ case 'getjsonsizefile': $queryBase64 = "SELECT base64 FROM files WHERE id = :id;"; $executeArrayBase64 = array('id' => $input_file_id); $dbGetBase64 = $db_connect-> prepare($queryBase64); $dbGetBase64->execute($executeArrayBase64); $dbGetBase64Fetch = $dbGetBase64->fetch(PDO::FETCH_ASSOC); $dbGetBase64-> closeCursor(); $content = array( 'method' => "getfile", 'base64' => $dbGetBase64Fetch["base64"] ); $json_size = mb_strlen(json_encode($content, JSON_NUMERIC_CHECK), '8bit'); /***** GET JSON SIZE FILE OUTPUT *****/ $output = array( 'method' => $input_method, 'json_size' => $json_size ); break; /************************* * DELETE FILE * *************************/ case 'deletefile': $queryDeleteFile = "DELETE FROM files WHERE id = :id AND users_id = :users_id;"; $executeArrayDeleteFile = array('id' => $input_file_id, 'users_id' => $db_get_user_id_fetch["id"]); $dbDeleteFile = $db_connect-> prepare($queryDeleteFile); $dbDeleteFile->execute($executeArrayDeleteFile); $deleteCount = $dbDeleteFile->rowCount(); $dbDeleteFile-> closeCursor(); /***** DELETE FILE OUTPUT *****/ $output = array( 'method' => $input_method, 'deleteCount' => $deleteCount ); break; /************************* * DELETE NOTE * *************************/ case 'deletenote': $queryDeleteTags = "DELETE FROM tags WHERE notes_id = :id AND users_id = :users_id;"; $executeArrayDeleteTags = array('id' => $input_notes_id, 'users_id' => $db_get_user_id_fetch["id"]); $dbDeleteTags = $db_connect-> prepare($queryDeleteTags); $dbDeleteTags->execute($executeArrayDeleteTags); $deleteCountTags = $dbDeleteTags->rowCount(); $dbDeleteTags-> closeCursor(); $queryDeleteFiles = "DELETE FROM files WHERE notes_id = :id AND users_id = :users_id;"; $executeArrayDeleteFiles = array('id' => $input_notes_id, 'users_id' => $db_get_user_id_fetch["id"]); $dbDeleteFiles = $db_connect-> prepare($queryDeleteFiles); $dbDeleteFiles->execute($executeArrayDeleteFiles); $deleteCountFiles = $dbDeleteFiles->rowCount(); $dbDeleteFiles-> closeCursor(); $queryDeleteNote = "DELETE FROM notes WHERE id = :id AND users_id = :users_id;"; $executeArrayDeleteNote = array('id' => $input_notes_id, 'users_id' => $db_get_user_id_fetch["id"]); $dbDeleteNote = $db_connect-> prepare($queryDeleteNote); $dbDeleteNote->execute($executeArrayDeleteNote); $deleteCountNotes = $dbDeleteNote->rowCount(); $dbDeleteNote-> closeCursor(); /***** DELETE NOTE OUTPUT *****/ $output = array( 'method' => $input_method, 'deleteCountTags' => $deleteCountTags, 'deleteCountFiles' => $deleteCountFiles, 'deleteCountNotes' => $deleteCountNotes ); break; /*********************** * GET SHARE * ***********************/ case 'getshare': $queryUpdateNote = "UPDATE notes SET views = views + 1 WHERE token = :token;"; $executeArrayUpdateNote = array('token' => $input_note_token); $dbUpdateNote = $db_connect-> prepare($queryUpdateNote); $dbUpdateNote->execute($executeArrayUpdateNote); $updateCountNotes = $dbUpdateNote->rowCount(); $dbUpdateNote-> closeCursor(); $queryStringNotesByToken = "SELECT id, title, body, created, datetime, token, views, users_id FROM notes WHERE token = :token;"; $executeArrayNotesByToken = array('token' => $input_note_token); $dbGetNotesByToken = $db_connect-> prepare($queryStringNotesByToken); $dbGetNotesByToken->execute($executeArrayNotesByToken); $dbGetNotesByTokenFetch = $dbGetNotesByToken->fetch(PDO::FETCH_ASSOC); $dbGetNotesByToken-> closeCursor(); $queryStringTagsByNotesId = "SELECT tag FROM tags WHERE notes_id = :notes_id;"; $executeArrayTagsByNotesId = array('notes_id' => $dbGetNotesByTokenFetch["id"]); $dbGetTagsByNotesId = $db_connect-> prepare($queryStringTagsByNotesId); $dbGetTagsByNotesId->execute($executeArrayTagsByNotesId); $dbGetTagsByNotesIdFetch = $dbGetTagsByNotesId->fetchAll(PDO::FETCH_ASSOC); $dbGetTagsByNotesId-> closeCursor(); $queryStringFilesByNotesId = "SELECT id, filename, size, type, extention, base64 FROM files WHERE notes_id = :notes_id;"; $executeArrayFilesByNotesId = array('notes_id' => $dbGetNotesByTokenFetch["id"]); $dbGetFilesByNotesId = $db_connect-> prepare($queryStringFilesByNotesId); $dbGetFilesByNotesId->execute($executeArrayFilesByNotesId); $dbGetFilesByNotesIdFetch = $dbGetFilesByNotesId->fetchAll(PDO::FETCH_ASSOC); $dbGetFilesByNotesId-> closeCursor(); $queryStringUsernameByUsersId = "SELECT username FROM users WHERE id = :users_id;"; $executeArrayUsernameByUsersId = array('users_id' => $dbGetNotesByTokenFetch["users_id"]); $dbGetUsernameByUsersId = $db_connect-> prepare($queryStringUsernameByUsersId); $dbGetUsernameByUsersId->execute($executeArrayUsernameByUsersId); $dbGetUsernameByUsersIdFetch = $dbGetUsernameByUsersId->fetch(PDO::FETCH_ASSOC); $dbGetUsernameByUsersId-> closeCursor(); $dbGetNotesCount = $db_connect-> prepare("SELECT COUNT(id) AS total FROM notes WHERE users_id = :users_id;"); $dbGetNotesCountAnswer = $dbGetNotesCount->execute(array('users_id' => $dbGetNotesByTokenFetch["users_id"])); $dbGetNotesCountFetch = $dbGetNotesCount->fetch(PDO::FETCH_ASSOC); $dbGetNotesCount-> closeCursor(); /***** GET SHARE OUTPUT *****/ $output = array( 'method' => $input_method, 'id' => $dbGetNotesByTokenFetch["id"], 'tags' => $dbGetTagsByNotesIdFetch, 'title' => $dbGetNotesByTokenFetch["title"], 'body' => $dbGetNotesByTokenFetch["body"], 'note_token' => $dbGetNotesByTokenFetch["token"], 'views' => $dbGetNotesByTokenFetch["views"], 'files' => $dbGetFilesByNotesIdFetch, 'created' => $dbGetNotesByTokenFetch["created"], 'datetime' => $dbGetNotesByTokenFetch["datetime"], 'username' => $dbGetUsernameByUsersIdFetch["username"], 'notescount' => $dbGetNotesCountFetch["total"] ); break; /************************ * SEND SHARE * ************************/ case 'sendshare': if (empty($input_note_token)) { $output = array( 'method' => $input_method, 'exception' => 'invalid token' ); break; }; if ($user['exception'] != ''/*$db_get_user_id_fetch["username"] !== $input_username || $db_get_user_id_fetch["md5password"] !== $input_md5password*/) { $output = array( 'method' => $input_method, 'exception' => $user['exception'] ); break; }; $queryNotesByToken = "SELECT id, title, body, users_id FROM notes WHERE token = :token;"; $executeArrayNotesByToken = array('token' => $input_note_token); $dbGetNotesByToken = $db_connect-> prepare($queryNotesByToken); $dbGetNotesByToken->execute($executeArrayNotesByToken); $dbGetNotesByTokenFetch = $dbGetNotesByToken->fetch(PDO::FETCH_ASSOC); $dbGetNotesByToken-> closeCursor(); if (!$dbGetNotesByTokenFetch) { $output = array( 'method' => $input_method, 'exception' => 'note not found' ); break; }; //$senderUsername = $db_get_user_id_fetch["username"]; $senderUsername = $user['username']; $noteTitle = $dbGetNotesByTokenFetch["title"]; $shortNoteBody = substr($dbGetNotesByTokenFetch["body"], 0, 200); $notificationData = [ 'title' => $senderUsername, 'body' => $noteTitle . "\n" . $shortNoteBody, 'token' => $input_note_token, 'sender' => $senderUsername ]; $successCount = 0; $failCount = 0; $results = []; foreach ($input_users_id as $targetId) { $queryGetFcmTokens = "SELECT fcm_token FROM users_fcm_tokens WHERE user_id = :user_id AND active = 1 AND updated_at > NOW() - INTERVAL 3 MONTH;"; $executeArrayGetFcmTokens = array('user_id' => $targetId); $dbGetFcmTokens = $db_connect-> prepare($queryGetFcmTokens); $dbGetFcmTokens->execute($executeArrayGetFcmTokens); $dbGetFcmTokensFetch = $dbGetFcmTokens->fetchAll(PDO::FETCH_COLUMN); $dbGetFcmTokens-> closeCursor(); foreach ($dbGetFcmTokensFetch as $fcmToken) { $sendResult = sendFirebaseNotificationAboutNewNote($fcmToken, $notificationData); if ($sendResult['success']) { $successCount++; } else { $failCount++; $results[] = [ 'user_id' => $targetId, 'token' => substr($fcmToken, 0, 10) . '...', 'error' => $sendResult['error'] ]; }; }; }; /***** SEND SHARE OUTPUT *****/ if ($results !== []) { $output = array( 'method' => $input_method, 'exception' => json_encode($results) ); } else { $output = array( 'method' => $input_method ); } break; /********************** * SEND FCM * **********************/ case 'sendfcm': if (empty($input_fcm_token)) { $output = array( 'method' => $input_method, 'exception' => 'invalid fcm token' ); break; }; if ($user['exception'] != ''/*$db_get_user_id_fetch["username"] !== $input_username || $db_get_user_id_fetch["md5password"] !== $input_md5password*/) { $queryDeactivateOld = "UPDATE users_fcm_tokens SET active = 0 WHERE fcm_token = :fcm_token;"; $executeArrayDeactivateOld = array('fcm_token' => $input_fcm_token); $dbDeactivateOld = $db_connect-> prepare($queryDeactivateOld); $dbDeactivateOld->execute($executeArrayDeactivateOld); $dbDeactivateOld-> closeCursor(); $output = array( 'method' => $input_method, 'exception' => $user['exception'] ); break; }; $queryCheckToken = "SELECT id FROM users_fcm_tokens WHERE user_id = :user_id AND fcm_token = :fcm_token;"; //$executeArrayCheckToken = array('user_id' => $db_get_user_id_fetch["id"], 'fcm_token' => $input_fcm_token); $executeArrayCheckToken = array('user_id' => $user['user_id'], 'fcm_token' => $input_fcm_token); $dbCheckToken = $db_connect-> prepare($queryCheckToken); $dbCheckToken->execute($executeArrayCheckToken); $dbCheckTokenFetch = $dbCheckToken->fetch(PDO::FETCH_ASSOC); $dbCheckToken-> closeCursor(); if ($dbCheckTokenFetch) { $queryUpdateToken = "UPDATE users_fcm_tokens SET active = 1, device_info = :device_info, platform = :platform, updated_at = CURRENT_TIMESTAMP WHERE id = :id;"; //$executeArrayUpdateToken = array('device_info' => $input_device_info, 'platform' => $input_platform, 'id' => $dbCheckTokenFetch['id']); $executeArrayUpdateToken = array('device_info' => $deviceInfo, 'platform' => $platform, 'id' => $dbCheckTokenFetch['id']); $dbUpdateToken = $db_connect-> prepare($queryUpdateToken); $dbUpdateToken->execute($executeArrayUpdateToken); $dbUpdateToken-> closeCursor(); } else { $queryDeactivateOld = "UPDATE users_fcm_tokens SET active = 0 WHERE user_id = :user_id;"; //$executeArrayDeactivateOld = array('user_id' => $db_get_user_id_fetch["id"]); $executeArrayDeactivateOld = array('user_id' => $user['user_id']); $dbDeactivateOld = $db_connect-> prepare($queryDeactivateOld); $dbDeactivateOld->execute($executeArrayDeactivateOld); $dbDeactivateOld-> closeCursor(); $queryInsertToken = "INSERT INTO users_fcm_tokens (user_id, fcm_token, device_info, platform) VALUES (:user_id, :fcm_token, :device_info, :platform);"; //$executeArrayInsertToken = array('user_id' => $db_get_user_id_fetch["id"], 'fcm_token' => $input_fcm_token, 'device_info' => $input_device_info, 'platform' => $input_platform); $executeArrayInsertToken = array('user_id' => $user['user_id'], 'fcm_token' => $input_fcm_token, 'device_info' => $deviceInfo, 'platform' => $platform); $dbInsertToken = $db_connect->prepare($queryInsertToken); $dbInsertToken->execute($executeArrayInsertToken); $lastInsertTokenId = $db_connect->lastInsertId(); $dbInsertTokenFetchAll = $dbInsertToken->fetchAll(PDO::FETCH_ASSOC); $dbInsertToken->closeCursor(); }; /***** SEND FCM *****/ $output = array( 'method' => $input_method ); break; default: /***** UNKNOWN METHOD OUTPUT *****/ $output = array( 'method' => $input_method, 'exception' => 'unknown method' ); break; }; } catch(PDOException $exception) { /***** PDO EXCEPTION OUTPUT *****/ $output = array( 'method' => $input_method, 'exception' => $exception->getMessage() ); }; echo json_encode($output); ?>