Skip to content

Latest commit

 

History

History
845 lines (806 loc) · 42.7 KB

project.org

File metadata and controls

845 lines (806 loc) · 42.7 KB

Project: Distributed Social Networking

Description

The web is fundamentally interconnected and peer to peer. There’s no really great reason why we should all use facebook.com or google+ or myspace or something like that. If these social networks came up with an API you could probably link between them and use the social network you wanted. Furthermore you might gain some autonomy.

Thus in the spirit of diaspora https://diasporafoundation.org/ we want to build something like diaspora but far far simpler.

This blogging/social network platform will allow the importing of other sources of posts (github, twitter, etc.) as well allow the distributing sharing of posts and content.

An author sitting on one server can aggregate the posts of their friends on other servers.

We are going to go with an inbox model where by you share posts to your friends by sending them your posts. This is similar to activity pub: https://www.w3.org/TR/activitypub/ Activity Pub is great, but too complex for a class project.

We also won’t be adding much in the way of encryption or security to this platform. We’re keeping it simple and restful.

Choose at least 2 other groups to work with

Project Parts

  • Part 0 - sign up a repo
  • Part 1 - 1/2 way implementation
  • Part 2 - Connect with Groups
  • Part 3 - Finish it off!

Collaboration

  • You may consult with others but the submission should be your own team’s source code.
  • You may work with 4 other students (groups of 5)
  • Work will be submitted together
  • Collaboration must be documented in the README.md file
  • Any external source code must be referenced and documented in the README.md file
  • You make collaborate/consult with other groups in order to get your webservices to integrate with each other

User Stories

  • [1/2] As an author I want to make public posts.
  • [1/2] As an author I want to edit public posts.
  • [1/2] As an author, posts I create can link to images.
  • [1/2] As an author, posts I create can be images.
    • HTML posts
  • [1/2] As a server admin, images can be hosted on my server.
  • [2/2] As an author, posts I create can be private to another author
  • [2/2] As an author, posts I create can be private to my friends
  • [2/2] As an author, I can share other author’s public posts
  • [2/2] As an author, I can re-share other author’s friend posts to my friends
  • [1/2] As an author, posts I make can be in simple plain text
  • [1/2] As an author, posts I make can be in CommonMark
  • [?/2] As an author, I want a consistent identity per server
  • [1/2] As a server admin, I want to host multiple authors on my server
  • [2/2] As a server admin, I want to share public images with users on other servers.
  • [?/2] As an author, I want to pull in my github activity to my “stream”
  • [?/2] As an author, I want to post posts to my “stream”
  • [1/2] As an author, I want to delete my own public posts.
  • [1/2] As an author, I want to befriend local authors (same server)
  • [2/2] As an author, I want to befriend remote authors (other group’s server)
  • [2/2] As an author, I want to feel safe about sharing images and posts with my friends – images shared to friends should only be visible to friends. [public images are public]
  • [1/2] As an author, when someone sends me a friends only-post I want to see the likes.
  • [2/2] As an author, comments on friend posts are private only to me the original author.
  • [1/2] As an author, I want un-friend local and remote authors
    • local [1/2]
    • remote [2/2]
  • [1/2] As an author, I want to be able to use my web-browser to manage my profile
  • [1/2] As an author, I want to be able to use my web-browser to manage/author my posts
  • [1/2] As a server admin, I want to be able add, modify, and remove authors.
  • [2/2] As a server admin, I want to OPTIONALLY be able allow users to sign up but require my OK to finally be on my server
    • OPTIONALLY - switch sign up authentication on/off
  • [?/2] As a server admin, I don’t want to do heavy setup to get the posts of my author’s friends.
  • [1/2] As a server admin, I want a restful interface for most operations
  • [1/2] As an author, other authors cannot modify my public post
  • [1/2] As an author, other authors cannot modify my shared to friends post.
  • [1/2] As an author, I want to comment on posts that I can access
  • [1/2] As an author, I want to like posts that I can access
  • [?/2] As an author, my server will know about my friends
  • [1/2] As an author, When I befriend someone it follows them, only when the other authors befriends me do I count as a real friend.
  • [1/2] As an author, I want to know if I have friend requests.
  • [1/2] As an author I should be able to browse the public posts of everyone
  • [2/2] As a server admin, I want to be able to add nodes to share with
    • nodes = servers
  • [2/2] As a server admin, I want to be able to remove nodes and stop sharing with them.
  • [2/2] As a server admin, I can limit nodes connecting to me via authentication.
  • [2/2] As a server admin, node to node connections can be authenticated with HTTP Basic Auth
  • [2/2] As a server admin, I can disable the node to node interfaces for connections that are not authenticated!
  • [2/2] As an author, I want to be able to make posts that are unlisted, that are publicly shareable by URI alone (or for embedding images)

