Giter Site home page Giter Site logo

scheduler's People

Contributors

naskovasilev avatar owliie avatar

Stargazers

 avatar  avatar

Watchers

 avatar

Forkers

naskovasilev

scheduler's Issues

User profile page

Requirements

  • The user should be able to view their profile page and update their personal info like: firstName, lastName, phone
  • The business holders should be able to view their profile page where they can edit their availability, business type and products
  • Subissues

API endpoints

  • Get request: api/users/profile
  • Response
  • Business holder
{
    "firstName": "Atanas",
    "lastName": "Vasilev",
    "email": "[email protected]",
    "phone": "0876357845",
    "roles": [
        "Business Holder"
    ],
    "company": {
        "availability": [
            {
                "day": 1,
                "startHour": 10,
                "startMinute": 0,
                "endHour": 19,
                "endMinute": 0,
                "id": "620bcc7e36b6da362e7c2421"
            },
            {
                "day": 2,
                "startHour": 9,
                "startMinute": 30,
                "endHour": 19,
                "endMinute": 30,
                "id": "620bcc7e36b6da362e7c2422"
            },
            {
                "day": 3,
                "startHour": 11,
                "startMinute": 30,
                "endHour": 20,
                "endMinute": 30,
                "id": "620bcc7e36b6da362e7c2423"
            },
            {
                "day": 4,
                "startHour": 9,
                "startMinute": 0,
                "endHour": 20,
                "endMinute": 0,
                "id": "620bcc7e36b6da362e7c2424"
            },
            {
                "day": 5,
                "startHour": 8,
                "startMinute": 0,
                "endHour": 14,
                "endMinute": 0,
                "id": "620bcc7e36b6da362e7c2425"
            }
        ],
        "businessType": "62055417ab89400c51fd7f12",
        "description": "Some description comes here",
        "address": "Some address comes here",
        "id": "620af1ddfcb9e655cbaf8a7e"
    },
    "id": "61f65f35d0734ccae3e8cbd2"
}
  • Customer
{
    "firstName": "JavaScript",
    "lastName": "Developer",
    "email": "[email protected]",
    "phone": "0876359789",
    "roles": [],
    "id": "61f65dedd0734ccae3e8cbcd"
}

Edit user personal data

  • Put request: /api/users/profile
  • Body:
{
    "firstName": "Nasko",
    "lastName": "Atanasov",
    "phone": "0876351984"
}
  • Response
  • 200 Success
{
    "message": "The user personal data is updated.",
    "status": "success",
    "data": null
}

Edit business company info

  • Put request: api/businesses/company
  • Body:
{
    "description": "Business description comes here ...",
    "address": "Business address comes here ..."
}
  • Response
  • 200 Success
{
    "message": "The business details are updated.",
    "status": "success",
    "data": null
}

Set business type in the profile

Requirements

  • The business holders should be able to set theirs business type in the profile page
  • Users wihtout configured business type shouldn't be listed in the list with businesses

API endpoints

Set business holder business type

  • Post request: users/profile/businessType
  • Body:
{
    "businessTypeId": "62055417ab89400c51fd7f12"
}
  • Response
  • 200 Success
{
    "message": "The new business type is set.",
    "status": "success",
    "data": {}
}
  • 400 Bad request
{
    "message": "Error while setting the business type",
    "status": "failure",
    "data": {}
}

Business holder calendar

Requirements

  • the business holder should be able to view their appointments in calendar

Design

https://www.figma.com/file/1vHREHkbka8hwyxDHRpcyx/Scheduler?node-id=1011%3A7046
image

API endpoints

Get upcomming appointments by date

  • Get Request: api/businesses/schedule?date=2022-01-05
  • Response:
