Skip to content

fredrir/Y

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

879 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Y - The new age of social media!!

Dette prosjektet er tilgjengelig pΓ₯ nett ogsΓ₯!!

Oppsett

Frontend kan kjΓΈres med:

cd frontend
npm install
npm run dev

Backend kan kjΓΈres med:

cd backend
npm install
npm run start:dev

[!NOTE!] To run the project locally, both the backend and the frontend must be running on seperate terminals. When running the project locally, images are uploaded to your own computer. These locally stored images will not be accessible on the production website. This setup is optimal for testing and simulating how image uploads will behave on the virtual machine (VM).

End-2-end tester kan kjΓΈres med (sΓΈrg for at backend og frontend kjΓΈres):

cd frontend
npm run cypress:run

Komponent tester kan kjΓΈres med:

cd frontend
npm run test

Backend

Les README for backend her.

Frontend

Les README for frontend her.

Filstruktur

.
β”œβ”€β”€ README.md
β”œβ”€β”€ backend
β”‚   β”œβ”€β”€ README.md
β”‚   β”œβ”€β”€ express.d.ts
β”‚   β”œβ”€β”€ package-lock.json
β”‚   β”œβ”€β”€ package.json
β”‚   β”œβ”€β”€ src
β”‚   β”‚   β”œβ”€β”€ auth.ts
β”‚   β”‚   β”œβ”€β”€ index.ts
β”‚   β”‚   β”œβ”€β”€ models
β”‚   β”‚   β”‚   β”œβ”€β”€ comment.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ context.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ hashtag.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ index.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ notification.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ post.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ postItem.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ repost.ts
β”‚   β”‚   β”‚   └── user.ts
β”‚   β”‚   β”œβ”€β”€ resolvers
β”‚   β”‚   β”‚   β”œβ”€β”€ comment
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ index.ts
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ mutations.ts
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ queries.ts
β”‚   β”‚   β”‚   β”‚   └── typeResolvers.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ hashtags
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ index.ts
β”‚   β”‚   β”‚   β”‚   └── queries.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ notifications
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ index.ts
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ mutations.ts
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ queries.ts
β”‚   β”‚   β”‚   β”‚   └── typeResolvers.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ post
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ index.ts
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ mutations.ts
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ queries.ts
β”‚   β”‚   β”‚   β”‚   └── typeResolvers.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ repost
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ index.ts
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ mutations.ts
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ queries.ts
β”‚   β”‚   β”‚   β”‚   └── typeResolvers.ts
β”‚   β”‚   β”‚   └── user
β”‚   β”‚   β”‚       β”œβ”€β”€ index.ts
β”‚   β”‚   β”‚       β”œβ”€β”€ mutations.ts
β”‚   β”‚   β”‚       β”œβ”€β”€ queries.ts
β”‚   β”‚   β”‚       └── typeResolvers.ts
β”‚   β”‚   β”œβ”€β”€ schema
β”‚   β”‚   β”‚   └── schema.graphql
β”‚   β”‚   β”œβ”€β”€ schema.ts
β”‚   β”‚   β”œβ”€β”€ uploadFile.ts
β”‚   β”‚   └── utils.ts
β”‚   └── tsconfig.json
└── frontend
    β”œβ”€β”€ README.md
    β”œβ”€β”€ components.json
    β”œβ”€β”€ cypress
    β”‚   β”œβ”€β”€ e2e
    β”‚   β”‚   β”œβ”€β”€ home.cy.ts
    β”‚   β”‚   └── user.cy.ts
    β”‚   └── support
    β”‚       β”œβ”€β”€ commands.d.ts
    β”‚       β”œβ”€β”€ commands.ts
    β”‚       └── e2e.ts
    β”œβ”€β”€ cypress.config.js
    β”œβ”€β”€ eslint.config.js
    β”œβ”€β”€ index.html
    β”œβ”€β”€ package-lock.json
    β”œβ”€β”€ package.json
    β”œβ”€β”€ postcss.config.js
    β”œβ”€β”€ public
    β”‚   β”œβ”€β”€ coverphoto.jpg
    β”‚   β”œβ”€β”€ cute_cat_404.gif
    β”‚   └── y.jpg
    β”œβ”€β”€ src
    β”‚   β”œβ”€β”€ components
    β”‚   β”‚   β”œβ”€β”€ Hashtags
    β”‚   β”‚   β”‚   β”œβ”€β”€ HashtagBlock.tsx
    β”‚   β”‚   β”‚   └── HashtagCard.tsx
    β”‚   β”‚   β”œβ”€β”€ Landing
    β”‚   β”‚   β”‚   β”œβ”€β”€ FollowSuggestionsSidebar.tsx
    β”‚   β”‚   β”‚   └── TrendingSidebar.tsx
    β”‚   β”‚   β”œβ”€β”€ Navbar
    β”‚   β”‚   β”‚   β”œβ”€β”€ DropdownMenu.tsx
    β”‚   β”‚   β”‚   β”œβ”€β”€ Navbar.tsx
    β”‚   β”‚   β”‚   β”œβ”€β”€ Notifications
    β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ NotificationCard.tsx
    β”‚   β”‚   β”‚   β”‚   └── Notifications.tsx
    β”‚   β”‚   β”‚   β”œβ”€β”€ SearchBar.tsx
    β”‚   β”‚   β”‚   └── ThemeToggle.tsx
    β”‚   β”‚   β”œβ”€β”€ Post
    β”‚   β”‚   β”‚   β”œβ”€β”€ Comment.tsx
    β”‚   β”‚   β”‚   β”œβ”€β”€ DeletedPost.tsx
    β”‚   β”‚   β”‚   β”œβ”€β”€ Post.tsx
    β”‚   β”‚   β”‚   β”œβ”€β”€ PostBody.tsx
    β”‚   β”‚   β”‚   β”œβ”€β”€ PostContent.tsx
    β”‚   β”‚   β”‚   β”œβ”€β”€ PostWithReply.tsx
    β”‚   β”‚   β”‚   └── Repost.tsx
    β”‚   β”‚   β”œβ”€β”€ Profile
    β”‚   β”‚   β”‚   β”œβ”€β”€ CommentsView.tsx
    β”‚   β”‚   β”‚   β”œβ”€β”€ EditProfile.tsx
    β”‚   β”‚   β”‚   β”œβ”€β”€ FollowingUsersModal.tsx
    β”‚   β”‚   β”‚   β”œβ”€β”€ LikesView.tsx
    β”‚   β”‚   β”‚   β”œβ”€β”€ MentionsView.tsx
    β”‚   β”‚   β”‚   └── PostsView.tsx
    β”‚   β”‚   β”œβ”€β”€ Skeletons
    β”‚   β”‚   β”‚   β”œβ”€β”€ CardSkeleton.tsx
    β”‚   β”‚   β”‚   β”œβ”€β”€ HashtagBlockSkeleton.tsx
    β”‚   β”‚   β”‚   β”œβ”€β”€ LargeCardSkeleton.tsx
    β”‚   β”‚   β”‚   β”œβ”€β”€ PostSkeleton.tsx
    β”‚   β”‚   β”‚   β”œβ”€β”€ PostWithReplySkeleton.tsx
    β”‚   β”‚   β”‚   β”œβ”€β”€ ProfileBlockSkeleton.tsx
    β”‚   β”‚   β”‚   └── ProfileSkeleton.tsx
    β”‚   β”‚   β”œβ”€β”€ Users
    β”‚   β”‚   β”‚   β”œβ”€β”€ Avatar.tsx
    β”‚   β”‚   β”‚   β”œβ”€β”€ FollowButton.tsx
    β”‚   β”‚   β”‚   β”œβ”€β”€ ProfileBlock.tsx
    β”‚   β”‚   β”‚   β”œβ”€β”€ ProfileCard.tsx
    β”‚   β”‚   β”‚   β”œβ”€β”€ ProfilePreview.tsx
    β”‚   β”‚   β”‚   β”œβ”€β”€ Username.tsx
    β”‚   β”‚   β”‚   └── VerificationBadge.tsx
    β”‚   β”‚   └── ui
    β”‚   β”‚       β”œβ”€β”€ BackButton.tsx
    β”‚   β”‚       β”œβ”€β”€ Divider.tsx
    β”‚   β”‚       β”œβ”€β”€ Footer.tsx
    β”‚   β”‚       β”œβ”€β”€ ToggleGroup.tsx
    β”‚   β”‚       β”œβ”€β”€ button.tsx
    β”‚   β”‚       β”œβ”€β”€ popover.tsx
    β”‚   β”‚       β”œβ”€β”€ toggle.tsx
    β”‚   β”‚       └── tooltip.tsx
    β”‚   β”œβ”€β”€ form
    β”‚   β”‚   β”œβ”€β”€ CreatePostField.tsx
    β”‚   β”‚   β”œβ”€β”€ FormField.tsx
    β”‚   β”‚   β”œβ”€β”€ LoginForm.tsx
    β”‚   β”‚   └── TextInput.tsx
    β”‚   β”œβ”€β”€ globals.css
    β”‚   β”œβ”€β”€ hooks
    β”‚   β”‚   β”œβ”€β”€ AuthContext.tsx
    β”‚   β”‚   └── useDebounce.tsx
    β”‚   β”œβ”€β”€ lib
    β”‚   β”‚   β”œβ”€β”€ apolloClient.ts
    β”‚   β”‚   β”œβ”€β”€ checkFile.ts
    β”‚   β”‚   β”œβ”€β”€ dateUtils.ts
    β”‚   β”‚   β”œβ”€β”€ types.ts
    β”‚   β”‚   └── utils.ts
    β”‚   β”œβ”€β”€ main.tsx
    β”‚   β”œβ”€β”€ pages
    β”‚   β”‚   β”œβ”€β”€ CommentPage.tsx
    β”‚   β”‚   β”œβ”€β”€ HashtagPage.tsx
    β”‚   β”‚   β”œβ”€β”€ HashtagsPage.tsx
    β”‚   β”‚   β”œβ”€β”€ HomePage.tsx
    β”‚   β”‚   β”œβ”€β”€ NotFound.tsx
    β”‚   β”‚   β”œβ”€β”€ PostPage.tsx
    β”‚   β”‚   β”œβ”€β”€ Profile.tsx
    β”‚   β”‚   β”œβ”€β”€ Search.tsx
    β”‚   β”‚   └── UsersPage.tsx
    β”‚   β”œβ”€β”€ queries
    β”‚   β”‚   β”œβ”€β”€ comments.ts
    β”‚   β”‚   β”œβ”€β”€ hashtags.ts
    β”‚   β”‚   β”œβ”€β”€ notifications.ts
    β”‚   β”‚   β”œβ”€β”€ posts.ts
    β”‚   β”‚   β”œβ”€β”€ reposts.ts
    β”‚   β”‚   β”œβ”€β”€ search.ts
    β”‚   β”‚   └── user.ts
    β”‚   β”œβ”€β”€ test
    β”‚   β”‚   β”œβ”€β”€ components
    β”‚   β”‚   β”‚   β”œβ”€β”€ Footer.test.tsx
    β”‚   β”‚   β”‚   β”œβ”€β”€ LoginForm.test.tsx
    β”‚   β”‚   β”‚   β”œβ”€β”€ Navbar
    β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ DropdownMenu.test.tsx
    β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ Navbar.test.tsx
    β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ ThemeToggle.test.tsx
    β”‚   β”‚   β”‚   β”œβ”€β”€ Post
    β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ PostBody.test.tsx
    β”‚   β”‚   β”‚   β”‚   └── PostContent.test.tsx
    β”‚   β”‚   └── setup.ts
    β”‚   β”œβ”€β”€ types
    β”‚   β”‚   └── apollo-upload-client.d.ts
    β”‚   └── vite-env.d.ts
    β”œβ”€β”€ tailwind.config.js
    β”œβ”€β”€ tsconfig.app.json
    β”œβ”€β”€ tsconfig.json
    β”œβ”€β”€ tsconfig.node.json
    └── vite.config.ts

