Projekt aplikacji SaaS
8 godz. 8 min · Next.js · Full-stack i Programowanie
Daniel NoworytaFull stack DeveloperNaucz się tworzyć bezpieczne systemy uwierzytelniania i autoryzacji, korzystając z Clerk. Pokażę Ci, jak to robić krok po kroku, aby Twoje aplikacje były bezpieczne i profesjonalne.
Zrozumiesz, jak skutecznie i bezboleśnie połączyć swoją aplikację Next.js z bazą danych PostgreSQL na DigitalOcean. Pokażę Ci, jak używać Prismy, aby ułatwić ten proces.
Dowiesz się, jak zarządzać routingiem i nawigacją w swojej aplikacji, aby użytkownicy mogli łatwo i intuicyjnie poruszać się po Twojej stronie.
Pokażę Ci, jak z łatwością wdrożyć swoją aplikację na Vercel, jednym z najpopularniejszych środowisk hostingowych dla aplikacji Next.js.
Nauczysz się zarządzać stanem aplikacji i jak wykorzystać server actions w praktyce, co pozwoli Ci na tworzenie bardziej zaawansowanych i dynamicznych funkcji.
Ten kurs jest dla osób, które już mają pewne doświadczenie z JavaScript i chcą zgłębić swoje zrozumienie Next.js. Zakładamy, że znasz podstawy TypeScript, TailwindCSS, ale nie potrzebujesz doświadczenia z Next.js - wszystko wyjaśnię Ci od podstaw!
Teraz przejdziemy do modelowania naszych danych w schemacie Primy.
Natomiast zanim to polecam Ci zainstaluj
sobie extension do Visual Studio Code o nazwie Prisma.
To dodaje Syntax Lighting w plikach, które są właśnie plikami schematu Primy.
Jest wtedy łatwiej pisać schemat.
Nasz kod wygląda bardziej czytelnie, jest automatycznie sformatowany.
Także przejdźmy teraz do podstawowego pliku z schematem Prisma.
To co mamy tutaj na początku to jest tylko
provider, z którym możemy sobie ustalić custom.
My w naszym projekcie będziemy używać default owego providera z Primy.
Dodatkowo mamy tutaj.
Jeżeli chodzi o Data Source DB Provider nasza baza danych to jest cool.
No i URL to jest pliku dot
database URL to jest to co mamy w naszym pliku do ten co już sobie zrobiliśmy.
Przejdźmy teraz do przenoszenia tego co mieliśmy tutaj w tym schemacie.
Mianowicie dokładnie tu musimy sobie to przenieść na schemat w piśmie.
Tak ja sobie zostawię tą prawą stronę
otwartą, żebyśmy wiedzieli o czym w danym momencie mówimy.
I teraz jeżeli chodzi o model, wpiszmy no to robimy model i nazwiemy to user.
To będzie model naszego użytkownika.
Będziemy potrzebowali jakiegoś ID, jakiś identyfikator naszych
użytkowników, czyli niech to będzie pole ID o typie string.
I tutaj oznaczymy sobie, że jest to ID i to jest.
Definiujemy parametr, który jest primary
key w naszej tabeli, czyli w wprost w relacyjnych baza danych Primary key to
jest identyfikator danego rekordu w danej tabeli.
Czyli my sobie zaznaczymy, że to jest ID
właśnie tutaj dla nas i chcemy żeby to było.
Nie chcemy, żeby to się powtarzało.
Dodatkowo co będziemy potrzebować dla
każdego usera potrzebujemy jakiś name, niech to będzie też string.
Tutaj nie musimy nic zaznaczać, nie musi to być unikalne.
Możemy mieć użytkowników o tej samej nazwie.
Nie ma tego problemu, bo użytkowników
będziemy identyfikować za pomocą ich pola ID.
No i jeszcze najlepiej żeby był email
to też będzie string i tu też musimy sobie zrobić silnik.
Nie chcemy mieć dwóch użytkowników z tym samym mailem.
Nie powinno być to możliwe, żeby dwóch
użytkowników o tym samym emailu stworzyło sobie konta na naszej aplikacji.
Dlatego już musimy tutaj w modelu
zaznaczyć, że to jest unik i nie dopuszczamy takiej sytuacji, że
jest dwóch użytkowników o tym samym adresie e-mail.
Teraz przejdźmy sobie do montażu subskrypcji.
To jest bardziej skomplikowany model co my tutaj potrzebujemy?
Oczywiście model, nie model.
I tak każda subskrypcja na pewno też będzie miała ID.
Czyli tu mamy string i też będzie to pole.
ID możemy zrobić jako default.
To jest format, który sobie zakładamy, że
będzie formatem określającym jak powinno wyglądać ID w naszej bazie danych.
Teraz mamy name.
Każda subskrypcja powinna mieć name
w naszym modelu, który sobie założyliśmy po prawej stronie.
Będzie to przydatne do tego, żeby wyświetlać alfabetycznie.
Price też jest potrzebny i to będzie float number.
Chcemy umożliwić użytkownikowi ceny po przecinkach.
Jeżeli chodzi o kolejne wartości to potrzebujemy jakąś
walutę czyli currency i tutaj już wprowadzimy pojęcie enum.
W modelach Primy z.
Te rejsy.
I oczywiście na chwilę obecną to nie
istnieje i dlatego musimy sobie stworzyć taki enum o takiej nazwie.
I w tym momencie możemy już sobie wykorzystać.
Tutaj już będziemy testować błędy,
natomiast tutaj prostych enum ów nie możemy tworzyć.
Do tego jeżeli chodzi o waluty, które będziemy obsługiwać w naszej aplikacji.
Niech to będą złotówki, niech to będą
waluta euro i niech to będzie waluta USD, czyli dolary.
Już nie mamy żadnych problemów z naszą walutą.
Kolejne pole, które będziemy potrzebować to Start date.
I to będzie typ datetime.
Widzisz, że nazwa pola i typ Tak określamy schemat bazy danych w prime nazwa, pole,
typ i jeszcze mamy dodatkowe dekorator, które pozwalają nam
wykorzystywać możliwości danej danego typu bazy danych, który mamy tutaj.
Wszystko to jest opisane w dokumentacji.
Staram się pokazać w jaki sposób możesz
sobie modelować dane za pomocą właśnie identyfikatora rodzaju.
Jaki to jest typ danych no i dekoratorów, które mamy dostępne.
Za chwilkę przejdziemy się do relacji.
To jest dosyć skomplikowaną sprawą.
Schemat jest trudny do załapania, ale za chwilkę Ci to wytłumaczę.
Pójdźmy teraz dalej.
Kolejnym polem, które będziemy potrzebować na pewno jest End Date i to będzie pole
opcjonalne, czyli DateTime i znak zapytania.
Czyli to może być.
Nie musi być subskrypcja, może być np.
tak jak Netflix jest odprawiana
miesięcznie, dlatego end date nie mamy za bardzo.
Natomiast jeżeli ktoś wykupi sobie jakiś serwis na dany czas np.
na rok, to możemy od razu zaznaczyć
odpowiednie powiadomienie w naszej aplikacji.
Jeżeli chodzi o kolejne rzeczy to mamy billing period.
Czyli tutaj też kolejny enum, który
będziemy wykorzystywać w naszej aplikacji jest subskrypcją.
Piling.
J.
I stworzymy sobie ten enum tutaj.
I tu potrzebujemy
zależności w jaki sposób będziemy umożliwiać użytkownikowi wpisywanie.
Właśnie tego okresu rozliczania się, co następuje.
My załóżmy, że w naszej aplikacji mamy monthly kwartalny
i roczne, czyli mamy miesięczne subskrypcje kwartalne i roczne.
To są możliwości, które użytkownik może sobie wykorzystać.
W naszej aplikacji możesz sobie tu
zaznaczyć co ile musi płacić za daną subskrypcję.
Następne rzeczy, które potrzebujemy to tak naprawdę jest next payment that.
To też jest bardzo ważna informacja, którą
musieli musimy wyświetlać na naszych ekranach.
Jeżeli chodzi zobacz mamy ekran
subskrypcji i tutaj jest informacja związana z next payment.
Dlatego musimy sobie to zawrzeć w naszym modelu danych.
Next.
Pigment.
To także.
Kolejna rzecz to jest kategoria.
To może być string, zwykły awatar, URL też może być string zwykły walidację.
Jeżeli chodzi o to, możemy zrobić po
stronie klienta we wpisywaniu, albo możemy tak ograć nasz
system, że klient będzie podawał tylko i wyłącznie stronę np.
www do danej subskrypcji, a my z tej
strony będziemy otrzymywali logo i używanie tego jako naszego awatara.
Możliwości tutaj jest mnóstwo tak naprawdę, które można sobie wykorzystać.
Kolejną rzeczą, którą będziemy potrzebować w naszej subskrypcji jest status.
I tutaj też kolejny enum subskrypcji.
No bo mamy przykład, że może być aktywna,
kontrolowana, spasowana, nieaktywna i jeżeli chodzi o statusy.
Na chwilę obecną stworzymy sobie dwa, że będzie aktywna i nieaktywna Activ Active.
I potrzebujemy teraz budować nasze relacje.
Mianowicie każda subskrypcja powinna mieć.
Ja sobie zapisze ten plik.
Widzisz, ładnie mi się sformatowałem
dzięki temu rozszerzeniu, które przed chwilą, o którym przed chwilą mówiliśmy.
Każda subskrypcja powinna mieć jednego właściciela, czyli usera.
Relacje w schemacie buduje się za pomocą dwóch pól.
Zawsze musimy użyć pola, które jest polem referencyjnym do relacji, czyli w tym
przypadku zrobienie sobie one id i to będzie string.
Dlaczego typ String?
Dlatego, że typ pola id usera to też jest string.
I to będzie dokładnie ta dana, która będzie zapisywana tutaj w tym polu,
która będzie określała, który użytkownik jest właścicielem tej subskrypcji.
Jeżeli chodzi o samą relację
to musimy sobie wpisać owner i tutaj typ to będzie user.
Żeby stworzyć relację w piśmie
zrobimy sobie użyjemy sobie pola relation i tutaj mamy fields.
To jest jedna rzecz, którą musimy określić.
I kolejna rzecz, którą musimy określić, to jest referencje, czyli pola referencji.
No i jeszcze my sobie określimy, że jeżeli usuniemy danego użytkownika, to chcemy też
usunąć wszystkie subskrypcje związane z tym użytkownikiem.
Normalnie powinniśmy flagowa subskrypcję w naszej aplikacji.
Natomiast żeby uprościć troszkę tą sprawę
ja sobie tutaj zaznaczę, że on the limit będzie Cascade, czyli
wszystkie dzieci, rekordy dzieci, subskrypcje powinny zostać usunięte.
Jeżeli to zostanie usunięta, czyli
wszystkie płatności nie będziemy tego flagowe, co jest dobrą praktyką.
Generalnie rzecz biorąc.
Natomiast na potrzeby tego kursu zrobimy sobie kaskadowe usuwanie rekordów.
Jeżeli usuniemy danego użytkownika z bazy
danych One RAID, to będzie pole, które jest referencją
filtrem, który określa relację, a referencja to będzie ID.
To jest pole tego użytkownika.
No i mamy naszą relację już stworzoną.
No i teraz kolejna rzecz, którą
subskrypcja będzie zawierała to płatności Payments tutaj.
Wchodzi nowy model.
To będzie tablica o typie payment.
No i już musimy sobie stworzyć nowy model, który określi nam
jak będzie wyglądała płatność w naszym modelu danych, czyli model payment.
I tak payment na pewno też przydałoby się, żeby miał ID.
Czyli zrobimy sobie na takiej samej zasadzie co nasza subskrypcja.
Niech to będzie już ID format String.
Że bardzo fajne jest to, że generalnie jak zapiszę to tutaj.
Prisma jest na tyle inteligentna, że
potrafi mi podsunąć pomysł jak powinna wyglądać moja relacja.
Tak naprawdę prawie w stu procentach jest ona zbudowana tak, jak my byśmy chcieli.
Jest tutaj kilka rzeczy, które chciałbym
jeszcze zmienić, dlatego wyrzucimy sobie to tutaj i będziemy pisać
sobie, żeby przećwiczyć sobie tą relację samemu.
Natomiast zanim do relacji przejdziemy, to zapiszmy sobie najpierw
amount, czyli to będzie ilość, koszt, wartość tego rachunku, wartość tego
fragmentu, który chcemy pokazywać to będzie też wartość float.
Dodatkowa rzecz date, czyli data płatności DateTime.
I niech to będzie db that.
Określamy jakby rodzaj danego pola w bazie danych.
Status.
Niech to będzie payment status i możemy sobie zaznaczyć wartość domyślną.
W naszym przypadku niech to będzie odpłatne.
Jeżeli ktoś tworzy jakiś nowy nową
subskrypcję, to prawdopodobnie jeszcze nie będzie zapłacona ta opłata.
Natomiast potrzebujemy oczywiście stworzyć
sobie ten i nam tutaj będzie pat i not bad.
Mamy payment status.
Potrzebujemy jeszcze tutaj określić, że to jest wartość default w
naszej bazie danych i ten default to będzie właśnie pat w naszym przypadku.
I teraz przejdziemy do naszej relacji Subskrypcje paid to będzie string.
No i jeżeli chodzi o relację to subskrypcja to jest pole subskrypcji.
No i relację tworzymy poprzez to sam.
Tę samą zasadę, którą mieliśmy tutaj.
Czyli ja sobie zrobię kopiuj wklej na dół.
I jeżeli chodzi o filc to jest git.
W naszym przypadku to jest pole, które określa naszą relację.
Jeżeli chodzi o referencję jest ok.
Pole ID w subskrypcji istnieje i to jest
nasza referencja do rekordu w tabeli Subskrypcje.
I to by było na tyle.
Mamy nasz model bazy danych i teraz
przejdźmy do użycia tego modelu w praktyce.