[
    {
        "createdOn": "2022-02-16T21:45:12.836Z",
        "client": {
            "firstName": "Atanas",
            "lastName": "Vasilev",
            "email": "[email protected]",
            "phone": "0876357845",
            "id": "61f65f35d0734ccae3e8cbd2"
        },
        "status": "Accepted",
        "start": "2022-02-16T11:00:00.000Z",
        "durationInMinutes": 60,
        "product": {
            "name": "Gentleman hairstyle",
            "price": 34,
            "id": "620af4ae04c7041ba09de80c"
        },
        "id": "620d7a8ed426a4beea96806c"
    },
    {
        "createdOn": "2022-02-16T19:56:02.582Z",
        "client": {
            "firstName": "Nasko",
            "lastName": "Atanasov",
            "email": "[email protected]",
            "phone": "0876351984",
            "id": "61f65dedd0734ccae3e8cbcd"
        },
        "status": "Pending",
        "start": "2022-02-16T14:30:00.000Z",
        "durationInMinutes": 30,
        "product": {
            "name": "Gentleman hairstyle",
            "price": 34,
            "id": "620af4ae04c7041ba09de80c"
        },
        "id": "620d5888dce94d51dd61a675"
    },
    {
        "createdOn": "2022-02-16T21:45:12.836Z",
        "client": {
            "firstName": "Atanas",
            "lastName": "Vasilev",
            "email": "[email protected]",
            "phone": "0876357845",
            "id": "61f65f35d0734ccae3e8cbd2"
        },
        "status": "Pending",
        "start": "2022-02-16T15:00:00.000Z",
        "durationInMinutes": 45,
        "product": {
            "name": "Gentleman hairstyle",
            "price": 34,
            "id": "620af4ae04c7041ba09de80c"
        },
        "id": "620d7654d426a4beea96803a"
    }
]

Accept appointment

  • Post request: api/appointments/accept/:id
    • Example: api/appointments/accept/620d7aadd426a4beea96807d
  • Body: empty
  • Response
  • 200 Success
{
    "message": "The appointment is successfully accepted.",
    "status": "success",
    "data": null
}
  • 400 Bad request
{
    "message": "Error while accepting the appointment.",
    "status": "failure",
    "data": null
}

Decline appointment

  • Post request: api/appointments/decline/:id
  • Example: api/appointments/decline/620d7aadd426a4beea96807d
  • Body: empty
  • Response:
  • 200 OK
{
    "message": "The appointment is successfully declined.",
    "status": "success",
    "data": null
}
  • 400 Bad request
{
    "message": "Error while declining the appointment.",
    "status": "failure",
    "data": null
}

Email sender

  • Implement email sender
  • Create infrastructure to generate the email body as html
  • Send emails when the business holder accept or deny appointment

Authorization and validations

  • Restricts some of the routes to logged in users
  • Restrict some of the routes to users in role 'Business holder'
  • Add validation to put and post endpoints

Services page

Rquirements

  • render all the businesses in the application by type
  • firstly the user should be able to choose type of service
  • then all the businsses with that type should be rendered to the user in order

Design

Api endpoints

Get all the business types

  • GET Request: /businessTypes - get all the business types
  • Response:
[
    {
        "name": "Tattoo",
        "imagePath": "public/images/business-types/tattoo.jpg",
        "id": "62055417ab89400c51fd7f12"
    },
    {
        "name": "Hairdressing",
        "imagePath": "public/images/business-types/hairdressing.jpg",
        "id": "62055f84e558e7a0d557c13b"
    },
    {
        "name": "Manicure",
        "imagePath": "public/images/business-types/manicure.jpg",
        "id": "62055fae04e12981d9499be8"
    },
    {
        "name": "Barbershop",
        "imagePath": "public/images/business-types/barbershop.jpg",
        "id": "620580f9f9d07477d628daf1"
    },
    {
        "name": "Massage",
        "imagePath": "public/images/business-types/massage.jpg",
        "id": "620580f9f9d07477d628daf2"
    },
    {
        "name": "Personal Trainer",
        "imagePath": "public/images/business-types/personal-trainer.jpg",
        "id": "620580f9f9d07477d628daf3"
    },
    {
        "name": "Dentist",
        "imagePath": "public/images/business-types/dentist.jpg",
        "id": "620580f9f9d07477d628daf4"
    }
]

Get businsses by type

  • Get request: /businesses/byType/:id where id is the id of the service type
    • Example: /businesses/byType/6c9dfff-d9b0-43c6-9aae-99102281884c - get all businsses for type Gym and Fitness
  • Response:
[
    {
        "id": "6c9ef89f-d9b0-43c6-9aae-99102281884c",
        "firstName": "Anna",
        "lastName": "Velichkova",
        "phone": "+35987568945",
        "description": "Anna hairdressing studio",
        "address": "Sofia, ul. \"Atanas Manchev\" 18",
        "addedToFavourites": false
    },
    {
        "id": "6c9ef89f-d9b0-43c6-9aae-99102281884c",
        "firstName": "Galena",
        "lastName": "Petrova",
        "phone": "+35987568333",
        "description": "Gelena hairdressing studio",
        "address": "Sofia, ul. \"Atanas Ishirkov\" 18",
        "addedToFavourites": true
    },
    {
        "id": "6c9ef89f-d9b0-43c6-9aae-99102281884d",
        "firstName": "Maria",
        "lastName": "Marinova",
        "phone": "+35987568777",
        "description": "Maria hairdressing studio",
        "address": "Sofia, ul. \"Ivan Vazov\" 18",
        "addedToFavourites": false
    },
    {
        "id": "6c9ef89f-d9b0-43c6-9aae-99102281884e",
        "firstName": "Plamen",
        "lastName": "Terziev",
        "phone": "+35987568475",
        "description": "Plamen hairdressing studio",
        "address": "Sofia, ul. \"Ivan Ivanov\" 18",
        "addedToFavourites": true
    },
    {
        "id": "6c9ef89f-d9b0-43c6-9aae-991022818dfc",
        "firstName": "Mario",
        "lastName": "Kirov",
        "phone": "+35987568783",
        "description": "Mario hairdressing studio",
        "address": "Sofia, bul. \"Asen Yordanov\" 1",
        "addedToFavourites": false
    },
    {
        "id": "6c9ef89f-d9b0-43c6-9aae-99102281rf4c",
        "firstName": "Ivan",
        "lastName": "Ivanov",
        "phone": "+35987568478",
        "description": "Ivan hairdressing studio",
        "address": "Sofia, bul. \"Bulgaria\" 11",
        "addedToFavourites": false
    }
]

Remove business from favourites

  • Delete request: /api/users/favourites/:id
    • Example: /api/users/favourites/6c9ef89f-d9b0-43c6-9aae-99102281884c
  • Response:
    • 200 Success
{
    "message": "Removed from favourites.",
    "status": "success"
}
- 400 Bad request
{
    "message": "Problem while removing from favourites.",
    "status": "failure"
}

Add to favourites

  • Post request: api/users/favourites
  • Body:
{
    "businessId": "6c9ef89f-d9b0-43c6-9aae-99102281884c"
}
  • Reponse:
    • 200 Success
{
    "message": "Added to favourites.",
    "status": "success"
}
- 400 Bad request
{
    "message": "Problem while adding to favourites.",
    "status": "failure"
}

Register

Requirements

  • the users should be able to register in the system likecustomers and business holders
  • the data should be validated

Design

  • Register as customer
    image

  • Register as business holder
    image

API endpoints

Register as customer

  • Post request: /api/users/register
  • Body:
{
    "firstName": "JavaScript",
    "lastName": "Developer",
    "password": "123QWE!@#",
    "email": "[email protected]",
    "phone": "0876359789"
}
  • Response
    200 Success
{
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjYxZjY1ZGVkZDA3MzRjY2FlM2U4Y2JjZCIsImVtYWlsIjoiZGV2QHNjaGVkdWxlci5jb20iLCJyb2xlcyI6W10sImlhdCI6MTY0MzUzNTg1MywiZXhwIjoxNjQzNTM5NDUzfQ.fchaX6Poxw3sZz9oKgrB3wb2ol9gfHn6s2aYB5fgmrM",
    "email": "[email protected]",
    "id": "61f65dedd0734ccae3e8cbcd"
}

400 Bad request

{
    "message": "User with the same email already exists",
    "status": "failure"
}

Register as business holder

  • Post request: /api/users/register?type=BusinessHolder
  • Body:
{
    "firstName": "Atanas",
    "lastName": "Vasilev",
    "password": "n.it2021#JSAdv@nced",
    "email": "[email protected]",
    "phone": "0876357845",
    "address": "Sofia, Bulgaria, street ...",
    "description": "One of the best hairdressers in the town!",
    "availability": [1, 2, 3, 4, 5]
}