Main Concepts

  • Author
    • makes posts
    • makes friends
    • befriends other authors
    • likes posts
    • comments on posts
    • a generally nice person
  • Server Admin
    • manages a node
    • allows people to sign up
    • responsible for private data :(
  • Follow
    • Friend another author without an accepted friend request
  • Friend
    • Friend another author and they accept the friend request
  • Server
    • a host that hosts authors and vouches for them
  • Restful service
    • The model of the service and its API
  • UI
    • The HTML/CSS/JS coated version user interface
  • Public Post
    • this is a post that will show up publicly.
    • it has a public URL
    • anyone can see it
    • Public posts can be liked
    • public posts can have comments from friends
  • Friend Post
    • this is a post that is shared to friends
    • since it is sent, it is a message and not changeable
    • Friend posts can be liked
    • Friend posts can have comments sent back to the author
  • Inbox
    • This is what a READER or USER of the social network has. They make friends, and friends send objects to their inbox.
    • This forms the backbone of the timeline of the social media user.
    • This receives likes and comments.

Pagination

  • If something is paginated it has query options:
    • page - how many pages of objects have been delivered
    • size - how big is a page
    • Page 4 of objects http://service/potsts/{post_id}/comments?page=4
    • Page 4 of objects but 40 per page http://service/posts/{post_id}/comments?page=4&size=40
    • 1 based indexing. First page is 1.

Objects

  • HTTP Methods not explicitly listed are not allowed methods

Authors

  • URL: ://service/authors/
    • GET: retrieve all profiles on the server paginated
      • page: how many pages
      • size: how big is a page
  • Example query: GET ://service/authors?page=10&size=5
    • Gets the 5 authors, authors 45 to 49.
  • Example: GET ://service/authors/
    {
        "type": "authors",      
        "items":[
            {
                "type":"author",
                "id":"http://127.0.0.1:5454/author/1d698d25ff008f7538453c120f581471",
                "url":"http://127.0.0.1:5454/author/1d698d25ff008f7538453c120f581471",
                "host":"http://127.0.0.1:5454/",
                "displayName":"Greg Johnson",
                "github": "http://github.com/gjohnson",
                "profileImage": "https://i.imgur.com/k7XVwpB.jpeg"
            },
            {
                "type":"author",
                "id":"http://127.0.0.1:5454/author/9de17f29c12e8f97bcbbd34cc908f1baba40658e",
                "host":"http://127.0.0.1:5454/",
                "displayName":"Lara Croft",
                "url":"http://127.0.0.1:5454/author/9de17f29c12e8f97bcbbd34cc908f1baba40658e",
                "github": "http://github.com/laracroft",
                "profileImage": "https://i.imgur.com/k7XVwpB.jpeg"
            }
        ]
    }
        

Author

  • URL: ://service/author/{AUTHOR_ID}/
    • GET: retrieve their profile
    • POST: update profile
  • Example Format:
    {
        "type":"author",
        # ID of the Author
        "id":"http://127.0.0.1:5454/author/9de17f29c12e8f97bcbbd34cc908f1baba40658e",
        # the home host of the author
        "host":"http://127.0.0.1:5454/",
        # the display name of the author
        "displayName":"Lara Croft",
        # url to the authors profile
        "url":"http://127.0.0.1:5454/author/9de17f29c12e8f97bcbbd34cc908f1baba40658e",
        # HATEOS url for Github API
        "github": "http://github.com/laracroft",
        # Image from a public domain
        "profileImage": "https://i.imgur.com/k7XVwpB.jpeg"
    }
        

Followers

  • URL: ://service/author/{AUTHOR_ID}/followers
    • GET: get a list of authors who are their followers
  • URL: ://service/author/{AUTHOR_ID}/followers/{FOREIGN_AUTHOR_ID}
    • DELETE: remove a follower
    • PUT: Add a follower (must be authenticated)
    • GET check if follower
  • Example: GET ://service/author/{AUTHOR_ID}/followers
    {
        "type": "followers",      
        "items":[
            {
                "type":"author",
                "id":"http://127.0.0.1:5454/author/1d698d25ff008f7538453c120f581471",
                "url":"http://127.0.0.1:5454/author/1d698d25ff008f7538453c120f581471",
                "host":"http://127.0.0.1:5454/",
                "displayName":"Greg Johnson",
                "github": "http://github.com/gjohnson",
                "profileImage": "https://i.imgur.com/k7XVwpB.jpeg"
            },
            {
                "type":"author",
                "id":"http://127.0.0.1:5454/author/9de17f29c12e8f97bcbbd34cc908f1baba40658e",
                "host":"http://127.0.0.1:5454/",
                "displayName":"Lara Croft",
                "url":"http://127.0.0.1:5454/author/9de17f29c12e8f97bcbbd34cc908f1baba40658e",
                "github": "http://github.com/laracroft",
                "profileImage": "https://i.imgur.com/k7XVwpB.jpeg"
            }
        ]
    }
        

FriendRequest

  • This allows someone to follow you, so you can send them your posts.
  • Sent to inbox
  • Example format:
    {
        "type": "Follow",      
        "summary":"Greg wants to follow Lara",
        "actor":{
            "type":"author",
            "id":"http://127.0.0.1:5454/author/1d698d25ff008f7538453c120f581471",
            "url":"http://127.0.0.1:5454/author/1d698d25ff008f7538453c120f581471",
            "host":"http://127.0.0.1:5454/",
            "displayName":"Greg Johnson",
            "github": "http://github.com/gjohnson",
            "profileImage": "https://i.imgur.com/k7XVwpB.jpeg"
        },
        "object":{
            "type":"author",
            # ID of the Author
            "id":"http://127.0.0.1:5454/author/9de17f29c12e8f97bcbbd34cc908f1baba40658e",
            # the home host of the author
            "host":"http://127.0.0.1:5454/",
            # the display name of the author
            "displayName":"Lara Croft",
            # url to the authors profile
            "url":"http://127.0.0.1:5454/author/9de17f29c12e8f97bcbbd34cc908f1baba40658e",
            # HATEOS url for Github API
            "github": "http://github.com/laracroft",
            # Image from a public domain
            "profileImage": "https://i.imgur.com/k7XVwpB.jpeg"
        }
    }
        

Post

  • URL: ://service/author/{AUTHOR_ID}/posts/{POST_ID}
    • GET get the public post
    • POST update the post (must be authenticated)
    • DELETE remove the post
    • PUT create a post with that post_id
  • Creation URL ://service/author/{AUTHOR_ID}/posts/
    • GET get recent posts of author (paginated)
    • POST create a new post but generate a post_id
  • Be aware that Posts can be images that need base64 decoding.
    • posts can also hyperlink to images that are public
  • Example Format:
    {
        "type":"post",
        # title of a post
        "title":"A post title about a post about web dev",
        # id of the post
        "id":"http://127.0.0.1:5454/author/9de17f29c12e8f97bcbbd34cc908f1baba40658e/posts/764efa883dda1e11db47671c4a3bbd9e"
        # where did you get this post from?
        "source":"http://lastplaceigotthisfrom.com/posts/yyyyy",
        # where is it actually from
        "origin":"http://whereitcamefrom.com/posts/zzzzz",
        # a brief description of the post
        "description":"This post discusses stuff -- brief",
        # The content type of the post
        # assume either
        # text/markdown -- common mark
        # text/plain -- UTF-8
        # application/base64
        # image/png;base64 # this is an embedded png -- images are POSTS. So you might have a user make 2 posts if a post includes an image!
        # image/jpeg;base64 # this is an embedded jpeg
        # for HTML you will want to strip tags before displaying
        "contentType":"text/plain",
        "content":"Þā wæs on burgum Bēowulf Scyldinga, lēof lēod-cyning, longe þrāge folcum gefrǣge (fæder ellor hwearf, aldor of earde), oð þæt him eft onwōc hēah Healfdene; hēold þenden lifde, gamol and gūð-rēow, glæde Scyldingas. Þǣm fēower bearn forð-gerīmed in worold wōcun, weoroda rǣswan, Heorogār and Hrōðgār and Hālga til; hȳrde ic, þat Elan cwēn Ongenþēowes wæs Heaðoscilfinges heals-gebedde. Þā wæs Hrōðgāre here-spēd gyfen, wīges weorð-mynd, þæt him his wine-māgas georne hȳrdon, oð þæt sēo geogoð gewēox, mago-driht micel. Him on mōd bearn, þæt heal-reced hātan wolde, medo-ærn micel men gewyrcean, þone yldo bearn ǣfre gefrūnon, and þǣr on innan eall gedǣlan geongum and ealdum, swylc him god sealde, būton folc-scare and feorum gumena. Þā ic wīde gefrægn weorc gebannan manigre mǣgðe geond þisne middan-geard, folc-stede frætwan. Him on fyrste gelomp ǣdre mid yldum, þæt hit wearð eal gearo, heal-ærna mǣst; scōp him Heort naman, sē þe his wordes geweald wīde hæfde. Hē bēot ne ālēh, bēagas dǣlde, sinc æt symle. Sele hlīfade hēah and horn-gēap: heaðo-wylma bād, lāðan līges; ne wæs hit lenge þā gēn þæt se ecg-hete āðum-swerian 85 æfter wæl-nīðe wæcnan scolde. Þā se ellen-gǣst earfoðlīce þrāge geþolode, sē þe in þȳstrum bād, þæt hē dōgora gehwām drēam gehȳrde hlūdne in healle; þǣr wæs hearpan swēg, swutol sang scopes. Sægde sē þe cūðe frum-sceaft fīra feorran reccan",
        # the author has an ID where by authors can be disambiguated
        "author":{
              "type":"author",
              # ID of the Author
              "id":"http://127.0.0.1:5454/author/9de17f29c12e8f97bcbbd34cc908f1baba40658e",
              # the home host of the author
              "host":"http://127.0.0.1:5454/",
              # the display name of the author
              "displayName":"Lara Croft",
              # url to the authors profile
              "url":"http://127.0.0.1:5454/author/9de17f29c12e8f97bcbbd34cc908f1baba40658e",
              # HATEOS url for Github API
              "github": "http://github.com/laracroft",
              # Image from a public domain (optional, can be missing)
              "profileImage": "https://i.imgur.com/k7XVwpB.jpeg"
        },
        # categories this post fits into (a list of strings
        "categories":["web","tutorial"],
        # comments about the post
        # return a maximum number of comments
        # total number of comments for this post
        "count": 1023,
        # the first page of comments
        "comments":"http://127.0.0.1:5454/author/9de17f29c12e8f97bcbbd34cc908f1baba40658e/posts/de305d54-75b4-431b-adb2-eb6b9e546013/comments"
        # commentsSrc is OPTIONAL and can be missing
        # You should return ~ 5 comments per post.
        # should be sorted newest(first) to oldest(last)
        # this is to reduce API call counts
        "commentsSrc":{
            "type":"comments",
            "page":1,
            "size":5,
            "post":"http://127.0.0.1:5454/author/9de17f29c12e8f97bcbbd34cc908f1baba40658e/posts/764efa883dda1e11db47671c4a3bbd9e"
            "id":"http://127.0.0.1:5454/author/9de17f29c12e8f97bcbbd34cc908f1baba40658e/posts/de305d54-75b4-431b-adb2-eb6b9e546013/comments"
            "comments":[
                {
                    "type":"comment",
                    "author":{
                        "type":"author",
                        # ID of the Author (UUID)
                        "id":"http://127.0.0.1:5454/author/1d698d25ff008f7538453c120f581471",
                        # url to the authors information
                        "url":"http://127.0.0.1:5454/author/1d698d25ff008f7538453c120f581471",
                        "host":"http://127.0.0.1:5454/",
                        "displayName":"Greg Johnson",
                        # HATEOS url for Github API
                        "github": "http://github.com/gjohnson",
                        # Image from a public domain
                        "profileImage": "https://i.imgur.com/k7XVwpB.jpeg"
                    },
                    "comment":"Sick Olde English",
                    "contentType":"text/markdown",
                    # ISO 8601 TIMESTAMP
                    "published":"2015-03-09T13:07:04+00:00",
                    # ID of the Comment (UUID)
                    "id":"http://127.0.0.1:5454/author/9de17f29c12e8f97bcbbd34cc908f1baba40658e/posts/de305d54-75b4-431b-adb2-eb6b9e546013/comments/f6255bb01c648fe967714d52a89e8e9c",
                }
            ]
        }
        # ISO 8601 TIMESTAMP
        "published":"2015-03-09T13:07:04+00:00",
        # visibility ["PUBLIC","FRIENDS"]
        "visibility":"PUBLIC",
        # for visibility PUBLIC means it is open to the wild web
        # FRIENDS means if we're direct friends I can see the post
        # FRIENDS should've already been sent the post so they don't need this
        "unlisted":false
        # unlisted means it is public if you know the post name -- use this for images, it's so images don't show up in timelines
    }
        

Comments

  • URL: ://service/author/{author_id}/posts/{post_id}/comments access
    • GET get comments of the post
    • POST if you post an object of “type”:”comment”, it will add your comment to the post
  • paginated
  • example comment from ://service/author/{author_id}/posts/{post_id}/comments
    {
        "type":"comment",
        "author":{
            "type":"author",
            # ID of the Author (UUID)
            "id":"http://127.0.0.1:5454/author/1d698d25ff008f7538453c120f581471",
            # url to the authors information
            "url":"http://127.0.0.1:5454/author/1d698d25ff008f7538453c120f581471",
            "host":"http://127.0.0.1:5454/",
            "displayName":"Greg Johnson",
            # HATEOS url for Github API
            "github": "http://github.com/gjohnson",
            # Image from a public domain
            "profileImage": "https://i.imgur.com/k7XVwpB.jpeg"
        }
        "comment":"Sick Olde English",
        "contentType":"text/markdown",
        # ISO 8601 TIMESTAMP
        "published":"2015-03-09T13:07:04+00:00",
        # ID of the Comment (UUID)
        "id":"http://127.0.0.1:5454/author/9de17f29c12e8f97bcbbd34cc908f1baba40658e/posts/de305d54-75b4-431b-adb2-eb6b9e546013/comments/f6255bb01c648fe967714d52a89e8e9c",
    }
        
  • example comments
    {
        "type":"comments",
        "page":1,
        "size":5,
        "post":"http://127.0.0.1:5454/author/9de17f29c12e8f97bcbbd34cc908f1baba40658e/posts/764efa883dda1e11db47671c4a3bbd9e"
        "id":"http://127.0.0.1:5454/author/9de17f29c12e8f97bcbbd34cc908f1baba40658e/posts/de305d54-75b4-431b-adb2-eb6b9e546013/comments"
        "comments":[
            {
                "type":"comment",
                "author":{
                    "type":"author",
                    # ID of the Author (UUID)
                    "id":"http://127.0.0.1:5454/author/1d698d25ff008f7538453c120f581471",
                    # url to the authors information
                    "url":"http://127.0.0.1:5454/author/1d698d25ff008f7538453c120f581471",
                    "host":"http://127.0.0.1:5454/",
                    "displayName":"Greg Johnson",
                    # HATEOS url for Github API
                    "github": "http://github.com/gjohnson",
                    # Image from a public domain
                    "profileImage": "https://i.imgur.com/k7XVwpB.jpeg"
                },
                "comment":"Sick Olde English",
                "contentType":"text/markdown",
                # ISO 8601 TIMESTAMP
                "published":"2015-03-09T13:07:04+00:00",
                # ID of the Comment (UUID)
                "id":"http://127.0.0.1:5454/author/9de17f29c12e8f97bcbbd34cc908f1baba40658e/posts/de305d54-75b4-431b-adb2-eb6b9e546013/comments/f6255bb01c648fe967714d52a89e8e9c",
            }
        ]
    }
        

Likes

  • You can like posts and comments
  • Send them to the inbox
  • URL: ://service/author/{author_id}/inbox/
    • POST: send a like object to {author_id}
  • URL: ://service/author/{author_id}/post/{post_id}/likes
    • GET a list of likes from other authors on author_id’s post post_id
  • URL: ://service/author/{author_id}/post/{post_id}/comments/{comment_id}/likes
    • GET a list of likes from other authors on author_id’s post post_id comment comment_id
  • Example like object:
     {
         "@context": "https://www.w3.org/ns/activitystreams",
         "summary": "Lara Croft Likes your post",         
         "type": "Like",
         "author":{
             "type":"author",
             "id":"http://127.0.0.1:5454/author/9de17f29c12e8f97bcbbd34cc908f1baba40658e",
             "host":"http://127.0.0.1:5454/",
             "displayName":"Lara Croft",
             "url":"http://127.0.0.1:5454/author/9de17f29c12e8f97bcbbd34cc908f1baba40658e",
             "github":"http://github.com/laracroft",
             "profileImage": "https://i.imgur.com/k7XVwpB.jpeg"
         },
         "object":"http://127.0.0.1:5454/author/9de17f29c12e8f97bcbbd34cc908f1baba40658e/posts/764efa883dda1e11db47671c4a3bbd9e"
    }
        

Liked

  • URL: ://service/author/{author_id}/liked
    • GET list what public things author_id liked.
      • It’s a list of of likes originating from this author
  • 7
  • Example liked object:
    {
        "type":"liked",
        "items":[
            {
                "@context": "https://www.w3.org/ns/activitystreams",
                "summary": "Lara Croft Likes your post",         
                "type": "Like",
                "author":{
                    "type":"author",
                    "id":"http://127.0.0.1:5454/author/9de17f29c12e8f97bcbbd34cc908f1baba40658e",
                    "host":"http://127.0.0.1:5454/",
                    "displayName":"Lara Croft",
                    "url":"http://127.0.0.1:5454/author/9de17f29c12e8f97bcbbd34cc908f1baba40658e",
                    "github":"http://github.com/laracroft",
                    "profileImage": "https://i.imgur.com/k7XVwpB.jpeg"
                },
                "object":"http://127.0.0.1:5454/author/9de17f29c12e8f97bcbbd34cc908f1baba40658e/posts/764efa883dda1e11db47671c4a3bbd9e"
            }
        ]
    }
        

Inbox

  • The inbox is all the new posts from who you follow
  • URL: ://service/author/{AUTHOR_ID}/inbox
    • GET: if authenticated get a list of posts sent to {AUTHOR_ID}
    • POST: send a post to the author
      • if the type is “post” then add that post to the author’s inbox
      • if the type is “follow” then add that follow is added to the author’s inbox to approve later
      • if the type is “like” then add that like to the author’s inbox
    • DELETE: clear the inbox
  • paginated
  • Example, retrieving an inbox
    {
        "type":"inbox",
        "author":"http://127.0.0.1:5454/author/c1e3db8ccea4541a0f3d7e5c75feb3fb",
        "items":[
            {
                "type":"post",
                "title":"A Friendly post title about a post about web dev",
                "id":"http://127.0.0.1:5454/author/9de17f29c12e8f97bcbbd34cc908f1baba40658e/posts/764efa883dda1e11db47671c4a3bbd9e"
                "source":"http://lastplaceigotthisfrom.com/posts/yyyyy",
                "origin":"http://whereitcamefrom.com/posts/zzzzz",
                "description":"This post discusses stuff -- brief",
                "contentType":"text/plain",
                "content":"Þā wæs on burgum Bēowulf Scyldinga, lēof lēod-cyning, longe þrāge folcum gefrǣge (fæder ellor hwearf, aldor of earde), oð þæt him eft onwōc hēah Healfdene; hēold þenden lifde, gamol and gūð-rēow, glæde Scyldingas. Þǣm fēower bearn forð-gerīmed in worold wōcun, weoroda rǣswan, Heorogār and Hrōðgār and Hālga til; hȳrde ic, þat Elan cwēn Ongenþēowes wæs Heaðoscilfinges heals-gebedde. Þā wæs Hrōðgāre here-spēd gyfen, wīges weorð-mynd, þæt him his wine-māgas georne hȳrdon, oð þæt sēo geogoð gewēox, mago-driht micel. Him on mōd bearn, þæt heal-reced hātan wolde, medo-ærn micel men gewyrcean, þone yldo bearn ǣfre gefrūnon, and þǣr on innan eall gedǣlan geongum and ealdum, swylc him god sealde, būton folc-scare and feorum gumena. Þā ic wīde gefrægn weorc gebannan manigre mǣgðe geond þisne middan-geard, folc-stede frætwan. Him on fyrste gelomp ǣdre mid yldum, þæt hit wearð eal gearo, heal-ærna mǣst; scōp him Heort naman, sē þe his wordes geweald wīde hæfde. Hē bēot ne ālēh, bēagas dǣlde, sinc æt symle. Sele hlīfade hēah and horn-gēap: heaðo-wylma bād, lāðan līges; ne wæs hit lenge þā gēn þæt se ecg-hete āðum-swerian 85 æfter wæl-nīðe wæcnan scolde. Þā se ellen-gǣst earfoðlīce þrāge geþolode, sē þe in þȳstrum bād, þæt hē dōgora gehwām drēam gehȳrde hlūdne in healle; þǣr wæs hearpan swēg, swutol sang scopes. Sægde sē þe cūðe frum-sceaft fīra feorran reccan",
                "author":{
                      "type":"author",
                      "id":"http://127.0.0.1:5454/author/9de17f29c12e8f97bcbbd34cc908f1baba40658e",
                      "host":"http://127.0.0.1:5454/",
                      "displayName":"Lara Croft",
                      "url":"http://127.0.0.1:5454/author/9de17f29c12e8f97bcbbd34cc908f1baba40658e",
                      "github": "http://github.com/laracroft",
                      "profileImage": "https://i.imgur.com/k7XVwpB.jpeg"
                },
                "categories":["web","tutorial"],
                "comments":"http://127.0.0.1:5454/author/9de17f29c12e8f97bcbbd34cc908f1baba40658e/posts/de305d54-75b4-431b-adb2-eb6b9e546013/comments"
                "published":"2015-03-09T13:07:04+00:00",
                "visibility":"FRIENDS",
                "unlisted":false
            },
            {
                "type":"post",
                "title":"DID YOU READ MY POST YET?",
                "id":"http://127.0.0.1:5454/author/9de17f29c12e8f97bcbbd34cc908f1baba40658e/posts/999999983dda1e11db47671c4a3bbd9e",
                "source":"http://lastplaceigotthisfrom.com/posts/yyyyy",
                "origin":"http://whereitcamefrom.com/posts/zzzzz",
                "description":"Whatever",
                "contentType":"text/plain",
                "content":"Are you even reading my posts Arjun?",
                "author":{
                      "type":"author",
                      "id":"http://127.0.0.1:5454/author/9de17f29c12e8f97bcbbd34cc908f1baba40658e",
                      "host":"http://127.0.0.1:5454/",
                      "displayName":"Lara Croft",
                      "url":"http://127.0.0.1:5454/author/9de17f29c12e8f97bcbbd34cc908f1baba40658e",
                      "github": "http://github.com/laracroft",
                      "profileImage": "https://i.imgur.com/k7XVwpB.jpeg"
                },
                "categories":["web","tutorial"],
                "comments":"http://127.0.0.1:5454/author/9de17f29c12e8f97bcbbd34cc908f1baba40658e/posts/de305d54-75b4-431b-adb2-eb6b9e546013/comments"
                "published":"2015-03-09T13:07:04+00:00",
                "visibility":"FRIENDS",
                "unlisted":false
            }
        ]
    }
        

Requirements

  • WARNING: Check this over again
  • [ ] Implement the webservice as described in the user stories
  • [ ] Provide a webservice interface that is restful
  • [ ] Provide a web UI interface that is usable
  • [ ] Prove your project by connecting with at least 1 clone of your project.
  • [ ] Prove your project by connecting with at least 2 other groups.
  • [ ] Prove your project by connecting with at least 3 other groups.
  • [ ] Make a video demo of your blog (desktop-recorder is ok)
  • [ ] Make a presentation about your blog
  • [ ] Follow the guidelines in the project.org for URLs and services
  • [ ] Allow users to accept or reject friend requests
  • [ ] Images get the same protection that posts get as they are POSTS

Take-aways

  • [ ] 1 Working Website
  • [ ] 1 Github git repo
  • [ ] 1 Presentation
  • [ ] 1 Video

Restrictions

  • [ ] Use Python 3.6+ (otherwise get approval)
  • [ ] Use Django or Flask (otherwise get approval)
  • [ ] Must run on one of the following:
    • [ ] provided VMs
    • [ ] Heroku
  • [ ] License your code properly (use an OSI approved license)
    • Put your name (or some representation of you like GeneralHuxFan768) on it!

API Guidelines

When building your API, try to adhere to these rules for easy compatibility with other groups:

  • REST API calls may be prefixed. ie. http://service_address/api/author/{AUTHOR_ID}/posts/
  • Document your service address, port, hostname, prefix(if used), and the username/password for HTTP Basic Auth(if used) in your README so that HTTP clients can connect to your API.

Submission Instructions

Warning!!!!

This spec is subject to change!

Marking

Project Part 0

  • 1 mark
  • [ ] 4-5 CCIDs
  • [ ] 1 Github repo with a README and LICENSE

Project Part 1

  • 7 Marks
  • Total Project
    • Excellent 7: Excellent effort. Relatively consistent. At least ½ of the project implemented. Clean code. 1/2 includes both UI and webservice.
    • Good 6: Good quality. Some inconsistency. About ½ of the project implemented
    • Satisfactory 5: Codebase in places. Passes some tests. Some parts run
    • Unsatisfactory 3: Effort exists, it’s missing lots of components but something is there.
    • Failure 0: Missing. No attempted. Not complete enough to evaluate.
  • Code Base
    • Excellent : Excellent effort. Relatively consistent. At least ½ of the project implemented. Clean code
    • Good : Good quality. Some inconsistency. About ½ of the project implemented
    • Satisfactory : Codebase in places. Passes some tests. Some parts run
    • Unsatisfactory : Does not meet Satisfactory level
  • Test Cases
    • Excellent: System is well tested
    • Good: System has some blind spots for testing
    • Satisfactory: Effort was placed on testing but it is inconsistent.
    • Unsatisfactory: test cases are inappropriate but exist.
    • Failure: Missing test cases
  • UI 2
    • Excellent: UI Exists and is coherent. Shows evidence of planning.
    • Good: UI Exists. Some issues
    • Satisfactory: UI Exists, it’s not good. It has issues.
    • Unsatisfactory: A UI was attempted, a UI exists.
    • Failure: No UI, or what was attempted is not substantial.
  • Tool Use
    • Excellent: Use of at least Git is Evidence and Obvious
    • Good: Frequent but inconsistent use of Git, etc.
    • Satisfactory: Uses Git, etc.
    • Unsatisfactory: Limited of tool use
    • Failure: Used filesharing and email attachments instead of git
  • TA Demo
    • Excellent: Coherent demo, shows off features. Limited snags.
    • Good: Coherent demo, shows off features. Some snags.
    • Satisfactory: Lots of snags. Can demo it.
    • Unsatifactory: Unfinished, hard to demo.
    • Failure: no demo or unable to demo.
  • Web Service API & Documentation
    • Excellent: Documented, adheres to requirements to augments them with compatibility
    • Good: Documented, exists, tries to adhere to requirements
    • Satisfactory: Some of the webservice exists
    • Unsatisfactory: Well you tried right?
    • Failure: Ok you didn’t try.
  • Design
    • Excellent: Adheres to standards, well designed
    • Good: Adheres to standards somewhat, some awkward parts
    • Satisfactory: Some good parts, some nasty parts
    • Unsatisfactory: Little effort went into documenting and designing the project
    • Failure: failure to learn from the class and apply concepts even remedially

Project Part 2: The web service

  • 5 Marks
  • Total Project
    • Excellent 5: Excellent effort. Coordinates and connects fine with 2 or more groups.
    • Good 4: Some issues, not quite excellent but definitely fixable and functional with 1 or more groups
    • Satisfactory 3: There are issues, it does run, it does coordinate with 1 or more groups.
    • Unsatisfactory 2: Well you tried, but it’s hardly working.
    • Failure 0: Missing. No attempted. Not complete enough to evaluate.
  • Web Service API & Documentation
    • Excellent: Documented, adheres to requirements to augments them with compatibility
    • Good: Documented, exists, tries to adhere to requirements
    • Satisfactory: Some of the webservice exists
    • Unsatisfactory: Webservice exists, barely.
    • Failure: it is not usable.
  • Web Service Coordination
    • Excellent: Web service coordinates with 2+ other group projects successfully. Most interoperation requirements met.
    • Good: Web service coordinates with 1+ other group projects successfully. Most interoperation requirements met. Some snags.
    • Satisfactory: The basics of coordination are covered. Probably many snags.
    • Unsatisfactory 0: Coordination barely works.
    • Failure: failure to coordinate
  • Design
    • Excellent: Adheres to standards, well designed
    • Good: Adheres to standards somewhat, some awkward parts
    • Satisfactory: Some good parts, some nasty parts
    • Unsatisfactory: Little effort went into documenting and designing the project
    • Failure: failure to apply what was learned in class

Project Part 3

  • 20 Marks
  • Total Project
    • Excellent 20: Excellent effort. Coordinates and connects fine. Good demo. Clear application of what was learned in class. 3 or more groups connected.
    • Good 17: Some issues, not quite excellent but definitely operational and functional. 2 or more groups connected.
    • Satisfactory 14: There are issues, it does run, it does coordinate. Meets satisfactory aspects of rubric. 2 or more group connected.
    • Unsatisfactory 10: Well you tried, but it’s hardly working. Meets unsatisfactory aspects of rubric. 1 or more group connected.
    • Failure 0: Missing. No attempted. Not complete enough to evaluate. Often hits failure aspects of rubric.
  • Note: these are ordered by importance, but you need to meet all these parts and we care about the final quality.
  • Code Base
    • Excellent: Excellent effort. Relatively consistent. At least 90% of requirements implemented. Clean code
    • Good: Good quality. Some inconsistency. About 90% of requirements implemented.
    • Satisfactory: Codebase in places. Passes some tests. Some parts run
    • Unsatisfactory: Does not meet Satisfactory level
  • UI 3
    • Excellent: UI Exists and works well. Shows evidence of planning. Looks great.
    • Good: UI Exists. Looks good
    • Satisfactory: UI exists. Looks poor.
    • Unsatisfactory: UI exists. Doesn’t work well. Worse than poor.
    • Failure: Missing or unusable.
  • Web Service Coordination
    • Excellent: Web service coordinates with 2+ other group projects successfully. Most interoperation requirements met.
    • Good: Web service coordinates with 2+ other group projects successfully. Most interoperation requirements met. Some snags.
    • Satisfactory: The basics of coordination are covered. Probably many snags.
    • Unsatisfactory: Coordination doesn’t work or barely works.
  • Web Service API & Documentation
    • Excellent: Documented, adheres to requirements to augments them with compatibility
    • Good: Documented, exists, tries to adhere to requirements
    • Satisfactory: Some of the webservice exists
    • Unsatisfactory: Effort taken but incomplete.
    • Failure: API or Documentation Missing
  • Test Cases
    • Excellent: System is well tested
    • Good: System has some tests
    • Unsatisfactory: test cases are inappropriate
    • Failure: Missing test cases
  • Tool Use
    • Excellent: Use of at least Git is Evidence and Obvious
    • Good: Frequent but inconsistent use of Git, etc.
    • Satisfactory: Infrequent use of Git, etc.
    • Unsatisfactory: Limited tool use
    • Failure: lack of tool use
  • Design
    • Excellent: Adheres to standards, well designed
    • Good: Adheres to standards somewhat, some awkward parts
    • Satisfactory: Some good parts, some nasty parts
    • Unsatisfactory: Little effort went into documenting and designing the project
    • Failure: clear lack of design
  • Adhering to Standards
    • Excellent: Excellent attempt at making a standards compliant website. Most things are compliant.
    • Good: An attempt at making a standards compliant website. Some not compliant.
    • Satisfactory: Inconsistent.
    • Unsatisfactory: poor attempt to meet standards.
    • Failure: failed to apply what was learned in class
  • Addressing Feedback:
    • Excellent: TAs suggestions were implemented, TA approves of implementation set.
    • Good: The good TA suggestions were implemented ;)
    • Satisfactory: Feedback ignored mostly, but some followed.
    • Unsatisfactory: Majority of Feedback ignored.
    • Failure: Feedback ignored.
  • Presentation:
    • Excellent: Presentation within time, shows teamwork, promotes the application.
    • Good: Presentation nearly within time, some team works, reasonable presentation.
    • Satisfactory: Presentation exists but has problems.
    • Unsatisfactory: Missing or terrible presentation (lack of practice, lack of preparation, irrelevant).
    • Failure: no presentation
  • Video Demo:
    • Excellent: Video is well presented and not boring, less than 2 minutes.
    • Good: Video presents the functionality and is less than 2 minutes.
    • Satisfactory: Video is longer than 2 minutes, or doesn’t accurately present the project.
    • Unsatisfactory: A video exists and it is a demo.
    • Failure: lack of video, failure to make a video.
  • AJAX
    • Excellent: Uses AJAX appropriately and well (documented)
    • Good: Uses some AJAX (documented)
    • Satisfactory: AJAX not really used
    • Unsatisfactory: An attempt was made.
    • Failure: No AJAX

License

  • Parts of this document are derived from the W3C Documentation for Activity Pub
  • Copyright © 2018 W3C® (MIT, ERCIM, Keio, Beihang). W3C liability, trademark and permissive document license rules apply.
  • https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
    License
    
    By obtaining and/or copying this work, you (the licensee) agree that you have read, understood, and will comply with the following terms and conditions.
    
    Permission to copy, modify, and distribute this work, with or without modification, for any purpose and without fee or royalty is hereby granted, provided that you include the following on ALL copies of the work or portions thereof, including modifications:
    
        The full text of this NOTICE in a location viewable to users of the redistributed or derivative work.
        Any pre-existing intellectual property disclaimers, notices, or terms and conditions. If none exist, the W3C Software and Document Short Notice should be included.
        Notice of any changes or modifications, through a copyright statement on the new code or document such as "This software or document includes material copied from or derived from [title and URI of the W3C document]. Copyright © [YEAR] W3C® (MIT, ERCIM, Keio, Beihang)." 
    
    Disclaimers
    
    THIS WORK IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE OR DOCUMENT WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.
    
    COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR DOCUMENT.
    
    The name and trademarks of copyright holders may NOT be used in advertising or publicity pertaining to the work without specific, written prior permission. Title to copyright in this work will at all times remain with copyright holders.