Doggos matchen - Steinberg99/DogeMeet GitHub Wiki

Like/dislike & matching feature door Mark

Een belangrijke feature voor een matching applicatie is natuurlijk het liken en disliken van dingen. Voor dit team project zijn we verder gaan bouwen op de applicatie van Stein. Stein had in zijn applicatie al het liken en disliken uitgewerkt. Omdat ik (Mark) voor mijn individuele feature ook het liken en disliken had uitgewerkt, had ik besloten om Stein zijn feature uit te breiden met matchen. Dit houd in dat wanneer ik iemand like, en diegene mij ook heeft geliked, dat de hond dan in mijn lijst met matches komt te staan, zodat ik hier later mee kan chatten.

Hoe werkt het?

Het matchen van dingen is opzich geen ingewikkelde feature. Alleen omdat onze applicatie werkt met honden die gekoppeld zijn aan gebruikers, maakt het dit wel wat complexer. Je moet namelijk checken wie de eigenaar van die hond is. Vervolgens moet je kijken of deze gebruiker ook mijn hond heeft geliked. Wanneer dit zo is, moet je zijn hond aan mijn matches toevoegen en mijn hond aan zijn matches toevoegen. In werkelijkheid zou het natuurlijk ook mogelijk kunnen zijn dat mensen meerdere honden hebben, alleen wij hebben besloten om binnen deze tijd die voor het project staat dit niet uit te werken.

Stap 1

Voordat de matching feature kon worden uitgewerkt, moest de bestaande like feature worden aangepast. Hiervoor is de branch like-feature-enhancement aangemaakt. Binnen deze branch hebben Stein en ik ervoor gezorgd dat de feature werkt met meerdere gebruikers. De honden die je liked worden dus toegevoegd bij de gebruiker die op dat moment is ingelogd.

Stap 2

Omdat we toch bezig waren hebben we gelijk de hard gecodeerde id's binnen de database vervangen door ObjectId's die MongoDB zelf aanmaakt. Later heeft Stein dit nog doorgevoerd binnen de hele applicatie.

Stap 3

Nadat er een goede basis was heb ik de match pagina gewijzigd. Dit was eerst een pagina die alle honden toonde die 1 gebruiker had geliked. Dit moest gewijzigd worden, zodat het de matches toont van een ingelogde gebruiker. Deze matches worden getoond door de array matched_doggos op te halen van de juiste gebruiker.

Stap 4

Vervolgens kon het matchen zelf worden uitgewerkt. dit is op de branch matching-feature gedaan. Ik heb de volgende code geschreven binnen de like functie:

const myPotentialMatches = user.potential_matches.toString();

Hier wordt eerst de potentiele matches van de ingelogde gebruiker opgehaald. Dit is een array van gebruikers die mijn hond hebben geliked.

if (myPotentialMatches.includes(owner._id)) {

Vervolgens wordt hier gekeken of er in die array de gebruiker zit waarvan ik de hond nu like. Oftewel de eigenaar van de hond.

await database
  .collection("users")
  .updateOne(
    { _id: ObjectId(user._id) },
    { $push: { matched_doggos: doggo.id } }
  );

await database
  .collection("users")
  .updateOne(
    { _id: ObjectId(owner._id) },
    { $push: { matched_doggos: user.doggo_id } }
  );

Als dit waar is, voeg dan zijn hond toe aan mijn matched_doggos, en voeg mijn hond toe aan zijn matched_doggos.

else {
    await database
    .collection('users')
    .updateOne({ _id: ObjectId(owner._id) }, { $push: { potential_matches: user._id } });
    }

Als dit niet waar is, voeg mij dan in ieder geval toe aan zijn potentiële matches. Zo kan er later nog een match plaats vinden als mijn hond alsnog geliked wordt.