TODO: discuss the availability

  • Reponse:
    200 Success:
{
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjYxZjY1ZjM1ZDA3MzRjY2FlM2U4Y2JkMiIsImVtYWlsIjoibmFza28uaXRAc2NoZWR1bGVyLmNvbSIsInJvbGVzIjpbIkJ1c2luZXNzIEhvbGRlciJdLCJpYXQiOjE2NDM1MzYxODEsImV4cCI6MTY0MzUzOTc4MX0.OaSlPItyW3kX-cHNIqt-nf3-G-WW1ZbGF5xmdAySKk8",
    "email": "[email protected]",
    "roles": [
        "Business Holder"
    ],
    "id": "61f65f35d0734ccae3e8cbd2"
}

400 Bad request

{
    "message": "User with the same email already exists",
    "status": "failure"
}

Favourites businsses page

Back-end: #19

Requirements

  • the users should be able to view their favourites businesses
  • the users should be able to remove businss from the favourites section

Design

https://www.figma.com/file/1vHREHkbka8hwyxDHRpcyx/Scheduler?node-id=1015%3A3658
image

API endpoints

Get favourite businesses

  • Get request: /api/users/favourites
  • Response:
[
    {
        "firstName": "Atanas",
        "lastName": "Vasilev",
        "company": {
            "businessType": {
                "name": "Tattoo",
                "imagePath": "public/images/business-types/tattoo.jpg",
                "id": "62055417ab89400c51fd7f12"
            },
            "description": "Some description comes here",
            "address": "Some address comes here",
            "id": null
        },
        "id": "61f65f35d0734ccae3e8cbd2"
    }
]

Remove business from favourites

  • Delete request: /api/users/favourites/:id
    • Example: /api/users/favourites/6c9ef89f-d9b0-43c6-9aae-99102281884c
  • Response:
    • 200 Success
{
    "message": "Removed from favourites.",
    "status": "success"
}
- 400 Bad request
{
    "message": "Problem while removing from favourites.",
    "status": "failure"
}

Update appointment

Requirements

  • The business holder should be able to update the user appointment
    • Update the appointment start
    • Update the appointment duration

API endpoints

  • Put request: appointments/621041dffc654878830b0932
  • Body:
{
    "start": "2022-01-19T17:00:00",
    "durationInMinutes": 60
}
  • Response
  • 200 Success
{
    "message": "The appointment was updated successfully.",
    "status": "success",
    "data": null
}
  • 400 Bad request - if you try to uodate another business holder appointment
{
    "message": "The appointment does not exist.",
    "status": "failure",
    "data": {}
}

Add business holder registration logic

