diff --git a/.env.example b/.env.example deleted file mode 100644 index e3a4e6c..0000000 --- a/.env.example +++ /dev/null @@ -1,11 +0,0 @@ -# настройки для бд -NAME_DB = "название бд" -ECHO_DB = "булево значение для дебага бд" - -# настройки бекенда -HOST_APP=ip или доменное имя для app -PORT_APP=порт для app -IS_RELOAD=True для разработки, False для обычного использования - -#настройки фронтенда -FRONTEND_ORIGINS=url для cors1,url для cors2 diff --git a/.gitignore b/.gitignore index 5164f54..6980809 100644 --- a/.gitignore +++ b/.gitignore @@ -1,208 +1,52 @@ -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[codz] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -build/ -develop-eggs/ +# Node / Frontend +node_modules/ dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -share/python-wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST +coverage/ +npm-debug.log* +.yarn/* +.pnpm-debug.log* +.vite/ +.sass-cache/ +.sourcemaps/ +.versions/ -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec +# Ionic / Cordova / Capacitor +/platforms/ +/plugins/ +/www/ +/.ionic/ -# Installer logs -pip-log.txt -pip-delete-this-directory.txt +# Tauri +target/ +gen/ -# Unit test / coverage reports -htmlcov/ -.tox/ -.nox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -*.py.cover -.hypothesis/ -.pytest_cache/ -cover/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log -local_settings.py -db.sqlite3 -db.sqlite3-journal +# Database +*.db +*.sqlite *.sqlite3 -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ - -# PyBuilder -.pybuilder/ -target/ - -# Jupyter Notebook -.ipynb_checkpoints - -# IPython -profile_default/ -ipython_config.py - -# pyenv -# For a library or package, you might want to ignore these files since the code is -# intended to run in multiple environments; otherwise, check them in: -# .python-version - -# pipenv -# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. -# However, in case of collaboration, if having platform-specific dependencies or dependencies -# having no cross-platform support, pipenv may install dependencies that don't work, or not -# install all needed dependencies. -#Pipfile.lock - -# UV -# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control. -# This is especially recommended for binary packages to ensure reproducibility, and is more -# commonly ignored for libraries. -#uv.lock - -# poetry -# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. -# This is especially recommended for binary packages to ensure reproducibility, and is more -# commonly ignored for libraries. -# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control -#poetry.lock -#poetry.toml - -# pdm -# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. -# pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python. -# https://pdm-project.org/en/latest/usage/project/#working-with-version-control -#pdm.lock -#pdm.toml -.pdm-python -.pdm-build/ - -# pixi -# Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control. -#pixi.lock -# Pixi creates a virtual environment in the .pixi directory, just like venv module creates one -# in the .venv directory. It is recommended not to include this directory in version control. -.pixi - -# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm -__pypackages__/ - -# Celery stuff -celerybeat-schedule -celerybeat.pid - -# SageMath parsed files -*.sage.py - -# Environments +# Environment files .env -.envrc -.venv -env/ -venv/ -ENV/ -env.bak/ -venv.bak/ -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site - -# mypy -.mypy_cache/ -.dmypy.json -dmypy.json - -# Pyre type checker -.pyre/ - -# pytype static type analyzer -.pytype/ - -# Cython debug symbols -cython_debug/ - -# PyCharm -# JetBrains specific template is maintained in a separate JetBrains.gitignore that can -# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore -# and can be added to the global gitignore or merged into this file. For a more nuclear -# option (not recommended) you can uncomment the following to ignore the entire idea folder. -#.idea/ - -# Abstra -# Abstra is an AI-powered process automation framework. -# Ignore directories containing user credentials, local state, and settings. -# Learn more at https://abstra.io/docs -.abstra/ - -# Visual Studio Code -# Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore -# that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore -# and can be added to the global gitignore or merged into this file. However, if you prefer, -# you could uncomment the following to ignore the entire vscode folder +# IDEs .vscode/ +.idea/ +*.sublime-project +*.sublime-workspace -# Ruff stuff: -.ruff_cache/ +# OS / System +.DS_Store +Thumbs.db +$RECYCLE.BIN/ +UserInterfaceState.xcuserstate -# PyPI configuration file -.pypirc +# Logs +*.log +log.txt -# Cursor -# Cursor is an AI-powered code editor. `.cursorignore` specifies files/directories to -# exclude from AI features like autocomplete and code analysis. Recommended for sensitive data -# refer to https://docs.cursor.com/context/ignore-files -.cursorignore -.cursorindexingignore - -# Marimo -marimo/_static/ -marimo/_lsp/ -__marimo__/ +# Temporary files +*~ +*.sw[mnpcod] +.tmp +*.tmp +*.tmp.* diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 2844f16..2fbbd11 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -7,26 +7,3 @@ repos: - id: check-case-conflict - id: check-merge-conflict - id: end-of-file-fixer - - - repo: https://github.com/asottile/pyupgrade - rev: v3.21.2 - hooks: - - id: pyupgrade - args: [ --py313-plus ] - - - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.13.0 - hooks: - - id: ruff-check - args: [ "--fix", "--line-length=120" ] - - - repo: https://foundry.fsky.io/vel/ty-pre-commit - rev: 0.0.3 - hooks: - - id: ty-check - additional_dependencies: - - sqlalchemy - - alembic - - pydantic-settings - - fastapi - - uvicorn diff --git a/.python-version b/.python-version deleted file mode 100644 index 3e388a4..0000000 --- a/.python-version +++ /dev/null @@ -1 +0,0 @@ -3.13.2 diff --git a/alembic.ini b/alembic.ini deleted file mode 100644 index 0010f4a..0000000 --- a/alembic.ini +++ /dev/null @@ -1,147 +0,0 @@ -# A generic, single database configuration. - -[alembic] -# path to migration scripts. -# this is typically a path given in POSIX (e.g. forward slashes) -# format, relative to the token %(here)s which refers to the location of this -# ini file -script_location = %(here)s/src/kawai_focus_v2/database/alembic - -# template used to generate migration file names; The default value is %%(rev)s_%%(slug)s -# Uncomment the line below if you want the files to be prepended with date and time -# see https://alembic.sqlalchemy.org/en/latest/tutorial.html#editing-the-ini-file -# for all available tokens -file_template = %%(year)d_%%(month).2d_%%(day).2d_%%(hour).2d%%(minute).2d-%%(rev)s_%%(slug)s - -# sys.path path, will be prepended to sys.path if present. -# defaults to the current working directory. for multiple paths, the path separator -# is defined by "path_separator" below. -prepend_sys_path = . - - -# timezone to use when rendering the date within the migration file -# as well as the filename. -# If specified, requires the tzdata library which can be installed by adding -# `alembic[tz]` to the pip requirements. -# string value is passed to ZoneInfo() -# leave blank for localtime -# timezone = - -# max length of characters to apply to the "slug" field -# truncate_slug_length = 40 - -# set to 'true' to run the environment during -# the 'revision' command, regardless of autogenerate -# revision_environment = false - -# set to 'true' to allow .pyc and .pyo files without -# a source .py file to be detected as revisions in the -# versions/ directory -# sourceless = false - -# version location specification; This defaults -# to /versions. When using multiple version -# directories, initial revisions must be specified with --version-path. -# The path separator used here should be the separator specified by "path_separator" -# below. -# version_locations = %(here)s/bar:%(here)s/bat:%(here)s/alembic/versions - -# path_separator; This indicates what character is used to split lists of file -# paths, including version_locations and prepend_sys_path within configparser -# files such as alembic.ini. -# The default rendered in new alembic.ini files is "os", which uses os.pathsep -# to provide os-dependent path splitting. -# -# Note that in order to support legacy alembic.ini files, this default does NOT -# take place if path_separator is not present in alembic.ini. If this -# option is omitted entirely, fallback logic is as follows: -# -# 1. Parsing of the version_locations option falls back to using the legacy -# "version_path_separator" key, which if absent then falls back to the legacy -# behavior of splitting on spaces and/or commas. -# 2. Parsing of the prepend_sys_path option falls back to the legacy -# behavior of splitting on spaces, commas, or colons. -# -# Valid values for path_separator are: -# -# path_separator = : -# path_separator = ; -# path_separator = space -# path_separator = newline -# -# Use os.pathsep. Default configuration used for new projects. -path_separator = os - -# set to 'true' to search source files recursively -# in each "version_locations" directory -# new in Alembic version 1.10 -# recursive_version_locations = false - -# the output encoding used when revision files -# are written from script.py.mako -# output_encoding = utf-8 - -# database URL. This is consumed by the user-maintained env.py script only. -# other means of configuring database URLs may be customized within the env.py -# file. -#sqlalchemy.url = driver://user:pass@localhost/dbname - - -[post_write_hooks] -# post_write_hooks defines scripts or Python functions that are run -# on newly generated revision scripts. See the documentation for further -# detail and examples - -# format using "black" - use the console_scripts runner, against the "black" entrypoint -# hooks = black -# black.type = console_scripts -# black.entrypoint = black -# black.options = -l 79 REVISION_SCRIPT_FILENAME - -# lint with attempts to fix using "ruff" - use the module runner, against the "ruff" module -# hooks = ruff -# ruff.type = module -# ruff.module = ruff -# ruff.options = check --fix REVISION_SCRIPT_FILENAME - -# Alternatively, use the exec runner to execute a binary found on your PATH -hooks = ruff -ruff.type = exec -ruff.executable = uv -ruff.options = run ruff format REVISION_SCRIPT_FILENAME - -# Logging configuration. This is also consumed by the user-maintained -# env.py script only. -[loggers] -keys = root,sqlalchemy,alembic - -[handlers] -keys = console - -[formatters] -keys = generic - -[logger_root] -level = WARNING -handlers = console -qualname = - -[logger_sqlalchemy] -level = WARNING -handlers = -qualname = sqlalchemy.engine - -[logger_alembic] -level = INFO -handlers = -qualname = alembic - -[handler_console] -class = StreamHandler -args = (sys.stderr,) -level = NOTSET -formatter = generic - -[formatter_generic] -format = %(levelname)-5.5s [%(name)s] %(message)s -datefmt = %H:%M:%S diff --git a/client/.gitignore b/client/.gitignore deleted file mode 100644 index 2fc2afd..0000000 --- a/client/.gitignore +++ /dev/null @@ -1,32 +0,0 @@ -# Specifies intentionally untracked files to ignore when using Git -# http://git-scm.com/docs/gitignore - -*~ -*.sw[mnpcod] -.tmp -*.tmp -*.tmp.* -*.sublime-project -*.sublime-workspace -.DS_Store -Thumbs.db -UserInterfaceState.xcuserstate -$RECYCLE.BIN/ - -*.log -log.txt -npm-debug.log* - -/.idea -/.ionic -/.sass-cache -/.sourcemaps -/.versions -/.vscode/* -!/.vscode/extensions.json -/coverage -/dist -/node_modules -/platforms -/plugins -/www diff --git a/client/package-lock.json b/client/package-lock.json index 735ab4d..7809557 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -1,11 +1,11 @@ { - "name": "client", + "name": "kawai-focus", "version": "0.0.1", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "client", + "name": "kawai-focus", "version": "0.0.1", "dependencies": { "@capacitor/app": "8.0.0", @@ -15,6 +15,8 @@ "@capacitor/status-bar": "8.0.0", "@ionic/vue": "^8.0.0", "@ionic/vue-router": "^8.0.0", + "@tauri-apps/api": "^2.9.1", + "@tauri-apps/plugin-sql": "^2.3.1", "ionicons": "^7.0.0", "vue": "^3.3.0", "vue-router": "^4.2.0" @@ -3143,6 +3145,25 @@ } } }, + "node_modules/@tauri-apps/api": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-2.9.1.tgz", + "integrity": "sha512-IGlhP6EivjXHepbBic618GOmiWe4URJiIeZFlB7x3czM0yDHHYviH1Xvoiv4FefdkQtn6v7TuwWCRfOGdnVUGw==", + "license": "Apache-2.0 OR MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + } + }, + "node_modules/@tauri-apps/plugin-sql": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-sql/-/plugin-sql-2.3.1.tgz", + "integrity": "sha512-iNgHnFIR+jRkx9INKVKepzMlxXtNkJUaWuhagFjT4dOttPaNyRnVHgwTjpqZhyVjiklDh2UdEPAJkQKiCPAekw==", + "license": "MIT OR Apache-2.0", + "dependencies": { + "@tauri-apps/api": "^2.8.0" + } + }, "node_modules/@tootallnate/once": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", diff --git a/client/package.json b/client/package.json index 0130ff2..a36d332 100644 --- a/client/package.json +++ b/client/package.json @@ -5,7 +5,7 @@ "type": "module", "scripts": { "dev": "vite", - "build": "vue-tsc && vite build", + "build": "vite build", "preview": "vite preview", "test:e2e": "cypress run", "test:unit": "vitest", @@ -19,6 +19,8 @@ "@capacitor/status-bar": "8.0.0", "@ionic/vue": "^8.0.0", "@ionic/vue-router": "^8.0.0", + "@tauri-apps/api": "^2.9.1", + "@tauri-apps/plugin-sql": "^2.3.1", "ionicons": "^7.0.0", "vue": "^3.3.0", "vue-router": "^4.2.0" diff --git a/client/src/App.vue b/client/src/App.vue index b1485b5..230a084 100644 --- a/client/src/App.vue +++ b/client/src/App.vue @@ -4,14 +4,6 @@ - diff --git a/client/src/config.js b/client/src/config.js new file mode 100644 index 0000000..475f7c8 --- /dev/null +++ b/client/src/config.js @@ -0,0 +1,8 @@ +import { appLocalDataDir } from '@tauri-apps/api/path'; + +export async function getDB_URL() { + // Функция верёнт путь до бд + + const appDir = await appLocalDataDir(); + return `sqlite:${appDir}/timer.db`; +} diff --git a/client/src/db/crud/timerCrud.js b/client/src/db/crud/timerCrud.js new file mode 100644 index 0000000..8b0edc2 --- /dev/null +++ b/client/src/db/crud/timerCrud.js @@ -0,0 +1,10 @@ +import { getDb } from "../initDb"; +import { SELECT_TIMERS } from "../dml/timerDML"; + + +export async function getTimers() { + // Функция для получения списка таймеров + + const db = await getDb(); + return await db.select(SELECT_TIMERS); +} diff --git a/client/src/db/ddl/timerDDL.js b/client/src/db/ddl/timerDDL.js new file mode 100644 index 0000000..d74c188 --- /dev/null +++ b/client/src/db/ddl/timerDDL.js @@ -0,0 +1,11 @@ +export const CREATE_TIMER = ` + PRAGMA foreign_keys=ON; + CREATE TABLE IF NOT EXISTS timer ( + title VARCHAR(200) NOT NULL, + pomodoro_time INTEGER NOT NULL, + break_time INTEGER NOT NULL, + break_long_time INTEGER NOT NULL, + count_pomodoro INTEGER NOT NULL, + id INTEGER NOT NULL, + PRIMARY KEY (id) + );` diff --git a/client/src/db/dml/timerDML.js b/client/src/db/dml/timerDML.js new file mode 100644 index 0000000..f1f4414 --- /dev/null +++ b/client/src/db/dml/timerDML.js @@ -0,0 +1,6 @@ +export const SELECT_TIMERS = 'SELECT id, title, pomodoro_time, count_pomodoro FROM timer ORDER BY id DESC' +export const COUNT_TIMERS = 'SELECT COUNT(*) as cnt FROM timer' +export const INSERT_SEED_DB = ` + INSERT INTO timer (title, pomodoro_time, break_time, break_long_time, count_pomodoro) VALUES + ('Timer mini example', 10, 3, 15, 2), ('Timer max example', 90, 10, 40, 8) +` diff --git a/client/src/db/initDb.js b/client/src/db/initDb.js new file mode 100644 index 0000000..ce90442 --- /dev/null +++ b/client/src/db/initDb.js @@ -0,0 +1,26 @@ +import Database from '@tauri-apps/plugin-sql'; +import { CREATE_TIMER } from './ddl/timerDDL'; +import { getDB_URL } from '../config'; +import { seedDb } from './seed'; + +let dbPromise = null; + +export async function getDb() { + // Функция для получения подключения к базе данных + + if (!dbPromise) { + dbPromise = (async () => { + try { + const dbUrl = await getDB_URL(); + const db = await Database.load(dbUrl); + await db.execute(CREATE_TIMER); + await seedDb(db); + return db; + } catch (error) { + console.error('Ошибка инициализации базы данных', error); + throw error; + } + })(); + } + return await dbPromise; // await для консистентности +} diff --git a/client/src/db/seed.js b/client/src/db/seed.js new file mode 100644 index 0000000..927b161 --- /dev/null +++ b/client/src/db/seed.js @@ -0,0 +1,11 @@ +import { INSERT_SEED_DB, COUNT_TIMERS } from './dml/timerDML' + + +export async function seedDb(db) { + // Функция для заполнения бд данными + + const count = await db.select(COUNT_TIMERS); + if (count[0].cnt === 0) { + await db.execute(INSERT_SEED_DB); + } +} diff --git a/client/src/views/TimersList/TimersList.js b/client/src/views/TimersList/TimersList.js index 1c3cb43..47bde1e 100644 --- a/client/src/views/TimersList/TimersList.js +++ b/client/src/views/TimersList/TimersList.js @@ -8,14 +8,53 @@ import { trashOutline } from 'ionicons/icons'; +import { ref, onMounted } from 'vue'; +import { getTimers } from '../../db/crud/timerCrud'; + export default { name: 'TimersList', components: { IonIcon, }, setup() { - // Возвращаем иконки, чтобы они были доступны в шаблоне + const timers = ref([]); + const loading = ref(true); + const error = ref(null); + const expandedId = ref(null); + + const loadTimers = async () => { + loading.value = true; + error.value = null; + + try { + const result = await getTimers(); + timers.value = result; + } catch (err) { + error.value = err.message || 'Ошибка загрузки таймеров'; + } finally { + loading.value = false; + } + }; + + const toggleExpand = (id) => { + expandedId.value = expandedId.value === id ? null : id; + }; + + onMounted(() => { + loadTimers(); + }); + return { + // состояние + timers, + loading, + error, + expandedId, + + // методы + toggleExpand, + + // иконки timerOutline, chevronUp, chevronDown, @@ -24,44 +63,4 @@ export default { trashOutline, }; }, - data() { - return { - timers: [], - expandedId: null, - loading: true, - error: null, - apiUrl: 'http://127.0.0.1:8090/api/timers' - }; - }, - mounted() { - this.fetchTimers(); - }, - methods: { - async fetchTimers() { - try { - this.loading = true; - this.error = null; - - // Для Tauri invoke (раскомментировать при необходимости) - // const { invoke } = window.__TAURI__.tauri; - // this.timers = await invoke('list_timers'); - - const response = await fetch(`${this.apiUrl}/`); - - if (!response.ok) { - throw new Error(`HTTP error! status: ${response.status}`); - } - - this.timers = await response.json(); - this.loading = false; - } catch (err) { - this.error = `Ошибка загрузки таймеров: ${err.message}`; - this.loading = false; - console.error('Fetch error:', err); - } - }, - toggleExpand(timerId) { - this.expandedId = this.expandedId === timerId ? null : timerId; - } - }, }; diff --git a/desktop/src-tauri/.gitignore b/desktop/src-tauri/.gitignore deleted file mode 100644 index 502406b..0000000 --- a/desktop/src-tauri/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -# Generated by Cargo -# will have compiled files and executables -/target/ -/gen/schemas diff --git a/desktop/src-tauri/Cargo.lock b/desktop/src-tauri/Cargo.lock index ae208c3..e9ec492 100644 --- a/desktop/src-tauri/Cargo.lock +++ b/desktop/src-tauri/Cargo.lock @@ -43,6 +43,12 @@ dependencies = [ "alloc-no-stdlib", ] +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + [[package]] name = "android_log-sys" version = "0.3.2" @@ -85,6 +91,7 @@ dependencies = [ "tauri", "tauri-build", "tauri-plugin-log", + "tauri-plugin-sql", ] [[package]] @@ -116,6 +123,15 @@ dependencies = [ "system-deps", ] +[[package]] +name = "atoi" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" +dependencies = [ + "num-traits", +] + [[package]] name = "atomic-waker" version = "1.1.2" @@ -140,6 +156,12 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "base64ct" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" + [[package]] name = "bitflags" version = "1.3.2" @@ -428,6 +450,21 @@ dependencies = [ "memchr", ] +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + [[package]] name = "convert_case" version = "0.4.0" @@ -493,6 +530,21 @@ dependencies = [ "libc", ] +[[package]] +name = "crc" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" + [[package]] name = "crc32fast" version = "1.5.0" @@ -511,6 +563,15 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "crossbeam-queue" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "crossbeam-utils" version = "0.8.21" @@ -599,6 +660,17 @@ dependencies = [ "syn 2.0.111", ] +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + [[package]] name = "deranged" version = "0.5.5" @@ -629,7 +701,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", + "const-oid", "crypto-common", + "subtle", ] [[package]] @@ -703,6 +777,12 @@ dependencies = [ "syn 2.0.111", ] +[[package]] +name = "dotenvy" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" + [[package]] name = "dpi" version = "0.1.2" @@ -739,6 +819,15 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +dependencies = [ + "serde", +] + [[package]] name = "embed-resource" version = "3.0.6" @@ -786,6 +875,28 @@ dependencies = [ "typeid", ] +[[package]] +name = "etcetera" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" +dependencies = [ + "cfg-if", + "home", + "windows-sys 0.48.0", +] + +[[package]] +name = "event-listener" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + [[package]] name = "fdeflate" version = "0.3.7" @@ -830,12 +941,29 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "flume" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" +dependencies = [ + "futures-core", + "futures-sink", + "spin", +] + [[package]] name = "fnv" version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + [[package]] name = "foreign-types" version = "0.5.0" @@ -895,6 +1023,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", + "futures-sink", ] [[package]] @@ -914,6 +1043,17 @@ dependencies = [ "futures-util", ] +[[package]] +name = "futures-intrusive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" +dependencies = [ + "futures-core", + "lock_api", + "parking_lot", +] + [[package]] name = "futures-io" version = "0.3.31" @@ -1269,12 +1409,32 @@ dependencies = [ "ahash", ] +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] + [[package]] name = "hashbrown" version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +[[package]] +name = "hashlink" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" +dependencies = [ + "hashbrown 0.15.5", +] + [[package]] name = "heck" version = "0.4.1" @@ -1293,6 +1453,33 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "home" +version = "0.5.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" +dependencies = [ + "windows-sys 0.61.2", +] + [[package]] name = "html5ever" version = "0.29.1" @@ -1690,6 +1877,9 @@ name = "lazy_static" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin", +] [[package]] name = "libappindicator" @@ -1731,6 +1921,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "libm" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" + [[package]] name = "libredox" version = "0.1.12" @@ -1739,6 +1935,18 @@ checksum = "3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616" dependencies = [ "bitflags 2.10.0", "libc", + "redox_syscall 0.7.0", +] + +[[package]] +name = "libsqlite3-sys" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" +dependencies = [ + "cc", + "pkg-config", + "vcpkg", ] [[package]] @@ -1802,6 +2010,16 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest", +] + [[package]] name = "memchr" version = "2.7.6" @@ -1907,12 +2125,48 @@ version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" +[[package]] +name = "num-bigint-dig" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7" +dependencies = [ + "lazy_static", + "libm", + "num-integer", + "num-iter", + "num-traits", + "rand 0.8.5", + "smallvec", + "zeroize", +] + [[package]] name = "num-conv" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -1920,6 +2174,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", + "libm", ] [[package]] @@ -2202,6 +2457,12 @@ dependencies = [ "system-deps", ] +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + [[package]] name = "parking_lot" version = "0.12.5" @@ -2220,11 +2481,20 @@ checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.5.18", "smallvec", "windows-link 0.2.1", ] +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + [[package]] name = "percent-encoding" version = "2.3.2" @@ -2377,6 +2647,27 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "pkcs1" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" +dependencies = [ + "der", + "pkcs8", + "spki", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + [[package]] name = "pkg-config" version = "0.3.32" @@ -2653,6 +2944,15 @@ dependencies = [ "bitflags 2.10.0", ] +[[package]] +name = "redox_syscall" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f3fe0889e69e2ae9e41f4d6c4c0181701d00e4697b356fb1f74173a5e0ee27" +dependencies = [ + "bitflags 2.10.0", +] + [[package]] name = "redox_users" version = "0.5.2" @@ -2786,6 +3086,26 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "rsa" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8573f03f5883dcaebdfcf4725caa1ecb9c15b2ef50c43a07b816e06799bb12d" +dependencies = [ + "const-oid", + "digest", + "num-bigint-dig", + "num-integer", + "num-traits", + "pkcs1", + "pkcs8", + "rand_core 0.6.4", + "signature", + "spki", + "subtle", + "zeroize", +] + [[package]] name = "rust_decimal" version = "1.39.0" @@ -3093,6 +3413,17 @@ dependencies = [ "stable_deref_trait", ] +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "sha2" version = "0.10.9" @@ -3110,6 +3441,16 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core 0.6.4", +] + [[package]] name = "simd-adler32" version = "0.3.8" @@ -3145,6 +3486,9 @@ name = "smallvec" version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +dependencies = [ + "serde", +] [[package]] name = "socket2" @@ -3171,7 +3515,7 @@ dependencies = [ "objc2-foundation", "objc2-quartz-core", "raw-window-handle", - "redox_syscall", + "redox_syscall 0.5.18", "tracing", "wasm-bindgen", "web-sys", @@ -3204,6 +3548,217 @@ dependencies = [ "system-deps", ] +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "sqlx" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fefb893899429669dcdd979aff487bd78f4064e5e7907e4269081e0ef7d97dc" +dependencies = [ + "sqlx-core", + "sqlx-macros", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", +] + +[[package]] +name = "sqlx-core" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6798b1838b6a0f69c007c133b8df5866302197e404e8b6ee8ed3e3a5e68dc6" +dependencies = [ + "base64 0.22.1", + "bytes", + "crc", + "crossbeam-queue", + "either", + "event-listener", + "futures-core", + "futures-intrusive", + "futures-io", + "futures-util", + "hashbrown 0.15.5", + "hashlink", + "indexmap 2.12.1", + "log", + "memchr", + "once_cell", + "percent-encoding", + "serde", + "serde_json", + "sha2", + "smallvec", + "thiserror 2.0.17", + "time", + "tokio", + "tokio-stream", + "tracing", + "url", +] + +[[package]] +name = "sqlx-macros" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2d452988ccaacfbf5e0bdbc348fb91d7c8af5bee192173ac3636b5fb6e6715d" +dependencies = [ + "proc-macro2", + "quote", + "sqlx-core", + "sqlx-macros-core", + "syn 2.0.111", +] + +[[package]] +name = "sqlx-macros-core" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19a9c1841124ac5a61741f96e1d9e2ec77424bf323962dd894bdb93f37d5219b" +dependencies = [ + "dotenvy", + "either", + "heck 0.5.0", + "hex", + "once_cell", + "proc-macro2", + "quote", + "serde", + "serde_json", + "sha2", + "sqlx-core", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", + "syn 2.0.111", + "tokio", + "url", +] + +[[package]] +name = "sqlx-mysql" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa003f0038df784eb8fecbbac13affe3da23b45194bd57dba231c8f48199c526" +dependencies = [ + "atoi", + "base64 0.22.1", + "bitflags 2.10.0", + "byteorder", + "bytes", + "crc", + "digest", + "dotenvy", + "either", + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "generic-array", + "hex", + "hkdf", + "hmac", + "itoa", + "log", + "md-5", + "memchr", + "once_cell", + "percent-encoding", + "rand 0.8.5", + "rsa", + "serde", + "sha1", + "sha2", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror 2.0.17", + "time", + "tracing", + "whoami", +] + +[[package]] +name = "sqlx-postgres" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db58fcd5a53cf07c184b154801ff91347e4c30d17a3562a635ff028ad5deda46" +dependencies = [ + "atoi", + "base64 0.22.1", + "bitflags 2.10.0", + "byteorder", + "crc", + "dotenvy", + "etcetera", + "futures-channel", + "futures-core", + "futures-util", + "hex", + "hkdf", + "hmac", + "home", + "itoa", + "log", + "md-5", + "memchr", + "once_cell", + "rand 0.8.5", + "serde", + "serde_json", + "sha2", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror 2.0.17", + "time", + "tracing", + "whoami", +] + +[[package]] +name = "sqlx-sqlite" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2d12fe70b2c1b4401038055f90f151b78208de1f9f89a7dbfd41587a10c3eea" +dependencies = [ + "atoi", + "flume", + "futures-channel", + "futures-core", + "futures-executor", + "futures-intrusive", + "futures-util", + "libsqlite3-sys", + "log", + "percent-encoding", + "serde", + "serde_urlencoded", + "sqlx-core", + "thiserror 2.0.17", + "time", + "tracing", + "url", +] + [[package]] name = "stable_deref_trait" version = "1.2.1" @@ -3235,12 +3790,29 @@ dependencies = [ "quote", ] +[[package]] +name = "stringprep" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" +dependencies = [ + "unicode-bidi", + "unicode-normalization", + "unicode-properties", +] + [[package]] name = "strsim" version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + [[package]] name = "swift-rs" version = "1.0.7" @@ -3523,6 +4095,25 @@ dependencies = [ "time", ] +[[package]] +name = "tauri-plugin-sql" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a593f08c357091ba802a388d1161e99f05751278fb7204faeb08520da579a7c" +dependencies = [ + "futures-core", + "indexmap 2.12.1", + "log", + "serde", + "serde_json", + "sqlx", + "tauri", + "tauri-plugin", + "thiserror 2.0.17", + "time", + "tokio", +] + [[package]] name = "tauri-runtime" version = "2.9.2" @@ -3747,6 +4338,17 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "tokio-stream" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + [[package]] name = "tokio-util" version = "0.7.17" @@ -3907,10 +4509,23 @@ version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" dependencies = [ + "log", "pin-project-lite", + "tracing-attributes", "tracing-core", ] +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + [[package]] name = "tracing-core" version = "0.1.36" @@ -4001,12 +4616,33 @@ dependencies = [ "unic-common", ] +[[package]] +name = "unicode-bidi" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" + [[package]] name = "unicode-ident" version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" +[[package]] +name = "unicode-normalization" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-properties" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d" + [[package]] name = "unicode-segmentation" version = "1.12.0" @@ -4073,6 +4709,12 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ba6f5989077681266825251a52748b8c1d8a4ad098cc37e440103d0ea717fc0" +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "version-compare" version = "0.2.1" @@ -4145,6 +4787,12 @@ dependencies = [ "wit-bindgen", ] +[[package]] +name = "wasite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" + [[package]] name = "wasm-bindgen" version = "0.2.106" @@ -4306,6 +4954,16 @@ dependencies = [ "windows-core 0.61.2", ] +[[package]] +name = "whoami" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d4a4db5077702ca3015d3d02d74974948aba2ad9e12ab7df718ee64ccd7e97d" +dependencies = [ + "libredox", + "wasite", +] + [[package]] name = "winapi" version = "0.3.9" @@ -4500,6 +5158,15 @@ dependencies = [ "windows-targets 0.42.2", ] +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + [[package]] name = "windows-sys" version = "0.59.0" @@ -4542,6 +5209,21 @@ dependencies = [ "windows_x86_64_msvc 0.42.2", ] +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + [[package]] name = "windows-targets" version = "0.52.6" @@ -4599,6 +5281,12 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" @@ -4617,6 +5305,12 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + [[package]] name = "windows_aarch64_msvc" version = "0.52.6" @@ -4635,6 +5329,12 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + [[package]] name = "windows_i686_gnu" version = "0.52.6" @@ -4665,6 +5365,12 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + [[package]] name = "windows_i686_msvc" version = "0.52.6" @@ -4683,6 +5389,12 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + [[package]] name = "windows_x86_64_gnu" version = "0.52.6" @@ -4701,6 +5413,12 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" @@ -4719,6 +5437,12 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + [[package]] name = "windows_x86_64_msvc" version = "0.52.6" @@ -4910,6 +5634,12 @@ dependencies = [ "synstructure", ] +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" + [[package]] name = "zerotrie" version = "0.2.3" diff --git a/desktop/src-tauri/Cargo.toml b/desktop/src-tauri/Cargo.toml index 23b83e3..166124e 100644 --- a/desktop/src-tauri/Cargo.toml +++ b/desktop/src-tauri/Cargo.toml @@ -1,9 +1,9 @@ [package] name = "app" version = "0.1.0" -description = "A Tauri App" -authors = ["you"] -license = "" +description = "Kawai-Focus - приложение для фокусировки внимания на основе таймера Pomodoro." +authors = ["Arduinum"] +license = "MIT" repository = "" edition = "2021" rust-version = "1.77.2" @@ -23,3 +23,4 @@ serde = { version = "1.0", features = ["derive"] } log = "0.4" tauri = { version = "2.9.5", features = [] } tauri-plugin-log = "2" +tauri-plugin-sql = { version = "2.3.1", features = ["sqlite"] } diff --git a/desktop/src-tauri/capabilities/default.json b/desktop/src-tauri/capabilities/default.json index c135d7f..8b4682c 100644 --- a/desktop/src-tauri/capabilities/default.json +++ b/desktop/src-tauri/capabilities/default.json @@ -1,11 +1,10 @@ { "$schema": "../gen/schemas/desktop-schema.json", "identifier": "default", - "description": "enables the default permissions", - "windows": [ - "main" - ], + "windows": ["main"], "permissions": [ - "core:default" + "core:default", + "sql:default", + "sql:allow-execute" ] } diff --git a/desktop/src-tauri/src/lib.rs b/desktop/src-tauri/src/lib.rs index 9c3118c..b19aaa4 100644 --- a/desktop/src-tauri/src/lib.rs +++ b/desktop/src-tauri/src/lib.rs @@ -1,16 +1,7 @@ #[cfg_attr(mobile, tauri::mobile_entry_point)] pub fn run() { - tauri::Builder::default() - .setup(|app| { - if cfg!(debug_assertions) { - app.handle().plugin( - tauri_plugin_log::Builder::default() - .level(log::LevelFilter::Info) - .build(), - )?; - } - Ok(()) - }) - .run(tauri::generate_context!()) - .expect("error while running tauri application"); + tauri::Builder::default() + .plugin(tauri_plugin_sql::Builder::default().build()) + .run(tauri::generate_context!()) + .expect("Ошибка при запуске приложения Tauri."); } diff --git a/desktop/src-tauri/src/main.rs b/desktop/src-tauri/src/main.rs index ad5fe83..d36aec3 100644 --- a/desktop/src-tauri/src/main.rs +++ b/desktop/src-tauri/src/main.rs @@ -2,5 +2,6 @@ #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] fn main() { + println!("Запуск приложения Tauri..."); app_lib::run(); } diff --git a/desktop/src-tauri/tauri.conf.json b/desktop/src-tauri/tauri.conf.json index 0ba3336..9b9fdd0 100644 --- a/desktop/src-tauri/tauri.conf.json +++ b/desktop/src-tauri/tauri.conf.json @@ -10,17 +10,21 @@ "beforeBuildCommand": "cd ../client && npm run build" }, "app": { + "withGlobalTauri": true, "windows": [ { + "label": "main", "title": "Kawai-Focus", "width": 800, "height": 600, "resizable": true, - "fullscreen": false + "fullscreen": false, + "devtools": true } ], "security": { - "csp": null + "csp": null, + "capabilities": ["default"] } }, "bundle": { diff --git a/src/kawai_focus_v2/__init__.py b/src/kawai_focus_v2/__init__.py deleted file mode 100644 index 852482e..0000000 --- a/src/kawai_focus_v2/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -def main() -> None: - print("Hello from kawai-focus-v2!") diff --git a/src/kawai_focus_v2/api/__init__.py b/src/kawai_focus_v2/api/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/kawai_focus_v2/api/timers/__init__.py b/src/kawai_focus_v2/api/timers/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/kawai_focus_v2/api/timers/router.py b/src/kawai_focus_v2/api/timers/router.py deleted file mode 100644 index 8b5c476..0000000 --- a/src/kawai_focus_v2/api/timers/router.py +++ /dev/null @@ -1,43 +0,0 @@ -from fastapi import APIRouter, Depends, status - -from kawai_focus_v2.database.cruds import get_timers, get_timer, new_timer, update_timer, del_timer -from kawai_focus_v2.schemas.timer import TimerModel, TimerListModel, NewTimerModel, UpdateTimerModel -from kawai_focus_v2.database.db import get_db_instance, SessionDB - - -router = APIRouter(prefix='/timers', tags=['timers']) - - -@router.get('/', response_model=list[TimerListModel], status_code=status.HTTP_200_OK) -def list_timers(db: SessionDB = Depends(get_db_instance)) -> list[TimerListModel]: - """Ручка для получения списка таймеров""" - - return get_timers(db=db) - - -@router.get('/{id}', response_model=TimerModel, status_code=status.HTTP_200_OK) -def timer(id: int, db: SessionDB = Depends(get_db_instance)) -> TimerModel: - """Ручка для получения таймера""" - - return get_timer(timer_id=id, db=db) - - -@router.post('/new', response_model=TimerModel, status_code=status.HTTP_201_CREATED) -def add_timer(data: NewTimerModel, db: SessionDB = Depends(get_db_instance)) -> TimerModel: - """Ручка для создания нового таймера""" - - return new_timer(data=data, db=db) - - -@router.patch('/{id}', response_model=TimerModel, status_code=status.HTTP_200_OK) -def update_data_timer(id: int, data: UpdateTimerModel, db: SessionDB = Depends(get_db_instance)) -> TimerModel: - """Ручка для обновления таймера""" - - return update_timer(timer_id=id, data=data, db=db) - - -@router.delete('/{id}', status_code=status.HTTP_204_NO_CONTENT) -def delete_timer(id: int, db: SessionDB = Depends(get_db_instance)) -> None: - """Ручка для удаления таймера""" - - del_timer(timer_id=id, db=db) diff --git a/src/kawai_focus_v2/core/__init__.py b/src/kawai_focus_v2/core/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/kawai_focus_v2/core/messages/__init__.py b/src/kawai_focus_v2/core/messages/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/kawai_focus_v2/core/messages/errors.py b/src/kawai_focus_v2/core/messages/errors.py deleted file mode 100644 index cb7bea8..0000000 --- a/src/kawai_focus_v2/core/messages/errors.py +++ /dev/null @@ -1,19 +0,0 @@ -from enum import Enum - - -class ErrorMessage(Enum): - """Сообщения об ошибках""" - - NO_TIME = 'Не указано время таймера!' - NEGATIVE_TIME = 'Время таймера не может быть отрицательным!' - SS_MM_BIG = 'Секунды и минуты не могут быть больше 59!' - HH_BIG = 'Часы не могут быть больше 23!' - FOLDER_NOT_FOUND = 'Папка не найдена!' - JSON_NOT_FOUND = 'Файл json не найден!' - TYPE_DICT = 'Тип данных не является словарем!' - NOT_INT_TYPE = 'Тип данных не является целым числом!' - KEY_ERROR = 'Ключ не найден!' - CONNECTION_ERROR = 'Подключение к базе данных не удалось!' - INTEGRITY_ERROR = 'Ошибка целостности данных (нарушение уникальности или связей)!' - OPERATIONAL_ERROR = 'Ошибка выполнения SQL-запроса (возможная блокировка или повреждение БД)!' - VALIDATION_ERROR = 'Ошибка валидации данных (несоответствие ожидаемой схеме)!' diff --git a/src/kawai_focus_v2/core/settings.py b/src/kawai_focus_v2/core/settings.py deleted file mode 100644 index c43a5f2..0000000 --- a/src/kawai_focus_v2/core/settings.py +++ /dev/null @@ -1,44 +0,0 @@ -from pydantic_settings import BaseSettings, SettingsConfigDict -from pydantic import Field - - -class ModelConfig(BaseSettings): - """Модель конфигурации""" - - model_config = SettingsConfigDict( - env_file='.env', - env_file_encoding='utf-8', - extra='ignore' - ) - - -class SettingsDB(ModelConfig): - """Класс для данных БД""" - - name_db: str - echo_db: bool - - @property - def get_url_db(self) -> str: - """Метод вернёт URL для подключения к БД""" - - return f'sqlite:///{self.name_db}' - - -class SettingsApp(ModelConfig): - """Настройки для приложения""" - - port_app: int - host_app: str - is_reload: bool - frontend_origins: str - - -class Settings(ModelConfig): - """Класс для данных конфига""" - - app_settings: SettingsApp = Field(default_factory=SettingsApp) - db_settings: SettingsDB = Field(default_factory=SettingsDB) - - -settings = Settings() diff --git a/src/kawai_focus_v2/database/__init__.py b/src/kawai_focus_v2/database/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/kawai_focus_v2/database/alembic/README b/src/kawai_focus_v2/database/alembic/README deleted file mode 100644 index 2500aa1..0000000 --- a/src/kawai_focus_v2/database/alembic/README +++ /dev/null @@ -1 +0,0 @@ -Generic single-database configuration. diff --git a/src/kawai_focus_v2/database/alembic/env.py b/src/kawai_focus_v2/database/alembic/env.py deleted file mode 100644 index 3b3493e..0000000 --- a/src/kawai_focus_v2/database/alembic/env.py +++ /dev/null @@ -1,82 +0,0 @@ -from logging.config import fileConfig - -from sqlalchemy import engine_from_config -from sqlalchemy import pool - -from alembic import context - -from kawai_focus_v2.core.settings import settings -from kawai_focus_v2.database.models import Base - -# this is the Alembic Config object, which provides -# access to the values within the .ini file in use. -config = context.config -config.set_main_option("sqlalchemy.url", settings.db_settings.get_url_db) - -# Interpret the config file for Python logging. -# This line sets up loggers basically. -if config.config_file_name is not None: - fileConfig(config.config_file_name) - -# add your model's MetaData object here -# for 'autogenerate' support -# from myapp import mymodel -# target_metadata = mymodel.Base.metadata -target_metadata = Base.metadata - -# other values from the config, defined by the needs of env.py, -# can be acquired: -# my_important_option = config.get_main_option("my_important_option") -# ... etc. - - -def run_migrations_offline() -> None: - """Run migrations in 'offline' mode. - - This configures the context with just a URL - and not an Engine, though an Engine is acceptable - here as well. By skipping the Engine creation - we don't even need a DBAPI to be available. - - Calls to context.execute() here emit the given string to the - script output. - - """ - url = config.get_main_option("sqlalchemy.url") - context.configure( - url=url, - target_metadata=target_metadata, - literal_binds=True, - dialect_opts={"paramstyle": "named"}, - ) - - with context.begin_transaction(): - context.run_migrations() - - -def run_migrations_online() -> None: - """Run migrations in 'online' mode. - - In this scenario we need to create an Engine - and associate a connection with the context. - - """ - connectable = engine_from_config( - config.get_section(config.config_ini_section, {}), - prefix="sqlalchemy.", - poolclass=pool.NullPool, - ) - - with connectable.connect() as connection: - context.configure( - connection=connection, target_metadata=target_metadata - ) - - with context.begin_transaction(): - context.run_migrations() - - -if context.is_offline_mode(): - run_migrations_offline() -else: - run_migrations_online() diff --git a/src/kawai_focus_v2/database/alembic/script.py.mako b/src/kawai_focus_v2/database/alembic/script.py.mako deleted file mode 100644 index 1101630..0000000 --- a/src/kawai_focus_v2/database/alembic/script.py.mako +++ /dev/null @@ -1,28 +0,0 @@ -"""${message} - -Revision ID: ${up_revision} -Revises: ${down_revision | comma,n} -Create Date: ${create_date} - -""" -from typing import Sequence, Union - -from alembic import op -import sqlalchemy as sa -${imports if imports else ""} - -# revision identifiers, used by Alembic. -revision: str = ${repr(up_revision)} -down_revision: Union[str, Sequence[str], None] = ${repr(down_revision)} -branch_labels: Union[str, Sequence[str], None] = ${repr(branch_labels)} -depends_on: Union[str, Sequence[str], None] = ${repr(depends_on)} - - -def upgrade() -> None: - """Upgrade schema.""" - ${upgrades if upgrades else "pass"} - - -def downgrade() -> None: - """Downgrade schema.""" - ${downgrades if downgrades else "pass"} diff --git a/src/kawai_focus_v2/database/alembic/versions/2025_12_25_1504-503b50886979_create_timer.py b/src/kawai_focus_v2/database/alembic/versions/2025_12_25_1504-503b50886979_create_timer.py deleted file mode 100644 index 901f1fd..0000000 --- a/src/kawai_focus_v2/database/alembic/versions/2025_12_25_1504-503b50886979_create_timer.py +++ /dev/null @@ -1,42 +0,0 @@ -"""Create Timer - -Revision ID: 503b50886979 -Revises: -Create Date: 2025-12-25 15:04:03.485293 - -""" - -from collections.abc import Sequence - -from alembic import op -import sqlalchemy as sa - - -# revision identifiers, used by Alembic. -revision: str = "503b50886979" -down_revision: str | Sequence[str] | None = None -branch_labels: str | Sequence[str] | None = None -depends_on: str | Sequence[str] | None = None - - -def upgrade() -> None: - """Upgrade schema.""" - # ### commands auto generated by Alembic - please adjust! ### - op.create_table( - "timer", - sa.Column("название", sa.String(length=200), nullable=False), - sa.Column("время помидора", sa.Integer(), nullable=False), - sa.Column("время перерыва", sa.Integer(), nullable=False), - sa.Column("время долгого перерыва", sa.Integer(), nullable=False), - sa.Column("количество помидоров", sa.Integer(), nullable=False), - sa.Column("id", sa.Integer(), autoincrement=True, nullable=False), - sa.PrimaryKeyConstraint("id"), - ) - # ### end Alembic commands ### - - -def downgrade() -> None: - """Downgrade schema.""" - # ### commands auto generated by Alembic - please adjust! ### - op.drop_table("timer") - # ### end Alembic commands ### diff --git a/src/kawai_focus_v2/database/cruds.py b/src/kawai_focus_v2/database/cruds.py deleted file mode 100644 index 402a97d..0000000 --- a/src/kawai_focus_v2/database/cruds.py +++ /dev/null @@ -1,61 +0,0 @@ -from sqlalchemy import select - -from kawai_focus_v2.database.models import Timer -from kawai_focus_v2.schemas.timer import TimerModel, TimerListModel, UpdateTimerModel, NewTimerModel -from kawai_focus_v2.database.db import get_db_instance, SessionDB - - -def get_timer(timer_id: int, db: SessionDB) -> TimerModel: - """Функция для получения данных таймера""" - - db = get_db_instance() - with db.get_session() as session: - timer = session.get(Timer, timer_id) - return TimerModel.model_validate(timer, from_attributes=True) - - -def get_timers(db: SessionDB) -> list[TimerListModel]: - """Функция для получения списка таймеров""" - - with db.get_session() as session: - timers = session.execute( - select(Timer.id, Timer.title, Timer.pomodoro_time, Timer.count_pomodoro) - ).all() - - return [TimerListModel.model_validate(timer, from_attributes=True) for timer in timers] - - -def new_timer(data: NewTimerModel, db: SessionDB) -> TimerModel: - """Функция для создания нового таймера""" - - with db.get_session() as session: - timer = Timer(**data.model_dump()) - session.add(timer) - session.commit() - session.refresh(timer) - - return TimerModel.model_validate(timer, from_attributes=True) - - -def update_timer(timer_id: int, data: UpdateTimerModel, db: SessionDB) -> TimerModel: - """Функция для обновления таймера""" - - with db.get_session() as session: - timer = session.get(Timer, timer_id) - - for field, value in data.model_dump(exclude_unset=True).items(): - setattr(timer, field, value) - - session.commit() - session.refresh(timer) - - return TimerModel.model_validate(timer, from_attributes=True) - - -def del_timer(timer_id: int, db: SessionDB) -> None: - """Функция для удаления таймера""" - - with db.get_session() as session: - timer = session.get(Timer, timer_id) - session.delete(timer) - session.commit() diff --git a/src/kawai_focus_v2/database/data.py b/src/kawai_focus_v2/database/data.py deleted file mode 100644 index 84a47a4..0000000 --- a/src/kawai_focus_v2/database/data.py +++ /dev/null @@ -1,19 +0,0 @@ -from kawai_focus_v2.schemas.timer import NewTimerModel - - -data_timers = [ - NewTimerModel( - title='Timer mini example', - pomodoro_time=10, - break_time=3, - break_long_time=15, - count_pomodoro=2 - ), - NewTimerModel( - title='Timer max example', - pomodoro_time=90, - break_time=10, - break_long_time=40, - count_pomodoro=8 - ), -] diff --git a/src/kawai_focus_v2/database/db.py b/src/kawai_focus_v2/database/db.py deleted file mode 100644 index afb4739..0000000 --- a/src/kawai_focus_v2/database/db.py +++ /dev/null @@ -1,33 +0,0 @@ -from sqlalchemy import create_engine -from sqlalchemy.orm import sessionmaker, Session -from functools import lru_cache - -from kawai_focus_v2.core.settings import settings - - -class SessionDB: - """Класс для управления подключением к базе данных.""" - - def __init__(self) -> None: - self._engine = create_engine( - url=settings.db_settings.get_url_db, - echo=settings.db_settings.echo_db - ) - self._session_factory = sessionmaker( - bind=self._engine, - expire_on_commit=False, - autocommit=False - ) - - @property - def get_session(self) -> sessionmaker[Session]: - """Метод для получения сессии""" - - return self._session_factory - - -@lru_cache(maxsize=1) -def get_db_instance() -> SessionDB: - """Возвращает один и тот же объект SeesionDB""" - - return SessionDB() diff --git a/src/kawai_focus_v2/database/mixins.py b/src/kawai_focus_v2/database/mixins.py deleted file mode 100644 index 73c1149..0000000 --- a/src/kawai_focus_v2/database/mixins.py +++ /dev/null @@ -1,13 +0,0 @@ -from sqlalchemy.orm import Mapped, mapped_column -from sqlalchemy import Integer - - -class IDMixin: - """Базовый класс для моделей с id""" - - id: Mapped[int] = mapped_column( - Integer, - name='id', - primary_key=True, - autoincrement=True - ) diff --git a/src/kawai_focus_v2/database/models.py b/src/kawai_focus_v2/database/models.py deleted file mode 100644 index 11bd4ee..0000000 --- a/src/kawai_focus_v2/database/models.py +++ /dev/null @@ -1,46 +0,0 @@ -from sqlalchemy.orm import DeclarativeBase, mapped_column, Mapped -from sqlalchemy import Integer, String - -from kawai_focus_v2.database.mixins import IDMixin - - -class Base(DeclarativeBase): - """Класс для корректной работы аннотаций""" - - pass - - -class Timer(IDMixin, Base): - """Модель таймера""" - - __tablename__ = 'timer' - - title: Mapped[str] = mapped_column( - String(length=200), - name='название', - nullable=False - ) - - pomodoro_time: Mapped[int] = mapped_column( - Integer, - name='время помидора', - nullable=False - ) - - break_time: Mapped[int] = mapped_column( - Integer, - name='время перерыва', - nullable=False - ) - - break_long_time: Mapped[int] = mapped_column( - Integer, - name='время долгого перерыва', - nullable=False - ) - - count_pomodoro: Mapped[int] = mapped_column( - Integer, - name='количество помидоров', - nullable=False - ) diff --git a/src/kawai_focus_v2/database/seed.py b/src/kawai_focus_v2/database/seed.py deleted file mode 100644 index 5927385..0000000 --- a/src/kawai_focus_v2/database/seed.py +++ /dev/null @@ -1,18 +0,0 @@ -from kawai_focus_v2.schemas.timer import NewTimerModel -from kawai_focus_v2.database.cruds import new_timer -from kawai_focus_v2.database.db import get_db_instance -from kawai_focus_v2.database.data import data_timers - - -def new_temers(data: list[NewTimerModel]) -> None: - """Заполняет базу данных образцами таймеров""" - - db = get_db_instance() - for timer in data: - new_timer(data=timer, db=db) - - -def start_filling_data() -> None: - """Функция для заполнения бд данными""" - - new_temers(data=data_timers) diff --git a/src/kawai_focus_v2/main.py b/src/kawai_focus_v2/main.py deleted file mode 100644 index 6e39855..0000000 --- a/src/kawai_focus_v2/main.py +++ /dev/null @@ -1,20 +0,0 @@ -from fastapi import FastAPI -from fastapi.middleware.cors import CORSMiddleware - -from kawai_focus_v2.api.timers.router import router as timers_router -from kawai_focus_v2.core.settings import settings - -app = FastAPI(title='Kawai-Focus') - -# Настройка CORS -origins = settings.app_settings.frontend_origins.split(',') - -app.add_middleware( - CORSMiddleware, # type: ignore[arg-type] - allow_origins=origins, # Разрешаем запросы с этих адресов - allow_credentials=True, - allow_methods=['*'], # Разрешаем все методы (GET, POST, etc.) - allow_headers=['*'], # Разрешаем все заголовки -) - -app.include_router(timers_router, prefix='/api') diff --git a/src/kawai_focus_v2/schemas/timer.py b/src/kawai_focus_v2/schemas/timer.py deleted file mode 100644 index e2b37ee..0000000 --- a/src/kawai_focus_v2/schemas/timer.py +++ /dev/null @@ -1,60 +0,0 @@ -from pydantic import BaseModel, field_validator, Field -from kawai_focus_v2.core.messages.errors import ErrorMessage - - -class TimerModel(BaseModel): - """Модель схемы данных таймера""" - - id: int - title: str - pomodoro_time: int - break_time: int - break_long_time: int - count_pomodoro: int - - -class NewTimerModel(BaseModel): - """Модель схемы нового таймера""" - - title: str - pomodoro_time: int - break_time: int - break_long_time: int - count_pomodoro: int - - -class UpdateTimerModel(BaseModel): - """Модель схемы обновления данных таймера""" - - title: str | None = None - pomodoro_time: int | None = None - break_time: int | None = None - break_long_time: int | None = None - count_pomodoro: int | None = None - - -class TimerListModel(BaseModel): - """Модель схемы данных таймера для списка""" - - id: int - title: str - pomodoro_time: int - count_pomodoro: int - - -class TimerTimeModel(BaseModel): - """Модель схемы данных времени таймера""" - - hh: int = Field(0, ge=0, le=23) - mm: int = Field(0, ge=0, le=59) - - @field_validator('hh', 'mm') - @classmethod - def check_all_time_fields(cls, value: int) -> int: - """Метод валидирует все поля времени""" - - # гарантирует, что время не равно 00:00:00 - if value == 0: - raise ValueError(ErrorMessage.NO_TIME.value) - - return value diff --git a/src/kawai_focus_v2/start_app.py b/src/kawai_focus_v2/start_app.py deleted file mode 100644 index a01f8fa..0000000 --- a/src/kawai_focus_v2/start_app.py +++ /dev/null @@ -1,12 +0,0 @@ -from kawai_focus_v2.core.settings import settings - -import uvicorn - - -def run(): - uvicorn.run( - 'kawai_focus_v2.main:app', - host=settings.app_settings.host_app, - port=settings.app_settings.port_app, - reload=settings.app_settings.is_reload - )