Produktkrav

Funksjonalitet

LΓΈsningen skal vΓ¦re en prototyp pΓ₯ en sΓΈkbar katalog med frontend hvor brukeren skal kunne formulere et sΓΈk og fΓ₯ presentert et sΓΈkeresultat, som bruker i etterkant kan ha interaksjon med. Funksjonalitet som skal stΓΈttes:

  • SΓΈkemulighet eks. med en dialog/form/sΓΈkefelt for input av sΓΈk

    • Brukerne kan i sΓΈkefeltet sΓΈke etter brukere, innlegg, kommentarer, brukere eller hashtags. Brukeren kan enten velgen en auto suggested bruker eller hashtag, eller gΓ₯ til sΓΈk siden og fΓ₯ opp alle resultatene for sΓΈket sitt.
  • Listebasert presentasjon av sΓΈkeresultat hvor det er lagt opp til hΓ₯ndtering av store resultatsett med enten blaing i sider, eller dynamisk laster av flere resultater ved scrolling

    • SΓΈke siden viser initielt kun de 10 fΓΈrste resultatene av hver type. NΓ₯r brukeren blar nedover vil det automatisk hente inn en til side med 10 nye sΓΈkeresultater.
  • Muligheten for Γ₯ se mer detaljer om hvert av objekten

    • Brukere kan trykke pΓ₯ innlegg, kommentarer eller brukere og vil bli omdirigert til en side med mer informasjon.
  • Mulighet for sortering og filtrering av resultatsettet (merk at sortering og filtrering skal utfΓΈres pΓ₯ hele resultatsettet og ikke bare det som tilfeldigvis er laster inn pΓ₯ klienten)

    • Brukere kan sortere innlegg basert pΓ₯ kriteriene: nyligste, mest likte, kontroversielt (antall kommentarer) og hva folk brukeren fΓΈlger har lagt ut. I tilegg kan man filtrere mellom innlegg, brukere og hashtags i sΓΈke siden.
  • Det skal inngΓ₯ en eller annen form for brukergenererte data som skal lagres (persistent pΓ₯ databaseserveren) og presenteres (enten bruker som legger til informasjon, reviews, ratings etc, historikk om sΓΈkene eller annet, handleliste).

    • Brukere kan lage brukere, opprette innlegg, kommentere innlegg, like innlegg, 'reposte' innlegg, laste opp profil/bakgrunnsbilde og oppdatere informasjon om seg selv som blir delt med andre brukere.
  • LΓΈsningen skal demonstrere aspekter ved universell utforming / web accessibility (tilgjengelighet).

    • Vi har brukt semantiske HTML-elementer som <section>, <header> og <main> for Γ₯ strukturere innholdet og gjΓΈre det lettere tilgjengelig for skjermlesere. ARIA-attributter som aria-label og aria-hidden er lagt til der det er nΓΈdvendig for Γ₯ gi skjermlesere riktig kontekst og navigasjonsinformasjon. Vi har sikret god kontrast mellom tekst og bakgrunn samt implementert full stΓΈtte for tastaturnavigasjon for Γ₯ mΓΈte kravene til universell utforming. Alle sider pΓ₯ nettsiden har en (nΓ¦r) perfekt score pΓ₯ tilgjengelighet pΓ₯ Lighthouse-testen.
  • LΓΈsningen skal demonstrere aspekter ved bΓ¦rekraftig webutvikling (gjennom valg som gjΓΈres i design)

    • Vi har implementert paginering av resultater for Γ₯ redusere mengden data som sendes fra serveren til klienten, noe som bΓ₯de reduserer belastningen pΓ₯ serveren og minimerer energibruk ved datatransport. Profilbilder blir automatisk beskΓ₯ret til 300x300 piksler ved opplasting, noe som reduserer filstΓΈrrelsen og optimaliserer ytelsen ved visning, samtidig som vi unngΓ₯r unΓΈdvendige databasekall for hver forespΓΈrsel. Disse tiltakene bidrar til en mer bΓ¦rekraftig webutvikling ved Γ₯ minimere ressursforbruk og forbedre brukeropplevelsen.
  • God design, fornuftige valg og lΓΈsninger som harmonerer med typen data dere velger

    • Vi har gjennom hele utviklings prosessen tatt hensyn til at applikasjon skal vΓ¦re estetisk og visuelt appelerende. Fargevalget vi har valgt har vΓ¦rt konsistent og brukere kan velge mellom lys og mΓΈrk modus.
  • Database og backend for prosjektet skal ved innlevering hostes pΓ₯ gruppas virtuelle maskin.

    • Vi har hostet backenden ved Γ₯ bruke PM2 for prosesshΓ₯ndtering pΓ₯ Apache2-serveren, noe som sikrer stabilitet og automatisk oppstart ved eventuelle feil. En YAML-fil er satt opp for Γ₯ bygge og deployere prosjektet automatisk til Apache2-serveren, noe som forenkler arbeidsflyten.

