Design Diagrams - bounswe/bounswe2024group9 GitHub Wiki

This page will hold our design diagrams and ideas. Enjoy!

The link to our work in progress is here.

1. Class Diagrams

by Kristina, Mutti, Berkay, Yigit Kaan, Ozgur, Eray, Ceylin, Taha, Emin

classDiagram
    class User {
        -user_id: int
        -username: string
        -password: string
        -profilePicture: Image
        -Routes: Route[]
        -Followers: User[]
        -Following: User[]
        +login(username: String, password: String): boolean 
        +signup(username: String, email: String, password:            String): boolean
        +logout()
        +deleteProfile()
        +forgotPassword()
        +getUserId() : int
        +getUsername() : string
        +getPassword() : string
        +getName() : string
        +getRoutes() : Route[]
        +setUsername(username: String)
        +setPassword(password: String)
        +setName(name: String)
        +search(query:string)
        +view_results():WikiResult[], Route[]
    }
    
    class HomePage {
        +search(query: string)
    }
    class FeedPage {
        +displayFeed(routes: Route[])
        +search(query: string)
    }
    class UserPage{
        -Profile: ProfileController
        -visibility: Boolean
        +displayProfile(user: User)
        +displayProfilePic(user: User)
        +displayFollowing(user: User)
        +displayFollowers(user: User)
        +updateProfilePicture(img: Image)
        +followUser(userToFollow: User)
        +unfollowUser(userToUnfollow: User)
        +changeVisibility(user: User)
        
    }
    class ResultPage {
        +displayResults(result: WikiResult[])
        +displayDetails(result:WikiResult)
        +displayRelatedRoutes(result:Route[])
    }
    class RouteCreationPage{
        +displayOnSidebar(result: WikiResult[])
        +displayOnMap(result: WikiResult[])
    }
    
    class RouteDetailsPage{
        -Route: RouteDetailsController
        +displayProfilePic(user: User)
        +displayWikiData(result: WikiResult[])
        +displayTitle(route: Route)
        +displayDescription(route: Route)
        +displayPhotos(route: Route)
        +displayRating(route: Route)
        +displayLikes(route: Route)
        +displayComments(route: Route)
        +displayMapView(route: Route)
    }
    
    class WikiResult {
        -itemID: string
        -name: string
        -description: string
        -photo: string
        -inceptionYear: int
        -longitude: float
        -latitude: float
        -top_5_nearby: WikiResult[]
        -top_5_period: WikiResult[]
    }
    class PrivateDatabase {
        -userData:UserData
        -route:Route
        +fetchRelatedRoutes(): Route
        +fetchFollowers(): User[]
        +fetchFollowing(): User[]
        +fetchProfileData(user:User): String[][]
        +updateTable(table: String, value: String)
    }
    class WikidataAPI {
        +search(query: string): WikiResult[]
        +getDetails(WikiResult): WikiResult
    }
    class PageController{
        -wikidataAPI: WikidataAPI
        -privateDatabase: PrivateDatabase
        +search(query: string): WikiResult[]

        +addPOI(result: WikiResult)
        +addDescription(description: string)

        +saveRoute(route: Route)
        +rateRoute(route: Route)
        +likeRoute(route: Route)
        +commentRoute(route: Route)
        +shareRoute(route: Route)
        +updateRoute(route: Route)
        
         +fetchFeed(user: User): Route[]
    }


    class POI{
        -name: string
        -poi_id: int
        -photo: string
    }
     class Route {
        -route_id: int
        -title: string
        -description: string
        -photos: string[]
        -rating: number
        -likes: number
        -comments: string[]
        -saves: number
        -pois: POI[]
        -duration: int[]
        -duration_between: int[]
        -mapView: string
        +getTitle(): string
        +getDescription(): string
        +getPhotos(): string[]
        +getRating(): number
        +getLikes(): number
        +getComments(): string[]
        +getSaves(): number
        +getPOIs(): POI[]
        +getMapView(): string
    }
    class LoginPage {
        +displayLoginPage()
    }
    class SignupPage {
        +displaySignupPage()
    }
    
    class AuthenticationController {
        -privateDatabase: PrivateDatabase
        -rememberMe: boolean
        +login(username: String, password: String): boolean 
        +signup(username: String, email: String, password: String): boolean 
        +forgotPassword(email: String): boolean 
        +setRememberMe(enabled: boolean): void
        +isRememberMeEnabled(): rememberMe
    }

    class GmailAuthenticationController {
        -privateDatabase: PrivateDatabase
        -gmailToken: String
        -isGmailTokenValid(gmailToken: String): boolean
        +signInWithGmail(gmailToken: String): boolean 
    }
    
    class LoginController {
        -authenticationController: AuthenticationController
        -gmailAuthenticationController: GmailAuthenticationController
    }
    
    class SignupController {
        -authenticationController: AuthenticationController
        -isCredentialsValid(username: String, password: String): boolean
        -gmailAuthenticationController: GmailAuthenticationController
    }
    


    
    
    User --> PageController
    
    PageController --> LoginPage : displays_login_page
    PageController --> SignupPage : displays_signup_page
    PageController --> HomePage : searches
    PageController --> ResultPage: views results
    PageController --> UserPage : views_profile
    PageController --> FeedPage : views_feed
    PageController --> RouteCreationPage : creates_route
    PageController --> RouteDetailsPage : views_route
    
    UserPage -- UserPage : take_action

    LoginPage -- LoginController : contains login controller
    SignupPage -- SignupController : contains signup controller
    LoginController -- AuthenticationController : authenticates
    SignupController -- AuthenticationController : authenticates
    LoginController -- GmailAuthenticationController : authenticates Gmail
    SignupController -- GmailAuthenticationController : authenticates Gmail

    PageController --> WikidataAPI : fetch_wiki_results
    PageController --> PrivateDatabase : fetch_data
 
    PrivateDatabase --> User : contains_details    
    AuthenticationController --> PrivateDatabase: get_data
    GmailAuthenticationController --> PrivateDatabase: get_data
    
    

    WikidataAPI --> WikiResult : contains details
    PrivateDatabase --> Route : contains details
    
    Route --> POI : includes

2. Use Case Diagrams

2.1 Search Result and Feed Diagrams

by Kristina, Mutti

  flowchart 
  User --> InitiateSearch;
    InitiateSearch --> RetrieveSearchResults;
    RetrieveSearchResults -. "include" .-> DisplaySearchResults;
    DisplaySearchResults --> ViewDetails;

    ViewDetails-. "extend" .->  Save;
    ViewDetails-. "extend" .->  Like;
    ViewDetails-. "extend" .->  Comment;
    ViewDetails-. "extend" .->  Reroute;

    ViewDetails -. "extend" .-> ViewRelatedResults;
    ViewRelatedResults --> RetrieveSearchResults;
    
    User --> ViewFeed
    ViewFeed -. "include" .-> DisplayFeedResults
    
    DisplayFeedResults -. "extend" .-> Like
    DisplayFeedResults -. "extend" .-> Comment
    DisplayFeedResults -. "extend" .-> Save
    DisplayFeedResults -. "extend" .-> Reroute

2.2 Profile Diagrams

by Yigit Kaan, Ozgur

2.2.1 Home User Profile

    flowchart
    User --> DeleteAccount;
    User --> EditProfileInfo;
    User --> SeeFollowers;
    User --> SeeFollowing;
    User --> SeeProfilePic;
    
    ChangePassword -."extend".-> EditProfileInfo;
    ChangeUsername -."extend".-> EditProfileInfo;
    ChangeName -."extend".-> EditProfileInfo;
    ChangeProfilePic -."extend".-> EditProfileInfo;
    ChangeVisibility -."extend".-> EditProfileInfo;
    
    RemovePic -."extend".-> ChangeProfilePic;

2.2.1 Other Users' Profile

    flowchart
    User --> Follow;
    User --> Unfollow;
    User --> RemoveFollower;
    User --> DisplayProfilePic;
    User --> DisplayFollowers;
    User --> DisplayFollowing;

2.3 Route Creation

by Burak

  flowchart 
  User --> CreateRoute;
    CreateRoute --> InitiateSearch;
    InitiateSearch--> RetrieveSearchResults;
    RetrieveSearchResults -. "include" .-> DisplaySearchResults;
    DisplaySearchResults-. "extend" .->  ViewDetails;
    DisplaySearchResults-. "extend" .->  AddToRoute;
    

    CreateRoute-. "extend" .->  SaveAsDraft;
    CreateRoute-. "extend" .->  Save;
   

2.4 Signup and Login

    flowchart
    User --> SignUp;
    User --> Login;
    SignUp-. "extend" .-> signUpWithGoogle;
    Login --> EnterLoginCredentials;
    SignUp --> EnterSignUpCredentials;
    EnterSignUpCredentials --> SignUpValidate;
    SignUpValidate --> EditProfileInfo;
    EnterLoginCredentials --> LoginValidate;
    LoginValidate --> Feed;
    

2.5 Route Details

by Emin

  flowchart 
    User -. "includes" .-> DisplayWikiData
    User -. "includes" .-> DisplayComments
    User -. "includes" .-> DisplayLikes
    User -. "includes" .-> DisplayRoute
    User -. "extends" .-> ViewProfilePage
    
    DisplayRoute -. "extends" .-> Reroute
    DisplayRoute -. "extends" .-> OpenMaps
    DisplayRoute -. "extends" .-> Like
    DisplayRoute -. "extends" .-> Comment
    DisplayRoute -. "extends" .-> Save
    DisplayRoute -. "extends" .-> Share

3. Sequence Diagrams

3.1 Search Result Diagram

By Kristina

sequenceDiagram
    participant User
    participant PageController
    participant Database
    participant WikidataAPI
    participant ResultController
    participant ResultPage

    User->>PageController: search(query)
    PageController->>PageController: search(query)


    par SearchDatabase
        PageController->>Database: search(query)
        Database->>Database: search(query)
        Database-->>Database: RouteResults
            Database->>ResultController: fetchRelatedRoutes(RouteResults)

        
    end

    par SearchWikidata
        PageController->>WikidataAPI: search(query)
        WikidataAPI->>WikidataAPI: search(query)
        WikidataAPI-->>WikidataAPI: WikiResults
        WikidataAPI->>PageController: fetchResults(WikiResults)
    end


    PageController->>ResultPage: displayResults(WikiResults), displayRelatedRoutes(RouteResults)
    
    ResultPage-->>User: status

    User->>ResultPage: view_all_results
    ResultPage-->>User: displayed results


3.2 Feed Diagram

by Mutti, Eray

    sequenceDiagram
        participant User
        participant PageController
        participant Database
        participant FeedPage

        User->>PageController: viewFeed()
        PageController->>Database: getFollowing(User)
        Database-->>PageController: FollowingUsers
        PageController->>Database: fetchFeed(FollowingUsers)
        Database-->>PageController: FeedRoutes
        PageController->>FeedPage: displayFeed(FeedRoutes)
        FeedPage-->>User: displayFeedResults


3.3 ^Follow(er|ing) Display Diagram

by Ozgur, Yigit Kagan

    sequenceDiagram
        participant User
        participant UserPage
        participant UserFollows
        participant PrivateDatabase
        participant UserData
        
        User ->> UserPage: viewProfile(User)
        
        
        alt
        UserPage ->> UserFollows: displayFollowers(User)
        UserFollows ->> PrivateDatabase: getFollowers(User)
        PrivateDatabase ->> UserData: fetchFollowers(User)
        UserData-->> UserPage:Followers
        end
        
        alt
        UserPage ->> UserFollows: displayFollowing(User)
        UserFollows ->> PrivateDatabase: getFollowing(User)
        PrivateDatabase ->> UserData: fetchFollowing(User)
        UserData-->> UserPage:Following
        
        end
        UserPage-->> User: status
        
   
        

        
       

Following Display Diagram is quite similar.

3.3.1 Display Profile

by Ozgur, Yigit Kagan

    sequenceDiagram
        participant User
        participant UserPage
        participant PageController
        participant PrivateDatabase
        
        User ->> UserPage: viewProfile()
        alt DisplayProfile
                UserPage ->> UserPage : displayProfile()
        UserPage ->> PrivateDatabase: fetchProfileData(User)
        PrivateDatabase -->> UserPage: ProfileData
        UserPage -->> User: status
        end
        
        alt EditProfile
        UserPage ->> PrivateDatabase: updateTable(Table, Value) 
        PrivateDatabase -->> UserPage: status
        end
        
        alt EditPfp
        UserPage ->> PageController: updateProfilePicture()
        PageController ->> PrivateDatabase: updateTable(ProfilePicture, image)
        PrivateDatabase -->> PageController: status
        PageController -->> UserPage: status
        end
 
    

3.3.2 Follow/Unfollow

by Ozgur, Yigit Kagan

    sequenceDiagram
    participant User
    participant UserPage
    participant PageController
    participant PrivateDatabase
    
    User ->> UserPage: viewProfile()
    UserPage ->> PageController: take_action(User)
    alt Follow
        
        PageController->>PrivateDatabase: follow(User)
    end
    alt Unfollow
    
    PageController->>PrivateDatabase: unfollow(User)
    end
    PrivateDatabase-->>PageController: status
    PageController-->>UserPage: status

3.4 Route Creation Diagram

by Burak

sequenceDiagram
    participant User
    participant RouteCreationPage
    participant PageController
    participant Database 
    participant SearchResults


    User->>RouteCreationPage: CreateRoute()
    RouteCreationPage->>PageController: search(query)
    PageController->>Database:FetchDestination(query)
    SearchResults->>User:ViewResults
    Database->>Database:search(query)
    Database->>PageController:Destinations
    PageController->>SearchResults:Destinations
    SearchResults-->>User:DisplayResults
    User-->>RouteCreationPage:Save(query)
    RouteCreationPage-->>Database:Insert(query)

3.5 SignUp and Login

by Taha & Ceylin

sequenceDiagram
    participant User
    participant UserInterface
    participant Database
    
    alt SignUp
        User->>UserInterface:EnterSignUpCredentials()
        UserInterface-->Database:SignUpValidate()
    end
    
    alt Login
        User-->UserInterface:EnterLoginCredentials()
        UserInterface-->Database:LoginValidate()
    end
    
    alt Logout
        User-->UserInterface:Logout()
        UserInterface-->Database:setUserNull()
    end

3.6 Route Details

by Emin

    sequenceDiagram
    participant User
    participant RoutePage
    participant PageController
    participant PrivateDatabase
    
    User ->> RoutePage: viewRoute(RouteId)  
    RoutePage ->> PageController: take_action(RouteId)

    alt Comment
    PageController->>PrivateDatabase: comment(RouteId)
    end
    alt Like
    PageController->>PrivateDatabase: like(RouteId)
    end
    alt Save
    PageController->>PrivateDatabase: save(RouteId)
    end
    alt Share
    PageController->>PrivateDatabase: share(RouteId)
    PrivateDatabase-->>PageController: shareLink
    end
    PrivateDatabase-->>PageController: status
    PageController-->>RoutePage: status

    RoutePage ->> PageController: take_action(RouteId, object)
    alt Reroute
    PageController->>PrivateDatabase: update(RouteId, object)
    end  
    PrivateDatabase-->>PageController: status
    PageController-->>RoutePage: status