Business schema should contain:

  • description (business description)
  • address (building address)
  • availability (array of days (Monday - 1, Sunday - 7)
  • working hours (map for days e.g. Monday 1pm-7pm)

Set business holder availability

Requirements

  • The business holder should be able to change their availability from their profiles

API endpoints

  • Post request: http://localhost:4000/api/users/profile/availability
  • Body:
{
    "availability": [
        {
            "day": 1,
            "startHour": 10,
            "startMinute": 0,
            "endHour": 19,
            "endMinute": 0
        },
        {
            "day": 2,
            "startHour": 9,
            "startMinute": 30,
            "endHour": 19,
            "endMinute": 30
        },
        {
            "day": 3,
            "startHour": 11,
            "startMinute": 30,
            "endHour": 20,
            "endMinute": 30
        },
        {
            "day": 4,
            "startHour": 9,
            "startMinute": 0,
            "endHour": 20,
            "endMinute": 0
        },
        {
            "day": 5,
            "startHour": 9,
            "startMinute": 0,
            "endHour": 14,
            "endMinute": 0
        }
    ]
}
  • Reponse
  • 200 Success
{
    "message": "The user availability is updated.",
    "status": "success",
    "data": null
}
  • 400 Bad request
{
    "message": "Start time cannot be less than or equal to end time",
    "status": "failure",
    "data": {}
}

Manage business products

Requirements

  • The business holders should be able to create, edit and delete products which they offer to their clients
  • The business holders should be able to see all of them producsts in the profile page
  • The page should be accessible only for business holders
  • All of the endpoints should be accessible for users in role 'Business holder'

API endpoints

Get user products

  • Get request: api/products - get all the user products
  • Response:
[
    {
        "name": "Gentleman hairstyle",
        "price": 25,
        "durationInMinutes": 30,
        "id": "62094c87e193dd9cf08a9f42"
    },
    {
        "name": "High-level manicure",
        "price": 25,
        "durationInMinutes": 30,
        "id": "62094bfae193dd9cf08a9f3b"
    }
]

Create product

  • Post request: api/products
  • Body
{
    "name": "Gentleman hairstyle",
    "durationInMinutes": 30
    "price": 25
}
  • Repsonse
  • 200 Success
{
    "message": "Product created successfully.",
    "status": "success",
    "data": {
        "name": "Gentleman hairstyle",
        "price": 25,
        "durationInMinutes": 30
        "businessOwner": "62094ad7067d0057c39da553",
        "id": "62094ed8e193dd9cf08a9f47"
    }
}
  • 400 Bad request
{
    "message": "Error while saving the product.",
    "status": "failure",
    "data": {}
}

Update product

  • Put request: api/products/:id
    • Example api/products/6208fe8a0f8742bc3a35f0a where 6208fe8a0f8742bc3a35f0a is the product id
  • Body
{
    "name": "Gentleman hairstyle - edited",
    "price": 33,
    "durationInMinutes": 30
}
  • Response
  • 200 Success
{
    "message": "The product were updated successfully.",
    "status": "success",
    "data": {}
}
  • 400 Bad request
{
    "message": "Error while updating the product",
    "status": "failure",
    "data": {}
}

Delete product

  • Delete request: api/products/:id where id is the product id. Example: http://localhost:4000/api/products/62055f84e558e7a0d557c13b
  • Response
  • 200 Success
{
    "message": "The product was deleted",
    "status": "success",
    "data": {}
}
  • Bad request
{
    "message": "Problem occur while deleting the product.",
    "status": "failure",
    "data": {}
}

Booked services page

Requirements

  • render all the users' upcomming appointment ordered by start ascending

Design

https://www.figma.com/file/1vHREHkbka8hwyxDHRpcyx/Scheduler?node-id=1011%3A5282
image

API requests

Get cutomer upcomming appointments

  • GET request: /api/appointments/upcoming
  • Response:
[
    {
        "createdOn": "2022-02-16T21:45:12.836Z",
        "businessHolder": {
            "firstName": "Atanas",
            "lastName": "Vasilev",
            "email": "[email protected]",
            "phone": "0876357845",
            "company": {
                "businessType": {
                    "name": "Tattoo",
                    "imagePath": "public/images/business-types/tattoo.jpg",
                    "id": "62055417ab89400c51fd7f12"
                },
                "description": "Business description comes here ...",
                "address": "Business address comes here ...",
                "id": null
            },
            "id": "61f65f35d0734ccae3e8cbd2"
        },
        "status": "Accepted",
        "start": "2022-02-17T18:30:00.000Z",
        "durationInMinutes": 55,
        "product": {
            "name": "Gentleman hairstyle",
            "price": 34,
            "id": "620af4ae04c7041ba09de80c"
        },
        "id": "620d7afcd426a4beea9680ac"
    },
    {
        "createdOn": "2022-02-16T21:45:12.836Z",
        "businessHolder": {
            "firstName": "Atanas",
            "lastName": "Vasilev",
            "email": "[email protected]",
            "phone": "0876357845",
            "company": {
                "businessType": {
                    "name": "Tattoo",
                    "imagePath": "public/images/business-types/tattoo.jpg",
                    "id": "62055417ab89400c51fd7f12"
                },
                "description": "Business description comes here ...",
                "address": "Business address comes here ...",
                "id": null
            },
            "id": "61f65f35d0734ccae3e8cbd2"
        },
        "status": "Pending",
        "start": "2022-02-18T10:15:00.000Z",
        "durationInMinutes": 40,
        "product": {
            "name": "Gentleman hairstyle",
            "price": 34,
            "id": "620af4ae04c7041ba09de80c"
        },
        "id": "620d7ac4d426a4beea96808e"
    }
]

Serve the business type images

  • Create folder public
  • Add all the business type images files there
  • The files should be accessible like static resources on the following url: public/images/business-types/hairdressing.jpg

Business details/Book appointment

Requirements

  • the users should be able to view details for each of the businesses
  • and also should be able to book appoinemnt for the choosen business by selecting available hour and specific service

Design

https://www.figma.com/file/1vHREHkbka8hwyxDHRpcyx/Scheduler?node-id=1011%3A5573
image

API endpoints

Get hairdresser details

  • Get request: /businesses/:id
    • Example: /businesses/61f65f35d0734ccae3e8cbd2
  • Response:
{
    "firstName": "Atanas",
    "lastName": "Vasilev",
    "phone": "0876357845",
    "description": "Business description comes here ...",
    "address": "Business address comes here ...",
    "id": "61f65f35d0734ccae3e8cbd2",
    "businessType": {
        "name": "Tattoo",
        "imagePath": "public/images/business-types/tattoo.jpg",
        "id": "62055417ab89400c51fd7f12"
    },
    "addedToFavourites": false
}

Get business products

  • Get requesst: ```/api/businesses/products/:businessId````
  • Example: /api/businesses/products/61f65f35d0734ccae3e8cbd2
  • Response:
[
    {
        "name": "Gentleman hairstyle",
        "price": 20,
        "durationInMinutes": 45,
        "id": "620af4ae04c7041ba09de80c"
    }
]

Get available hours by date

  • Get request: api/businesses/freeSlots/61f65f35d0734ccae3e8cbd2?date=2022-02-16
  • Response:
  • 200 Success
[
    {
        "start": {
            "hour": 11,
            "minute": 30
        },
        "end": {
            "hour": 16,
            "minute": 30
        }
    },
    {
        "start": {
            "hour": 17,
            "minute": 45
        },
        "end": {
            "hour": 20,
            "minute": 30
        }
    }
]
  • 400 Bad request
{
    "message": "The business is not working at the selected date.",
    "status": "failure",
    "data": {}
}

Book an appointment

  • Post request: api/appointments
  • Body:
{
    "businessHolder": "61f65f35d0734ccae3e8cbd2",
    "start": "2022-02-16T17:00",
    "durationInMinutes": 45,
    "product": "620af4ae04c7041ba09de80c"
}
  • Response
  • 200 Success
 {
    "message": "The appointment was created successfully",
    "status": "success",
    "data": {
        "createdOn": "2022-02-16T21:45:12.836Z",
        "client": "61f65f35d0734ccae3e8cbd2",
        "businessHolder": "61f65f35d0734ccae3e8cbd2",
        "status": "Pending",
        "start": "2022-02-16T15:00:00.000Z",
        "durationInMinutes": 45,
        "product": "620af4ae04c7041ba09de80c",
        "id": "620d7654d426a4beea96803a"
    }
}
  • 400 Bad request
 {
    "message": "The selected time slot is not free.",
    "status": "failure",
    "data": {}
}

Login

Requirements

  • the users should be able to login in the system with email and password
  • appropriate error message if the credentials are invalid

Design

image

API endpoints

Login

  • POST request: /api/users/login
  • Body:
{
    "password": "n.it2021#JSAdv@nced",
    "email": "[email protected]"
}
  • Response:
    200 Success:
{
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjYyMDk0YWQ3MDY3ZDAwNTdjMzlkYTU1MyIsImVtYWlsIjoibmV0aS5pdEBzY2hlZHVsZXIuY29tIiwicm9sZXMiOlsiQnVzaW5lc3MgSG9sZGVyIl0sImlhdCI6MTY0NDk0MzgwOCwiZXhwIjoxNjQ0OTQ3NDA4fQ.XtgNqaUpe_9aX2_urdYjGZKjbaLt0sKc-iBvG-h0fXM",
    "id": "62094ad7067d0057c39da553",
    "email": "[email protected]",
    "roles": [
        "Business Holder"
    ],
    "firstName": "Aneta",
    "lastName": "Tsvetkova",
    "phone": "0876357785"
}

400 Bad request:

{
    "message": "Invalid username or password.",
    "status": "failure"
}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.