Bruk av teknologi

  • Brukergrensesnitt skal vΓ¦re basert pΓ₯ React og programmert i Typeskript. Prosjektet skal settes opp med Vite
  • Bruk av state managment eksempelvis redux, mobx, recoil, apollo local state management etc
    • Vi har valgt Γ₯ bruke apollo local state management.
  • Egendefinert/utviklet GraphQL backend (Node / Typescript), fritt valg av type databaseserver pΓ₯ backend, men prosjektet skal benytte en backend-database som er satt opp av gruppa
    • Backenden vΓ₯r er GraphQL med Typescript, og databasen er MongoDB som er hostet i vΓ₯r apache2 server.
  • Bruk av gode og relevante komponenter og bibliotek (fritt valg og vi oppfordrer til mest mulig gjenbruk av tredjeparts lΓΈsninger)
    • Vi har valgt Γ₯ bruke en kombinasjon av tredjeparts og egenutviklet lΓΈsninger for komponenter. Alle tredjeparts komponenter er hentet fra shadcn/ui, noe som gjΓΈr de veldig modifiserbare. Disse kan du finne i frontend/src/components/.

Testing, utvikling og kvalitetskontroll

  • Linting og bruk av Prettier
    • Ved hver pull request har vi sΓΈrget for at bΓ₯de Prettier og EsLint har blitt kjΓΈrt.
  • GjennomfΓΈrt testing av komponenter (vi bruker Vitest)
  • En form for automatisert end-2-end testing (i praksis teste en lengre sekvens av interaksjoner), testing av API'et.
    • End-2-end testene vΓ₯re kan du finne i frontend/cypress. Disse testene tester bΓ₯de generell routing av applikasjonen vΓ₯r. Samt API-et, der testene f.eks. lager innlegg, kommenterer og liker innlegg. Dette sΓΈrger for at vi vet at kjernefunksjonaliteten i applikasjonen vΓ₯r fungerer som det skal.
  • Prosjektet dokumenteres med en README.md i git repositoriet. Dokumentasjonen skal diskutere, forklare og vise til alle de viktigste valgene og lΓΈsningene som gruppa gjΓΈr (inklusive valg av komponenter og api).
  • Koden skal vΓ¦re lettlest og godt strukturert og kommentert slik at den er lett Γ₯ sette seg inn i. Bruk av kommentarer skal vΓ¦re tilpasset at eksterne skal inspisere koden.
  • Gruppa skal oppsummere den enkeltes bidrag i prosjektet underveis i en egen fil som leveres i BB (dette er personopplysninger som ingen vil at skal ligge pΓ₯ git ;-)
  • Reproduserbarhet: i praksis betyr det at prosjektet skal vΓ¦re dokumentert og enkelt Γ₯ installere/kjΓΈre for andre (eksempelvis faglΓ¦rer).

