diff --git a/Dockerfile b/Dockerfile index d2f5bbf..6a21250 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,18 +2,21 @@ ARG NODE_IMAGE=node:24.0.0-alpine FROM ${NODE_IMAGE} AS build +RUN apk add --no-cache python3 make g++ + WORKDIR /app COPY package*.json . RUN npm ci COPY . . RUN npm run build +RUN npm prune --omit=dev FROM ${NODE_IMAGE} AS production WORKDIR /app COPY --from=build /app/dist ./dist +COPY --from=build /app/node_modules ./node_modules COPY --from=build /app/package*.json . -RUN npm ci --omit=dev EXPOSE 9966 CMD [ "node", "./dist/server/entry.mjs"] \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 4211716..20e2026 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "yarkov.tech", - "version": "2.1.0", + "version": "3.0.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "yarkov.tech", - "version": "2.1.0", + "version": "3.0.1", "license": "MIT", "dependencies": { "@astrojs/check": "^0.9.5", diff --git a/package.json b/package.json index a8bc8f4..d90e8a6 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "yarkov.tech", "private": false, - "version": "2.2.0", + "version": "3.0.1", "description": "Personal website created with Astro.", "author": { "name": "Sergey Yarkov", diff --git a/public/media/arduino-uart-converter.png b/public/media/arduino-uart-converter.png deleted file mode 100644 index be74164..0000000 Binary files a/public/media/arduino-uart-converter.png and /dev/null differ diff --git a/public/media/image1.jpg b/public/media/image1.jpg deleted file mode 100644 index 2973b00..0000000 Binary files a/public/media/image1.jpg and /dev/null differ diff --git a/public/media/image2.jpg b/public/media/image2.jpg deleted file mode 100644 index 07356d8..0000000 Binary files a/public/media/image2.jpg and /dev/null differ diff --git a/public/media/image3.jpg b/public/media/image3.jpg deleted file mode 100644 index 8aaeb05..0000000 Binary files a/public/media/image3.jpg and /dev/null differ diff --git a/public/media/mplabx-ide-sim-option.png b/public/media/mplabx-ide-sim-option.png deleted file mode 100644 index 5e62634..0000000 Binary files a/public/media/mplabx-ide-sim-option.png and /dev/null differ diff --git a/public/media/screen-1.png b/public/media/screen-1.png deleted file mode 100644 index f02bc83..0000000 Binary files a/public/media/screen-1.png and /dev/null differ diff --git a/public/media/screen-2.png b/public/media/screen-2.png deleted file mode 100644 index 03ef7ab..0000000 Binary files a/public/media/screen-2.png and /dev/null differ diff --git a/public/media/screen-3.png b/public/media/screen-3.png deleted file mode 100644 index ec420d4..0000000 Binary files a/public/media/screen-3.png and /dev/null differ diff --git a/public/media/serial-port.jpg b/public/media/serial-port.jpg deleted file mode 100644 index a308bd4..0000000 Binary files a/public/media/serial-port.jpg and /dev/null differ diff --git a/public/media/uart-connect-settings.png b/public/media/uart-connect-settings.png deleted file mode 100644 index 98512c5..0000000 Binary files a/public/media/uart-connect-settings.png and /dev/null differ diff --git a/public/media/uart-connection.jpg b/public/media/uart-connection.jpg deleted file mode 100644 index beacf8d..0000000 Binary files a/public/media/uart-connection.jpg and /dev/null differ diff --git a/public/media/uart-packet.jpg b/public/media/uart-packet.jpg deleted file mode 100644 index 1794ba1..0000000 Binary files a/public/media/uart-packet.jpg and /dev/null differ diff --git a/public/media/webserial-connect.png b/public/media/webserial-connect.png deleted file mode 100644 index 868f78e..0000000 Binary files a/public/media/webserial-connect.png and /dev/null differ diff --git a/public/media/webserial-demo-1.png b/public/media/webserial-demo-1.png deleted file mode 100644 index e860571..0000000 Binary files a/public/media/webserial-demo-1.png and /dev/null differ diff --git a/public/media/webserial-demo-2.png b/public/media/webserial-demo-2.png deleted file mode 100644 index da62642..0000000 Binary files a/public/media/webserial-demo-2.png and /dev/null differ diff --git a/public/media/webserial-demo-3.gif b/public/media/webserial-demo-3.gif deleted file mode 100644 index 7bae60b..0000000 Binary files a/public/media/webserial-demo-3.gif and /dev/null differ diff --git a/schema.graphql b/schema.graphql index 0552b19..a205c59 100644 --- a/schema.graphql +++ b/schema.graphql @@ -158,6 +158,9 @@ type Subscription { directus_activity_mutated(event: EventEnum): directus_activity_mutated directus_comments_mutated(event: EventEnum): directus_comments_mutated directus_dashboards_mutated(event: EventEnum): directus_dashboards_mutated + directus_deployment_projects_mutated(event: EventEnum): directus_deployment_projects_mutated + directus_deployment_runs_mutated(event: EventEnum): directus_deployment_runs_mutated + directus_deployments_mutated(event: EventEnum): directus_deployments_mutated directus_files_mutated(event: EventEnum): directus_files_mutated directus_flows_mutated(event: EventEnum): directus_flows_mutated directus_folders_mutated(event: EventEnum): directus_folders_mutated @@ -174,7 +177,6 @@ type Subscription { directus_translations_mutated(event: EventEnum): directus_translations_mutated directus_users_mutated(event: EventEnum): directus_users_mutated directus_versions_mutated(event: EventEnum): directus_versions_mutated - directus_webhooks_mutated(event: EventEnum): directus_webhooks_mutated global_mutated(event: EventEnum): global_mutated global_translations_mutated(event: EventEnum): global_translations_mutated home_page_mutated(event: EventEnum): home_page_mutated @@ -244,7 +246,6 @@ type appeal_mutated { type article { id: ID! - title: String translations(filter: article_translations_filter, limit: Int, offset: Int, page: Int, search: String, sort: [String]): [article_translations] translations_func: count_functions } @@ -264,7 +265,6 @@ type article_aggregated { type article_aggregated_count { id: Int - title: Int translations: Int } @@ -276,7 +276,6 @@ input article_filter { _and: [article_filter] _or: [article_filter] id: number_filter_operators - title: string_filter_operators translations: article_translations_quantifier_filter translations_func: count_function_filter_operators } @@ -487,7 +486,6 @@ input create_appeal_input { input create_article_input { id: ID - title: String translations: [create_article_translations_input] } @@ -861,6 +859,130 @@ type directus_dashboards_mutated { key: ID! } +type directus_deployment_projects { + date_created: Date + date_created_func: datetime_functions + deployment(filter: directus_deployments_filter, limit: Int, offset: Int, page: Int, search: String, sort: [String]): directus_deployments + external_id: String! + id: ID! + name: String! + runs(filter: directus_deployment_runs_filter, limit: Int, offset: Int, page: Int, search: String, sort: [String]): [directus_deployment_runs] + runs_func: count_functions + user_created(filter: directus_users_filter, limit: Int, offset: Int, page: Int, search: String, sort: [String]): directus_users +} + +input directus_deployment_projects_filter { + _and: [directus_deployment_projects_filter] + _or: [directus_deployment_projects_filter] + date_created: date_filter_operators + date_created_func: datetime_function_filter_operators + deployment: directus_deployments_filter + external_id: string_filter_operators + id: id_filter_operators + name: string_filter_operators + runs: directus_deployment_runs_quantifier_filter + runs_func: count_function_filter_operators + user_created: directus_users_filter +} + +type directus_deployment_projects_mutated { + data: directus_deployment_projects + event: EventEnum + key: ID! +} + +input directus_deployment_projects_quantifier_filter { + _and: [directus_deployment_projects_filter] + _none: directus_deployment_projects_filter + _or: [directus_deployment_projects_filter] + _some: directus_deployment_projects_filter + date_created: date_filter_operators + date_created_func: datetime_function_filter_operators + deployment: directus_deployments_filter + external_id: string_filter_operators + id: id_filter_operators + name: string_filter_operators + runs: directus_deployment_runs_quantifier_filter + runs_func: count_function_filter_operators + user_created: directus_users_filter +} + +type directus_deployment_runs { + date_created: Date + date_created_func: datetime_functions + external_id: String! + id: ID! + project(filter: directus_deployment_projects_filter, limit: Int, offset: Int, page: Int, search: String, sort: [String]): directus_deployment_projects + target: String! + user_created(filter: directus_users_filter, limit: Int, offset: Int, page: Int, search: String, sort: [String]): directus_users +} + +input directus_deployment_runs_filter { + _and: [directus_deployment_runs_filter] + _or: [directus_deployment_runs_filter] + date_created: date_filter_operators + date_created_func: datetime_function_filter_operators + external_id: string_filter_operators + id: id_filter_operators + project: directus_deployment_projects_filter + target: string_filter_operators + user_created: directus_users_filter +} + +type directus_deployment_runs_mutated { + data: directus_deployment_runs + event: EventEnum + key: ID! +} + +input directus_deployment_runs_quantifier_filter { + _and: [directus_deployment_runs_filter] + _none: directus_deployment_runs_filter + _or: [directus_deployment_runs_filter] + _some: directus_deployment_runs_filter + date_created: date_filter_operators + date_created_func: datetime_function_filter_operators + external_id: string_filter_operators + id: id_filter_operators + project: directus_deployment_projects_filter + target: string_filter_operators + user_created: directus_users_filter +} + +type directus_deployments { + credentials: String + date_created: Date + date_created_func: datetime_functions + id: ID! + options: JSON + options_func: count_functions + projects(filter: directus_deployment_projects_filter, limit: Int, offset: Int, page: Int, search: String, sort: [String]): [directus_deployment_projects] + projects_func: count_functions + provider: String! + user_created(filter: directus_users_filter, limit: Int, offset: Int, page: Int, search: String, sort: [String]): directus_users +} + +input directus_deployments_filter { + _and: [directus_deployments_filter] + _or: [directus_deployments_filter] + credentials: string_filter_operators + date_created: date_filter_operators + date_created_func: datetime_function_filter_operators + id: id_filter_operators + options: string_filter_operators + options_func: count_function_filter_operators + projects: directus_deployment_projects_quantifier_filter + projects_func: count_function_filter_operators + provider: string_filter_operators + user_created: directus_users_filter +} + +type directus_deployments_mutated { + data: directus_deployments + event: EventEnum + key: ID! +} + type directus_files { charset: String created_on: Date @@ -1387,10 +1509,30 @@ input directus_roles_quantifier_filter { } type directus_settings { + ai_anthropic_allowed_models: JSON + ai_anthropic_allowed_models_func: count_functions + ai_anthropic_api_key: String + ai_google_allowed_models: JSON + ai_google_allowed_models_func: count_functions + ai_google_api_key: String + ai_openai_allowed_models: JSON + ai_openai_allowed_models_func: count_functions + ai_openai_api_key: String + ai_openai_compatible_api_key: String + ai_openai_compatible_base_url: String + ai_openai_compatible_headers: JSON + ai_openai_compatible_headers_func: count_functions + ai_openai_compatible_models: JSON + ai_openai_compatible_models_func: count_functions + ai_openai_compatible_name: String + """$t:fields.directus_settings.ai_system_prompt_note""" + ai_system_prompt: String auth_login_attempts: Int auth_password_policy: String basemaps: JSON basemaps_func: count_functions + """$t:fields.directus_settings.collaborative_editing_note""" + collaborative_editing_enabled: Boolean! custom_aspect_ratios: JSON custom_aspect_ratios_func: count_functions custom_css: String @@ -1663,27 +1805,6 @@ type directus_versions_mutated { key: ID! } -type directus_webhooks { - actions: [String]! - collections: [String]! - data: Boolean - headers: JSON - headers_func: count_functions - id: ID! - method: String - migrated_flow(filter: directus_flows_filter, limit: Int, offset: Int, page: Int, search: String, sort: [String]): directus_flows - name: String! - status: String - url: String! - was_active_before_deprecation: Boolean! -} - -type directus_webhooks_mutated { - data: directus_webhooks - event: EventEnum - key: ID! -} - type global { email: String! github: String! @@ -2145,7 +2266,6 @@ input update_appeal_input { input update_article_input { id: ID - title: String translations: [update_article_translations_input] } @@ -2359,7 +2479,6 @@ type version_appeal { type version_article { id: ID - title: String translations: JSON } diff --git a/src/actions/index.ts b/src/actions/index.ts index 88521d8..33e137d 100644 --- a/src/actions/index.ts +++ b/src/actions/index.ts @@ -11,10 +11,13 @@ export const server = { input: z.object({ name: z.string(), email: z.string().email(), + website_url: z.string().optional(), // honeypot field subject: z.string(), message: z.string(), }), handler: async (data, ctx) => { + if (data.website_url && data.website_url.trim() !== "") return true; + const currentDate = new Date(); const latestAppeals = await getLatestAppealsByClientIp(ctx.clientAddress, 5); const appealsLastHrs = latestAppeals.filter((a) => { diff --git a/src/components/ContactForm.astro b/src/components/ContactForm.astro index f7641a4..6b58068 100644 --- a/src/components/ContactForm.astro +++ b/src/components/ContactForm.astro @@ -17,6 +17,10 @@ const formResult = Astro.getActionResult(actions.appeal);
+