Грязный ноукодер
1.29K subscribers
116 photos
12 videos
2 files
161 links
Пишу про AI, no-code и бизнес процессы.
@low_code - для связи
Видео гайды - https://www.youtube.com/@5_min_ai
Обучение - https://www.skool.com/5minai-pro
Download Telegram
Сегодня я поделюсь лайфхаками по работе с Supabase, которые я узнал, пока автоматизировал многоступенчатый процесс лизинга для мексиканской компании.

1️⃣ Вы можете создать базу через интерфейс, но мне больше нравится описывать вместе с ChatGPT запросы на создание нужных таблиц и просто запускать их во вкладке SQL Editor.

CREATE TABLE public.log_types (
id uuid NOT NULL DEFAULT gen_random_uuid(),
type_name TEXT NOT NULL,
CONSTRAINT log_types_pkey PRIMARY KEY (id)
) TABLESPACE pg_default;

2️⃣Немного о первичном ключе:

- Каждая запись должна иметь уникальный идентификатор, иначе вы не сможете изменять или удалять их.

- Для первичного ключа я использую поле с типом uuid и автоматической генерацией через дефолтное значение - gen_random_uuid(). Можно выбрать порядковую нумерация начиная с 1, но мне такой вариант не подошел, ведь при использовании этого id в ссылке пользователь сможет заменить его на другой и посмотреть чужую запись.

- Если вы ошиблись и хотите поменять тип Primary поля, то вам придется сделать несколько действий - для начала вам нужно снять галочку с текущего поля и сохранить таблицу, только после этого вы сможете выбрать новое поле.

3️⃣ Для разных типов данных можно использовать разные типы поля. Вы можете использовать для текста один и тот же тип text, а можете варьировать тип в зависимости от размера данных, которые собираетесь там хранить. Каждый из типов резервирует в базе определенный размер памяти, поэтому если вы собираетесь делать большой и масштабируемый проект, есть смысл задумываться над типом каждого поля.

- Varchar - короткий текст
- Text - длинный текст
- Timestamptz - дата с временем и таймзоной
- Int8 - для целых чисел
- Float8 - для чисел с точкой
- Bool - для логических переменных
- JSON - для хранения объектов

4️⃣ У поля можно выбрать дефолтное значение - удобно выставлять текущую дату или дефолтный статус.

5️⃣ Вы можете настроить поле с ссылкой на другую таблицу (значок ссылки). Для этого нужно будет выбрать таблицу и нужное поле (uuid). В настройке “Action if referenced row is removed” следует выбрать поведение базы при удалении референса, иначе при удалении записи и наличии связи база выдаст ошибку.

- Cascade - удалить связанные записи
- No action - ничего не делать, но вызывает ошибку
- Set default/NULL - выставить дефолтное/NULL значение (выбрайте это, если не знаете что лучше)

6️⃣ Все типы полей могут быть массивами (значок шестеренки - Set as Array). Однако, ссылки на другие таблицы не поддерживают массивы. Для хранения массива ссылок на другую таблицу следует убрать связь и хранить данные как массив uuid/text.

7️⃣ Не стоит забывать про нейминг таблиц и полей. Я использую snake_case конвенцию, а ссылки на другие таблицы обозначаю как entity_id.

8️⃣ Файлы хранятся отдельно в storage и вызываются/сохраняются по пути файла через API (название папок/название файла.расширение). Каждый файл я храню в отдельной папке пользователя (название - user_id), сами папки хранятся в папке сущности (users). В отдельной таблице в БД хранятся файлы с названием и полным путем до файла в storage (users/user_id/filename.txt).

9️⃣ Для получения временной ссылки на файл (удобно для просмотра) нужно сначала запросить url с помощью запроса https://yourbase.supabase.co/storage/v1/object/sign/file_storage/[filepath] : JSON body {"expiresIn": 600}. Далее эту ссылку можно использовать с префиксом https://yourbase.supabase.co/storage/v1


Данные советы могут содержать неточности и основаны лишь на моем опыте. Также для простоты я использую мастер-ключ для API запросов к базе (получение файлов), что является плохой практикой. Каждый пользователь должен быть создан в Supabase, данные должны быть привязаны к пользователю и для запросов к API нужно использовать токен пользователя, чтобы ограничить доступ к другим файлам.

Ставьте лайк и подписывайтесь, в следующей части мы разберем лайфхаки подключения SQL к Bubble
В no-code возможно зарабатывать $5-10 тыс./мес.