Oppsummering av funksjonalitet

  • Posting og Kommentering
    • Liking av innlegg og kommentarer
    • 'Reposting' av innlegg og kommentarer
    • Redigering av innlegg og kommentarer
    • Share knapp for Γ₯ kopiere link til innlegg eller kommentar
    • BildestΓΈtte
    • Tagging av brukere og hashtags
    • Link detektering
    • Slette funksjonalitet
    • Kommentering
    • Dynamisk tegn begrensning visualisering
    • 'Read more' knapp for lengre innlegg og kommentarer
  • SΓΈk med bruker/hashtag forslag med lagring av 3 siste sΓΈk
  • MΓΈrk modus
  • Hashtags
  • Alle GET kall er paginert (med unntak av de som bare henter en enkelt ting)
  • Helt hjemmesnekret autentiseringssystem med salting og hashing av passord
  • Fire forskjellige filter/sorterings valg pΓ₯ hjemmeside
  • FΓΈlge funksjonalitet
  • Varslinger. FΓΈlgende fyrer av en varsel (alle disse blir fjerne om det som forΓ₯rsaket varselet blir slettet):
    • Γ… fΓΈlge noen
    • Γ… like noens innlegg eller kommentar
    • Γ… reposte noens innlegg eller kommentar
    • Γ… kommentere pΓ₯ noens innlegg eller kommentar
    • Γ… tagge noen i et innlegg eller kommentar
    • NΓ₯r noen du fΓΈlger legger ut et nytt innlegg
  • Profiler:
    • Profilbilde
    • Coverbilde
    • Bio
    • Brukernavn
    • For- og etternavn
    • FΓΈlgere og fΓΈlger
    • Alle innlegg, alle kommentarer, alle mentions og alle likes
    • Profil preview pΓ₯ hover av brukere
  • Profilbilder er kroppet til 300x300px ved opplasting
  • Admin bruker
    • Kan slette alle innlegg og kommentarer
    • Kan slette enkeltbrukere, som ogsΓ₯ sletter alle deres innlegg og kommentarer
  • VerifiseringsnivΓ₯er (som vises ved siden av brukerens navn)
    • UNVERIFIED: Alle brukere starter som dette
    • VERIFIED: Visse brukere fΓ₯r dette (for det meste venner til oss utviklere)
    • MADS: Γ‰n spesifikk bruker fikk denne.
    • DEVELOPER: Oss utviklere
    • Verifisering er gjort manuelt av oss utviklere, sΓ₯ det er ingen automatisk mΓ₯te Γ₯ fΓ₯ dette pΓ₯, og dermed ingen frontend funksjonalitet for Γ₯ verifisere eller spΓΈrre om verifisering.
  • StΓΈtte for vinduer sΓ₯ smΓ₯ som 300px i bredden
  • Dynamisk tittel pΓ₯ nettsiden basert pΓ₯ hvilken side du er pΓ₯ og hva innholdet er
  • Skeleton loading pΓ₯ alle sider
  • Helt hjemmesnekret 404 not found side

About

The new age of social media!

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages