⚡ RESTful Pastebin Service for @hashnode via @planetscale

  • By Collove
  • Last update: Nov 2, 2022
  • Comments: 14

PasteMe - RESTful Pastebin Service


🍀 : Check out PasteMe Live!

📰 : Read the article describing the development and deployment steps behind this service on Hashnode.

⚙️ : PasteMe uses django-psdb-engine for the PlanetScale integration.

A RESTful pastebin service made for @hashnode purposes powered by the @PlanetScale MySQL DBaaS. Two key tech stacks (frameworks) behind thie project are TailwindCSS and DRF.

Usage

Use the pasteme-cli package and start pasting. Once you paste your content, you'll be able to share it with others.

$ pip install -U pasteme-cli
...
$ pasteme --help

Tech Stack

Contributing

Follow up the steps in order to make PasteMe ready on your machine and start developing. All your contributions are welcome. 🍻 ♥️

License

PasteMe is being licensed under the MIT License.

Special Thanks to

Github

https://github.com/collove/pasteme

Comments(14)

  • 1

    UPDATE: Navbar and Loading Screen

    • Navbar positioning enhanced and looks smooth now, it also were not fixed on other pages than home, which is fixed now.
    • Loading screen animation is also updated and has PasteMe text on it now.
  • 2

    Bump django from 4.0.6 to 4.0.7

    Bumps django from 4.0.6 to 4.0.7.

    Commits
    • e9e9729 [4.0.x] Bumped version for 4.0.7 release.
    • b7d9529 [4.0.x] Fixed CVE-2022-36359 -- Escaped filename in Content-Disposition header.
    • 2eb7ded [4.0.x] Adjusted version 4.0.7 release notes.
    • baeffe8 [4.0.x] Ignored 080359c4c5242ef69ac8c58c92f240e71121ffd7 formatting changes i...
    • 080359c [4.0.x] Fixed warnings per flake8 5.0.0.
    • 1a9f079 [4.0.x] Fixed collation tests on MySQL 8.0.30+.
    • b8b449f [4.0.x] Adjusted release notes for 4.0.7 and 3.2.15.
    • 2c2b748 [4.0.x] Added release date and stub release notes for 4.0.7 and 3.2.15 releases.
    • f78b18f [4.0.x] Fixed #33820 -- Doc'd "true"/"false"/"null" caveat for JSONField key ...
    • 48501c8 [4.0.x] Fixed RelatedGeoModelTest.test08_defer_only() on MySQL 8+ with MyISAM...
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

  • 3

    Feature Request: Implement expiry feature for pastes (snippets)

    A new field for Snippet model to set an expiration time. (e.g. one week, one month, one year,..)

    • A management command that runs once every day and removes all the expired snippets.
  • 4

    Feature Request: Make the navbar toggle (hamburgur) animative!

    Change the native Bootstrap navbar toggle to an animative element in the mobile platform! Once you clicked the button, it changes its shape X mark for example.

  • 5

    Having a Blog

    Having a blog related to project updates and code-snippets related conversations would be a :fire: feature, I recommend planning for this phase after :heavy_check_mark: other more important issues.

  • 6

    Feature Request [Developement ]: No issue and PR template in github repository

    Problem : Currently there is not any issue and Pull Request templates available in the repository. Due to that we can't get a clear details about the new issues posted or it just takes too much time to organize the details about an issue

    Solution:

    • We can add a issue template in the .github/ISSUE_TEMPLATE/ folder and .github/PULL_REQUEST_TEMPLATE/
    • This article explains benefits of Issues and Pull Request templates

    You can assign this issue to me @SiddheshKukade

  • 7

    FIX: Navbar fixed position on scroll

    Navbar position needs to change relative to the page scroll, this happens via JS adding various CSS classes to the hero and navbar elements. Some CSS classes were making a glitch-like effect while scrolling the page, which is fixed now.

    Actions Taken

    • Navbar position fixed
    • Created at changed to Created on in snippets template
    • Pre-commit ran locally
  • 8

    Bug fixes to TailWindCSS integration (Dev. branch)

    This pull request makes navbar sticky, loads fonts locally, fixes update contributors command, adds meta tags to blogs template and enhances JS usage in different templates, hope it :rocket:

  • 9

    ADD: [Feature] paste expiry

    Hey Sadra! I've added a new field called expires_in to the Snippet model, which represents expiry days! This PR also includes snippet template badges and everything needed for #48 to be resolved.

    Ex: if a models has expires_in value of 7 it means it will be expired in 7 days.

  • 10

    ADD: Code Comments, UPDATE: Modal state saved on local storage

    Modals 'closed' state were being saved in session storage, which made the modal to be shown every time a user closes the browser tab. Now it's being saved in local storage.

  • 11

    Modal Features

    Now we can show users Modal windows, modals can have:

    • Icon
    • Expiry time
    • Link to external resource

    Last added modal will be shown to the users, modals may be dismissed by pressing the X button, pressing that button will hide the modal in that session.

    Newly added modals will be shown to all users and need to be dissmised again.

  • 12

    Bump django from 4.0.6 to 4.0.8

    Bumps django from 4.0.6 to 4.0.8.

    Commits
    • 7d5cb49 [4.0.x] Bumped version for 4.0.8 release.
    • 23f0093 [4.0.x] Fixed CVE-2022-41323 -- Prevented locales being interpreted as regula...
    • 4a30e0d [4.0.x] Set date and added stub notes for 4.0.8 and 3.2.16 releases.
    • 898f0aa [4.0.x] Added CVE-2022-36359 to security archive.
    • 60e6bae [4.0.x] Post-release version bump.
    • e9e9729 [4.0.x] Bumped version for 4.0.7 release.
    • b7d9529 [4.0.x] Fixed CVE-2022-36359 -- Escaped filename in Content-Disposition header.
    • 2eb7ded [4.0.x] Adjusted version 4.0.7 release notes.
    • baeffe8 [4.0.x] Ignored 080359c4c5242ef69ac8c58c92f240e71121ffd7 formatting changes i...
    • 080359c [4.0.x] Fixed warnings per flake8 5.0.0.
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

  • 13

    Adding total number of pastes to home

    It would be cool showing total number of pastes created on the website right after all other stats in the home page.

    I recommend adding a new field to Statistic model and incrementing it on each new submission (or via the cronjob, among other statistics updates).

  • 14

    General Recommendations

    Hey Sadra, I wish you doing well, thank you for this great project, PasteMe has become one of my favorite online tools for sure.

    I've viewed the project codebase and like to share my opinions on a couple of things that caught my :eyes:, so we share ideas about them here. I hope these make everything a little better and make the project to move forward.

    None of my recommindations would have any affects on the core website functionality, they are more related to back-end enhancments and visual aspects of the project.

    1. Snippet UUID Alphabet,

    You have used 12 characters abcdefg12345 as ShortUUIDField in Snippet model file, here is the code. https://github.com/collove/pasteme/blob/4916a92ca8135b79e54ff5a4463e8fbe8254e2c1/snippet/models.py#L8-L13

    These characters will make $12^5$ unique combinations based on your desired 5 char length UUIDs, that will have the capacity to produce $28K$ pastes in the application. I believe that's not a huge number for a pastebin service, I think this can simply be solved by using the built-in string module character groups and extending the alphabet to English letters and digits!

    from string import ascii_letters, digits
    alphabet = ascii_letters + digits
    

    This way, the system will be able to create $62^5$ UUIDs (pastes), which is $\approx 916M$ possibilities.

    This number can be shrinked by using smaller, but big-enouph, character groups like ascii_lowercase or ascii_uppercase. They will support $\approx 11M$ UUIDs.

    I've done this in my :fork_and_knife:, would be happy to open a PR if you're intrested.

    2. Using Code Formatters,

    After cloning the codebase on my machine, I've noticed that every file I visit is marked as edited via Git! It happens because of the Final new line that my code editor appends to each file, There are also Not Trimmed Trailing White spaces in the code and some random Extra new lines.

    https://github.com/collove/pasteme/blob/4916a92ca8135b79e54ff5a4463e8fbe8254e2c1/snippet/views/template.py#L7-L21

    All together, they make the codebase a little dirty and might make the pycodestyle and even some people :unamused: about formatting.

    I recommend using the “Black Formatter” in the project!

    By using Black, you agree to cede control over minutiae of hand-formatting. In return, Black gives you speed, determinism, and freedom from :unamused: faces. You will save time and mental energy for more important matters.

    Black makes code review faster by producing the smallest diffs possible. Blackened code looks the same regardless of the project you’re reading. Formatting becomes transparent after a while, and you can focus on the content instead.

    This can be achieved by using black locally as formatter on save, and checking the code style by GitHub Actions integration on every push to make sure everything is OK.

    I've created an action file that does the job in my :fork_and_knife:, would be happy to open a PR if you're intrested.

    3. The Footer,

    IDK why, but I believe all footers need to be sticky, They are called footers anyway :laughing:. This made me to feel out of comfort-zone and I think it's better that the footer be sticky, So it stocks down there now.

    Before:

    image

    After:

    image

    I've made the footer sticky in my :fork_and_knife:, would be happy to open a PR if you're intrested.

    4. Endpoints Rate Limit,

    Pastebin websites are usually tasty :cake: for new hackers, I'm not a security specialist, but rate-limiting end-points are always a good practice. Django Ratelimit is a rate-limiting decorator for Django views, storing rate data in the configured Django cache backend. I recommend using this package in the project.