Какого уровня дохода вам хотелось бы достичь в следующем году? Как вы думаете, какие скиллы вам нужно для этого подтянуть?
Как сделать не виснующее ноукод приложение с БД в 1000000 строк?

Продолжаем говорить о SQL и сегодня разберем полезные советы о работе с SQL в Bubble.
Ранее я уже делал ряд постов об этом, поэтому не будем повторяться и посмотрим новые инсайты.

1️⃣ Для подключение к Supabase устанавливаем плагин SQL Connector и берем креды из Settings - Database. Далее формируем строку для плагина - postgres://User:Password@Host:Port/Database.

- Пример: postgres://postgres:YGe24reS51Sba@db.ekgfdgwertwerajnwqw.supabase.co:5432/postgres

2️⃣ Работая с большим объемом данных не обойтись без пагинации - ее можно сделать с помощью OFFSET и переменной ($1). Для показа следующей “страницы” добавьте к переменной число, указанное у вас в LIMIT. При пагинации обязательна сортировка данных, чтобы БД точно понимать какие именно записи идут следующими.

- ORDER BY created_date DESC LIMIT 200 OFFSET $1;

3️⃣ Переменные в запросах:

- При составлении запроса заранее задумайтесь о переменных, которые вы будете использовать в нем. Если вы захотите удалить переменную, то порядок всех остальных переменных сместиться, поэтому лучше просто заменять ненужную переменную на последнюю в списке.

- Если вам нужно сделать запрос для поиска с различными фильтрами (переменными), которые могут быть пустыми, добавьте в условие проверку переменной - $1 IS NULL. Примеры условий для разных типов:
- - Текстовая переменная - (status LIKE '%' $1 '%' OR $1 IS NULL)
- - Числовая переменная - (telegram_id = $1 OR $1 IS NULL)
- - Массив - school_name = ANY(ARRAY[$1] OR $1 IS NULL) - $1=‘Harvard,Stanford’

- Если у вас есть проблемы с типом данных на стороне Bubble, смените тип переменной в SQL - $1::text или $1::int

4️⃣ Не бойтесь SQL, за меня на нем пишет ChatGPT. Даже 3.5 версии достаточно скормить структуру ваших таблиц (Table - Definition) и он сам напишет все нужные запросы за вас.

🔥Совет со звездочкой для самых-самых:

Кейс - я хочу выбрать из списка заказ и показать детали этого заказа.
Источником данных для карточки деталей заказа я использую выбранную запись из общего списка заказов, который основан на запросе get_orders. Тут нет проблем - жмем на заказ и используем This get_orders.
Но каждый запрос воспринимается как отдельный тип данных. Если я хочу из карточки счета перейти в заказ мне нужно либо использовать отдельный запрос get_this_order, либо брать весь список заказов и фильтровать его на стороне клиента, чтобы получить данные по конкретному заказу.

Первый способ вернет другой типа данных, который нельзя использовать для карточки товара (у нас там все завязано на get_orders). Второй же способ небезопасен (так как грузятся все данные на сторону клиента) и неэффективен (это может занять очень много времени). Что же делать?

Мы делаем универсальный запрос get_orders, куда добавляем еще один фильтр id=$1. Проблема в том, что UUID это жесткий 32 символьный формат и при попытке отправки пустой строки вы получите ошибку ($1 IS NULL тоже не поможет). Для обхода этой проблемы мы заменяем дефолтное пустое значение на валидный UUID и меняем условие. (id = $4 OR $4= '00000000-0000-0000-0000-000000000000’)


Спасибо вам, за то что читали мой блог весь этот год. ❤️‍🔥
Поздравляю всех с наступающим Новым Годом🎄, ставьте лайки и подписывайтесь, в следующем году дело примет серьезные обороты!
Channel name was changed to «Грязный ноукодер»
Добро пожаловать на канал Грязного ноукодера

Что случилось?

Я делаю ребрендинг и начинаю прокачивать личный бренд. Вместе с этим я хочу выбросить из головы различные дурацкие принципы, сдерживающие меня от более публичной жизни и личностного роста.
Так повелось, что в моей семье и в условиях того места, где я жил, выделяться из толпы было зазорно и порою даже опасно. Поэтому будучи когда-то энергичным и открытым к миру, я навесил на себя множество ограничений, чтобы выжить в том суровом мире. Теперь, когда жизнь координально изменилась, пора меняться и мне.

Почему такое название?

Несмотря на мой сугобо технический контент, в жизни я совсем другой человек👀
Посудите сами - сейчас, когда меня просят рассказать о себе, я представляюсь так:

2019: работал бизнес-аналитиком
2020: работал в Integromat
2021: помогал делать немецкий стартап
2022: работал с инвестиционным фондом из США

Сухо, грустно, скучно. А что если так:

2012: слил первую 10ку на бинарных опционах
2014: придумывал стратегии для Forex
2015: полгода пытался математически переиграть букмекеров
2016: кардил через Paypal аккаунты
2019: создал сетку дропов для заработка на альфах
🔽
2022: все эти ранее накопленные навыки помогли мне с помощью ноукод обработать транзакций на $14 млн.

Стало интересней? А если я добавлю, что мне пришлось чистить следы за одним из 🍋 и мой бывший босс все еще под следствием в США? Думаю теперь вам будет о чем почитать 😏

А чтобы познакомиться еще ближе, предлагаю начать этот год с полезной личной встречи. Я буду рад пообщаться с вами и узнать на каком этапе ноукодерского пути вы находитесь, по возможности дам полезный совет и задам несколько вопросов, которые помогут вам выйти на следующий уровень в новом году.

Назначить встречу можно тут - https://calendly.com/lowcodingdev/networking
Please open Telegram to view this post
VIEW IN TELEGRAM
Как достичь стабильности в ноукоде?

Ответ на мой вчерашний призыв не заставил себя ждать и я уже успел созвониться с одним из своих подписчиков и обсудить его путь no-code разработчика.

Несмотря на весомый опыт в разработке, знание кода и английского языка (как по мне отличный набор для выхода на новый уровень), у него есть одна острая проблема. Эта проблема знакома большинству разработчиков и агентств - нет стабильного потока проектов. Невозможно строить планы и не сжигать нервные клетки, когда проекты то и дело появляются и исчезают в самый неподходящий момент.

Откуда же берется стабильность? Из большого потока задач. Ими вас может обеспечить агентство (продажники постоянно находят новые проекты), компания с растущим продуктом (рост = потребность в новых фичах) или же налаженный источник трафика (главное выстроить хорошую воронку).

1️⃣ Агентство. Вы можете создать свое🥲 или постучаться во все существующие агентства на российском/зарубежном рынке (не забывайте, что есть множество агентств на западе с русскими командами). Их можно найти на Clutch, Bubble, Airtable, Make, и в прочих списках.

2️⃣ Растущий продукт. Это компания с развивающимся бизнесом, использующая внешний или внутренний ИТ продукт . В зависимости от размера продукта вы можете получить должность разработчика в существующей команде или в одиночку тянуть на себе техническую часть продукта как фрилансер. Найти такое можно на досках с вакансиями (Linkedin, HH) или на биржах (Upwork, Fivver). Также, вы можете стать частью такого продукта, если создадите MVP и оно начнет приносить реальную пользу.

3️⃣ Источник трафика. Тут все гораздо сложнее, но надежнее. Вам нужно выстраивать собственную воронку с источником трафика и продуктом. Источники трафика - посты в соцсетях (Linkedin, TG), профильные статьи в онлайн журналах (VC.ru, habr), помощь в чатах комьюнити (TG, Facebook, Reddit, Linkedin), таргетированная реклама (Yandex, Google, IG), прочее (Avito🤨). Продукт - блог в тг, сайт, профиль на бирже или соцсети, где вы рассказываете о своей деятельности и призываете пользователя записаться на консультацию/оставить заявку с описанием проекта.

🔥 Бонус источник - ваши текущие клиенты. Самый мощный источник новых заказов для любого бизнеса - сарафанное радио. Выполните свою работу качественно, проявите заботу о клиенте и его продукте, и он будет советовать вас всем знакомым даже спустя несколько лет.

Кстати, этот подписчик ищет работу Bubble разработчика и вы можете связаться с ним напрямую - @pirueti

Если и вы хотите получить полезных советов или просто приятно поболтать, ставьте лайки и успевайте забронировать звонок тут - https://calendly.com/lowcodingdev/networking
Please open Telegram to view this post
VIEW IN TELEGRAM
Меня всегда интересовала корреляция «впахивания» и получаемых доходов.

С одной стороны примеры из соцсетей дразнят нас историями людей, которые работают по часу в день и путешествуют по всему миру.
С другой стороны успешные люди в интервью то и дело рассказывают про 10-12 часовые рабочие дни.

Сколько часов в день работаете вы работаете сейчас?
Пытаетесь ли вы работать больше или качественнее, чтобы выйти на новый уровень дохода?
Please open Telegram to view this post
VIEW IN TELEGRAM
Жесть…

Очень быстро собрали 30 огней🔥🤝

Для меня очень ценно видеть вашу тягу к практическим знаням, я сам был и остаюсь таким же.

Уже сел готовить для вас структуру урока, чтобы выжать 140% процентов пользы.

Как попасть на урок — расскажу завтра.
Please open Telegram to view this post
VIEW IN TELEGRAM
Всем привет!

Весь день готовлюсь к предстоящему уроку по автоматизации в Make, на который записалось уже 20 человек.

С каждым часом в голове всплывает все больше инсайтов и кажется что и двух часов не хватит, чтобы всех их покрыть.

Кто еще не успел прочитать последний пост в канале, заполнить анкету и зарегистрироваться на урок — успевайте, так как времени осталось совсем немного.

Даже если вы не сможете принять участие в уроке — я все равно пришлю его запись на почту.

А пока оставляю вам план урока, до встреч в 17:00 по МСК.
Спасибо всем, кто поучаствовал на вчерашнем уроке и заполнил анкету!🔥

Я внимательно изучил ваши запросы и сделал вывод, что ваша основная точка интереса — это вырасти в уровне дохода.

У меня есть много чем поделиться на эту тему, так как сам прошел каждый шаг на пути с 0 до $5’000 на ноукоде и понимаю, как прийти к этому результату кратчайшим маршрутом.

Сейчас я рассылаю всем запись урока вместе с презентацией (вы еще успеваете получить ее, заполнив анкету).

Также я добавил туда дополнительных ссылок и домашнее задание разной сложности.

Кто был на уроке — напишите, как вам?

Буду благодарен за обратную связь в комментариях
Please open Telegram to view this post
VIEW IN TELEGRAM
Совсем забыл, что хотел визуализировать вчерашний рассказ 😅
Please open Telegram to view this post
VIEW IN TELEGRAM
7 советов как обезопасить Bubble приложение

На выходных я созвонился с бывшим боссом и он предложил мне повторить разработанную нами систему для нового инвестфонда. Я задумался о том, что хочу сделать новую систему более безопасной и эффективной и для этого составил список вещей, которые нужно не забыть применить при разработке системы в Bubble.

1️⃣ Скрывайте URL запросов в API Connector. Вместо URL может быть указан как параметр [url], в котором будет записан нужный URL с галочкой Private, что позволит скрыть его на фронте для пользователя. Так как я делаю запросы для бекенд процессов в Make мне требуется скрыть эти URL (чтобы не задуддосили 🥲) и настраивать дополнительный внутренний API ключ.

2️⃣ Отключите Swagger file в настройках, иначе у злоумышленников будет полная карта вашего приложения.

3️⃣ Установите 2FA для пользователей. Это можно сделать с помощью функционала Bubble (при наличии плана Production) или с помощью стороннего плагина. Также установите Password policy в настройках, чтобы усилить пароли пользователей.

4️⃣ Исправьте backend workflows без аутентификации, все должно запускаться изнутри приложения или используя API ключ.

5️⃣ Восстановление пароля должно проходить на бекенде - если делать это на фронте, вы производите поиск по базе в открытую и в инструменте разработчика (F12) можно будет увидеть результат этого поиска вместе с новым паролем.

6️⃣ Проверьте Privacy Rules в Data - каждый пользователь должен иметь доступ только к своим данным. Если у вас есть админ панель для управления данными всех пользователей, то установите соответствующую роль для админа. Если вы хотите использовать данные по API, то пользуйтесь API ключом и ограничьте Find this in searches для Everyone else.

7️⃣ Установите галочку Make this file private для всех inputов с файлами и картинками.

Ставьте лайк и подписывайтесь, завтра я выпущу статью на VC по мотивам моего прошлогоднего поста - посмотрим что изменилось после моего разговора с основателем Betterlegal в Twitter, какие данные не прикрыли компании из зала славы Bubble и как найти ID приложения, если Swagger документацию скрыли.
Please open Telegram to view this post
VIEW IN TELEGRAM
Всем привет!

Я опубликовал статью на VC про взлом приложений на Bubble с кейсами самых больших продуктов на Bubble.
Несмотря на то, что статья подсвечивает слабые места no-code приложений, основной ее целью является обратное - показать как не стоит делать при разработке приложений и распространить best practices, которые помогут выводить no-code продукты на уровень продуктов на коде.

Буду рад, если вы поддержите лайком/комментарием на VC, чтобы больше людей узнали о no-code и перестали относится к этому скептически!

https://vc.ru/dev/997353-kak-vzlomat-no-code-prilozhenie-s-investiciyami-1-8-mln