Iron Stream REST API that powers the ui Iron Stream. This project uses the Go programming language along with the web framework Fiber.
Iron Stream is currently in beta and under active development.
To run this project locally, you will need: Go, Ffmpeg and Sqlite.
For install Go, you can download it from the Go website.
For Debian based systems, you can install Ffmpeg and Sqlite with the following commands:
sudo apt install ffmpeg sqlite3 -y
Clone the repository
git clone https://github.com/zustack/iron-stream.backend.git ~/
cd ~/iron-stream.backend
Create the directories for static files
mkdir web/uploads
cd web/uploads
mkdir files previews thumbnails tmp videos
For the environment variables, run this commands with the corresponding information.
export DB_DEV_PATH=/path/to/sqlite.db
export DB_TEST_PATH=/path/to/test_sqlite.db
export SECRET_KEY=someradomstring
export EMAIL_SECRET_KEY=emailsecret
export ROOT_PATH=/path/to/iron-stream.backend
Database
sqlite3 sqlite.db ".read tables.sql"
Then just execute:
make run
curl -X POST "http://localhost:8081/users/signup" \
-H "Content-Type: application/json" \
-d '{
"email": "agustfricke@gmail.com",
"name": "Agustin",
"surname": "Fricke",
"password": "some-password",
"pc": "agust@ubuntu",
"os": "Linux"
}'
This will send a confirmation email with a token used to verify the account in the endpoint verify
200 OK
curl -X POST "http://localhost:8081/users/login" \
-H "Content-Type: application/json" \
-d '{"email": "agustfricke@gmail.com", "password": "some-password", "pc": "agust@ubuntu"}'
{"exp":1727628111,"fullName":"Agustin Fricke","isAdmin":false,"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjc2MjgxMTEsImlhdCI6MTcyNTAzNjExMSwibmJmIjoxNzI1MDM2MTExLCJzdWIiOjF9.ZBCbxsEbMoQS5legRGu1QArw3vcZV0jjqJ_f0u9l-0I","userId":1}
curl -X POST "http://localhost:8081/users/verify" \
-H "Content-Type: application/json" \
-d '{"email": "agustfricke@gmail.com", "email_token": 902250}'
{"exp":1727627599,"fullName":"Agustin Fricke","isAdmin":false,"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjc2Mjc1OTksImlhdCI6MTcyNTAzNTU5OSwibmJmIjoxNzI1MDM1NTk5LCJzdWIiOjF9.dbpz5t6noMEW264uHL1AlbcOiVSrhbfiPvh9PwL1oSM","userId":1}
This will send a new email with a token and update email_token field to the user with the email provided.
curl -X POST "http://localhost:8081/users/resend/email/token/agustfricke@gmail.com"
200 OK
The user with the id 1 can't be deleted.
curl -X DELETE "http://localhost:8081/users/delete/account/by/email/agustfricke@protonmail.com"
200 OK
curl -X PUT "http://localhost:8081/users/update/password" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjc2MjgxMTEsImlhdCI6MTcyNTAzNjExMSwibmJmIjoxNzI1MDM2MTExLCJzdWIiOjF9.ZBCbxsEbMoQS5legRGu1QArw3vcZV0jjqJ_f0u9l-0I" \
-d '{"password": "new-password"}'
200 OK
This endpoint needs a valid admin token. The variables are:
- cursor: the cursor
- q: the search query
- a: the active status
- admin: the admin status
- special: the special apps status
- verified: the verified status
- from: from date example: 12/09/2024%00:00:00
- to: to date example: 12:09:2024%00:00:00
curl -X GET "http://localhost:8081/users/admin?cursor=0&q=&a=&admin=&special=&verified=&from=&to=" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjc2Mjg3NjQsImlhdCI6MTcyNTAzNjc2NCwibmJmIjoxNzI1MDM2NzY0LCJzdWIiOjF9.8ptujSrdymZ7z5GdQAydWsVn4fmkgVg8rPOW4L37dxU" | jq
{
"data": [
{
"id": 1,
"password": "$2a$10$OXFhJOHNkiLLc0EEmoasCOMH4FeXEqh4biody4Jo2K9WjDxTyfjMW",
"email": "agustfricke@gmail.com",
"name": "Agustin",
"surname": "Fricke",
"is_admin": true,
"special_apps": false,
"is_active": true,
"email_token": 615068,
"verified": true,
"pc": "agust@ubuntu",
"os": "Linux",
"created_at": "30/08/2024 13:33:03"
}
],
"totalCount": 1,
"previousId": null,
"nextId": null
}
This endpoint needs a valid admin token. The user with the id 1 can't be updated.
curl -X PUT "http://localhost:8081/users/update/active/status/3" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjc2Mjg3NjQsImlhdCI6MTcyNTAzNjc2NCwibmJmIjoxNzI1MDM2NzY0LCJzdWIiOjF9.8ptujSrdymZ7z5GdQAydWsVn4fmkgVg8rPOW4L37dxU"
200 OK
This endpoint needs a valid admin token. The user with the id 1 can't be updated.
curl -X PUT "http://localhost:8081/users/update/all/active/status/true" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjc2Mjg3NjQsImlhdCI6MTcyNTAzNjc2NCwibmJmIjoxNzI1MDM2NzY0LCJzdWIiOjF9.8ptujSrdymZ7z5GdQAydWsVn4fmkgVg8rPOW4L37dxU"
200 OK
This endpoint needs a valid admin token.
curl -X PUT "http://localhost:8081/users/update/special/apps/user/1/true" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjc2Mjg3NjQsImlhdCI6MTcyNTAzNjc2NCwibmJmIjoxNzI1MDM2NzY0LCJzdWIiOjF9.8ptujSrdymZ7z5GdQAydWsVn4fmkgVg8rPOW4L37dxU"
200 OK
This endpoint needs a valid admin token. The user with the id 1 can't be updated.
curl -X PUT "http://localhost:8081/users/update/admin/status/3/true" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjc2Mjg3NjQsImlhdCI6MTcyNTAzNjc2NCwibmJmIjoxNzI1MDM2NzY0LCJzdWIiOjF9.8ptujSrdymZ7z5GdQAydWsVn4fmkgVg8rPOW4L37dxU"
200 OK
curl -X GET "http://localhost:8081/users/current" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjg1NzM4NjIsImlhdCI6MTcyNTk4MTg2MiwibmJmIjoxNzI1OTgxODYyLCJzdWIiOjF9.g9MhXLOzQIoSMPmfey4XlJvbOdknNysLLNINgblVcGU" | jq
{
"created_at": "09/09/2024 16:46:56",
"email": "agustfricke@gmail.com",
"id": 1,
"name": "Agustin",
"surname": "Fricke"
}
curl -X POST http://localhost:8081/courses/chunk/upload \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjk0NDUxNzIsImlhdCI6MTcyNjg1MzE3MiwibmJmIjoxNzI2ODUzMTcyLCJzdWIiOjF9.rk1EW27xTcCXur3Vjh5_kYrGGtd-4D5_9e8icXz0ZaQ" \
-H "Content-Type: multipart/form-data" \
-F "chunkNumber=0" \
-F "totalChunks=1" \
-F "uuid=42069" \
-F "file=@/home/agust/Videos/test.mp4"
/home/agust/work/iron-stream/backend/web/uploads/tmp/42069/test.mp4
curl -X POST http://localhost:8081/courses/create \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjc4OTEyOTgsImlhdCI6MTcyNTI5OTI5OCwibmJmIjoxNzI1Mjk5Mjk4LCJzdWIiOjF9.uYzFWle0Apbk89vQ3azD8pe5yBghw8EAx_Jx_p_h884" \
-H "Content-Type: multipart/form-data" \
-F "title=Data Structures" \
-F "description=Description for Data Structures" \
-F "author=agustfricke" \
-F "duration=4 hours, 20 minutes" \
-F "is_active=true" \
-F "price=420" \
-F "thumbnail=@/home/agust/Pictures/test.png" \
-F "preview_tmp=/home/agust/work/iron-stream/backend/web/uploads/tmp/42069/test.mp4"
200 OK
curl -X PUT "http://localhost:8081/courses/update" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjc4OTEyOTgsImlhdCI6MTcyNTI5OTI5OCwibmJmIjoxNzI1Mjk5Mjk4LCJzdWIiOjF9.uYzFWle0Apbk89vQ3azD8pe5yBghw8EAx_Jx_p_h884" \
-H "Content-Type: multipart/form-data" \
-F "id=1" \
-F "title=Data Structures edit" \
-F "description=Description for Data Structures edit" \
-F "author=agustfricke edit" \
-F "duration=4 hours, 20 minutes edit" \
-F "is_active=true" \
-F "price=73" \
-F "thumbnail=" \
-F "old_thumbnail=/web/uploads/thumbnails/cd7af076-5f37-490c-bc34-998f4468b178.png" \
-F "preview_tmp=" \
-F "old_preview=/web/uploads/previews/511481d9-af34-40d7-8c1d-73ef42dfdb90/master.m3u8" \
200 OK
curl -X DELETE "http://localhost:8081/courses/delete/1" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjc3MTYzMjUsImlhdCI6MTcyNTEyNDMyNSwibmJmIjoxNzI1MTI0MzI1LCJzdWIiOjh9._j6dGt0wiBPizAn3dCYnr1NKAksUIi7SYQJ1xmoH_Fw"
204 No Content
curl "http://localhost:8081/courses/solo/1" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjc4OTEyOTgsImlhdCI6MTcyNTI5OTI5OCwibmJmIjoxNzI1Mjk5Mjk4LCJzdWIiOjF9.uYzFWle0Apbk89vQ3azD8pe5yBghw8EAx_Jx_p_h884" \ | jq
204 No Content
curl -X POST "http://localhost:8081/courses/sort" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjc3MTYzMjUsImlhdCI6MTcyNTEyNDMyNSwibmJmIjoxNzI1MTI0MzI1LCJzdWIiOjh9._j6dGt0wiBPizAn3dCYnr1NKAksUIi7SYQJ1xmoH_Fw" \
-H "Content-Type: application/json" \
-d '{
"sort_courses": [
{"id": 2, "sort_order": "8"},
{"id": 3, "sort_order": "7"},
{"id": 4, "sort_order": "6"},
{"id": 5, "sort_order": "5"}
]
}'
200 OK
curl -X PUT "http://localhost:8081/courses/update/active/5/true" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjc3MTYzMjUsImlhdCI6MTcyNTEyNDMyNSwibmJmIjoxNzI1MTI0MzI1LCJzdWIiOjh9._j6dGt0wiBPizAn3dCYnr1NKAksUIi7SYQJ1xmoH_Fw"
200 OK
This endpoint needs a valid admin token. The variables are:
- cursor: the cursor
- q: the search query
- a: the active status("": all, "1": active, "0": non-active)
curl -X GET "http://localhost:8081/courses/admin?cursor=0&q=&a=" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjc3MTYzMjUsImlhdCI6MTcyNTEyNDMyNSwibmJmIjoxNzI1MTI0MzI1LCJzdWIiOjh9._j6dGt0wiBPizAn3dCYnr1NKAksUIi7SYQJ1xmoH_Fw" | jq
[
{
"id": 2,
"title": "Data Structures",
"description": "Description for Data Structures",
"author": "agustfricke",
"thumbnail": "/web/uploads/thumbnails/ed73325d-9f37-4b94-b6f1-b98f258d4211.png",
"preview": "/home/agust/work/iron-stream/backend/web/uploads/previews/627e9d78-0698-4cf4-990c-afb0491276ed/master.m3u8",
"rating": 0,
"num_reviews": 0,
"duration": "4 hours, 20 minutes",
"is_active": true,
"sort_order": 8,
"created_at": "31/08/2024 15:53:24"
},
{
"id": 3,
"title": "new course",
"description": "some long ",
"author": "Created by me!",
"thumbnail": "/web/uploads/thumbnails/fcf3d710-808b-4604-bc5a-08ce422fd65a.png",
"preview": "/home/agust/work/iron-stream/backend/web/uploads/previews/1d88fd82-bc15-4cd1-8423-c4c79172c070/master.m3u8",
"rating": 0,
"num_reviews": 0,
"duration": "lalala",
"is_active": true,
"sort_order": 7,
"created_at": "31/08/2024 15:55:49"
},
{
"id": 7,
"title": "some dsa",
"description": "some dsa",
"author": "some dsa",
"thumbnail": "/web/uploads/thumbnails/f08b6aad-d407-4402-8912-3a9025a13ea0.png",
"preview": "/web/uploads/previews/b2927bed-767e-47f8-b4af-9acca1ace537/master.m3u8",
"rating": 0,
"num_reviews": 0,
"duration": "hello",
"is_active": true,
"sort_order": 7,
"created_at": "31/08/2024 16:09:44"
},
{
"id": 4,
"title": "foo",
"description": "soso",
"author": "Created by ",
"thumbnail": "/web/uploads/thumbnails/c29bff9a-d440-40ff-b513-07bb8030e91e.png",
"preview": "/web/uploads/previews/65b1e13b-0ab7-4f9b-aa07-12beb2febaa8/master.m3u8",
"rating": 0,
"num_reviews": 0,
"duration": "sosoo",
"is_active": false,
"sort_order": 6,
"created_at": "31/08/2024 15:57:44"
},
{
"id": 6,
"title": "test",
"description": "test",
"author": "Created by ",
"thumbnail": "/web/uploads/thumbnails/d7af27d6-5936-451a-a185-84320f55781b.jpg",
"preview": "/web/uploads/previews/ea6a32ae-14cd-4065-be6d-2dd9a1069c90/master.m3u8",
"rating": 0,
"num_reviews": 0,
"duration": "sd",
"is_active": true,
"sort_order": 6,
"created_at": "31/08/2024 16:05:13"
},
{
"id": 5,
"title": "some",
"description": "somsom",
"author": "Created by ",
"thumbnail": "/web/uploads/thumbnails/24129485-951b-480d-90fb-3f5aae5b799c.png",
"preview": "/web/uploads/previews/e2a97d9a-db66-49cb-9fda-7c07ae0e67e5/master.m3u8",
"rating": 0,
"num_reviews": 0,
"duration": "somso",
"is_active": true,
"sort_order": 5,
"created_at": "31/08/2024 16:02:10"
}
]
curl -X POST "http://localhost:8081/user/courses/8/6" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjc3MTYzMjUsImlhdCI6MTcyNTEyNDMyNSwibmJmIjoxNzI1MTI0MzI1LCJzdWIiOjh9._j6dGt0wiBPizAn3dCYnr1NKAksUIi7SYQJ1xmoH_Fw"
200 OK
curl -X GET "http://localhost:8081/user/courses?q=" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjc3MTYzMjUsImlhdCI6MTcyNTEyNDMyNSwibmJmIjoxNzI1MTI0MzI1LCJzdWIiOjh9._j6dGt0wiBPizAn3dCYnr1NKAksUIi7SYQJ1xmoH_Fw" | jq
[
{
"id": 2,
"title": "Data Structures",
"description": "Description for Data Structures",
"author": "agustfricke",
"thumbnail": "/web/uploads/thumbnails/ed73325d-9f37-4b94-b6f1-b98f258d4211.png",
"preview": "/home/agust/work/iron-stream/backend/web/uploads/previews/627e9d78-0698-4cf4-990c-afb0491276ed/master.m3u8",
"rating": 0,
"num_reviews": 0,
"duration": "4 hours, 20 minutes",
"is_active": true,
"sort_order": 8,
"created_at": "31/08/2024 15:53:24",
"is_user_enrolled": false
},
{
"id": 3,
"title": "new course",
"description": "some long ",
"author": "Created by me!",
"thumbnail": "/web/uploads/thumbnails/fcf3d710-808b-4604-bc5a-08ce422fd65a.png",
"preview": "/home/agust/work/iron-stream/backend/web/uploads/previews/1d88fd82-bc15-4cd1-8423-c4c79172c070/master.m3u8",
"rating": 0,
"num_reviews": 0,
"duration": "lalala",
"is_active": true,
"sort_order": 7,
"created_at": "31/08/2024 15:55:49",
"is_user_enrolled": false
},
{
"id": 4,
"title": "foo",
"description": "soso",
"author": "Created by ",
"thumbnail": "/web/uploads/thumbnails/c29bff9a-d440-40ff-b513-07bb8030e91e.png",
"preview": "/web/uploads/previews/65b1e13b-0ab7-4f9b-aa07-12beb2febaa8/master.m3u8",
"rating": 0,
"num_reviews": 0,
"duration": "sosoo",
"is_active": false,
"sort_order": 6,
"created_at": "31/08/2024 15:57:44",
"is_user_enrolled": false
},
{
"id": 5,
"title": "some",
"description": "somsom",
"author": "Created by ",
"thumbnail": "/web/uploads/thumbnails/24129485-951b-480d-90fb-3f5aae5b799c.png",
"preview": "/web/uploads/previews/e2a97d9a-db66-49cb-9fda-7c07ae0e67e5/master.m3u8",
"rating": 0,
"num_reviews": 0,
"duration": "somso",
"is_active": true,
"sort_order": 5,
"created_at": "31/08/2024 16:02:10",
"is_user_enrolled": false
},
{
"id": 6,
"title": "test",
"description": "test",
"author": "Created by ",
"thumbnail": "/web/uploads/thumbnails/d7af27d6-5936-451a-a185-84320f55781b.jpg",
"preview": "/web/uploads/previews/ea6a32ae-14cd-4065-be6d-2dd9a1069c90/master.m3u8",
"rating": 0,
"num_reviews": 0,
"duration": "sd",
"is_active": true,
"sort_order": 6,
"created_at": "31/08/2024 16:05:13",
"is_user_enrolled": false
},
{
"id": 7,
"title": "some dsa",
"description": "some dsa",
"author": "some dsa",
"thumbnail": "/web/uploads/thumbnails/f08b6aad-d407-4402-8912-3a9025a13ea0.png",
"preview": "/web/uploads/previews/b2927bed-767e-47f8-b4af-9acca1ace537/master.m3u8",
"rating": 0,
"num_reviews": 0,
"duration": "hello",
"is_active": true,
"sort_order": 7,
"created_at": "31/08/2024 16:09:44",
"is_user_enrolled": false
}
]
This will delete all the user_courses
curl -X DELETE "http://localhost:8081/user/courses/all" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjc3MTYzMjUsImlhdCI6MTcyNTEyNDMyNSwibmJmIjoxNzI1MTI0MzI1LCJzdWIiOjh9._j6dGt0wiBPizAn3dCYnr1NKAksUIi7SYQJ1xmoH_Fw"
200 OK
This will "deactivate" the specific course to all the users.
curl -X DELETE "http://localhost:8081/user/courses/solo/7" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjc3MTYzMjUsImlhdCI6MTcyNTEyNDMyNSwibmJmIjoxNzI1MTI0MzI1LCJzdWIiOjh9._j6dGt0wiBPizAn3dCYnr1NKAksUIi7SYQJ1xmoH_Fw"
200 OK
This will "deactivate" the specific course to the specific user.
curl -X DELETE "http://localhost:8081/user/courses/solo/8/7" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjc3MTYzMjUsImlhdCI6MTcyNTEyNDMyNSwibmJmIjoxNzI1MTI0MzI1LCJzdWIiOjh9._j6dGt0wiBPizAn3dCYnr1NKAksUIi7SYQJ1xmoH_Fw"
200 OK
curl -X POST http://localhost:8081/videos \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjc4OTEyOTgsImlhdCI6MTcyNTI5OTI5OCwibmJmIjoxNzI1Mjk5Mjk4LCJzdWIiOjF9.uYzFWle0Apbk89vQ3azD8pe5yBghw8EAx_Jx_p_h884" \
-H "Content-Type: multipart/form-data" \
-F "title=Data Structures 420" \
-F "description=Description for Data Structures 420" \
-F "course_id=1" \
-F "duration=4 hours, 20 minutes" \
-F "thumbnail=@/home/agust/Pictures/test.png" \
-F "video_tmp=/home/agust/work/iron-stream/backend/web/uploads/tmp/test.mp4"
200 OK
curl -X GET "http://localhost:8081/videos/admin/1?q=" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjc4OTEyOTgsImlhdCI6MTcyNTI5OTI5OCwibmJmIjoxNzI1Mjk5Mjk4LCJzdWIiOjF9.uYzFWle0Apbk89vQ3azD8pe5yBghw8EAx_Jx_p_h884" | jq
[
{
"id": 2,
"title": "Data Structures 420",
"description": "Description for Data Structures 420",
"video_hls": "/web/uploads/previews/f059bce1-a9bc-479c-a738-f1d87ec63618/master.m3u8",
"thumbnail": "/web/uploads/thumbnails/0c364957-c0d9-4451-93e9-53e95c06897d.png",
"length": "119",
"duration": "4 hours, 20 minutes",
"views": 0,
"course_id": "1",
"created_at": "02/09/2024 14:54:44",
"video_resume": ""
}
]
curl -X GET "http://localhost:8081/videos/feed/1?q=" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjc4OTEyOTgsImlhdCI6MTcyNTI5OTI5OCwibmJmIjoxNzI1Mjk5Mjk4LCJzdWIiOjF9.uYzFWle0Apbk89vQ3azD8pe5yBghw8EAx_Jx_p_h884"
[
{
"id": 2,
"title": "Data Structures 420",
"description": "Description for Data Structures 420",
"video_hls": "/web/uploads/previews/f059bce1-a9bc-479c-a738-f1d87ec63618/master.m3u8",
"thumbnail": "/web/uploads/thumbnails/0c364957-c0d9-4451-93e9-53e95c06897d.png",
"length": "119",
"duration": "4 hours, 20 minutes",
"views": 0,
"course_id": "1",
"created_at": "",
"video_resume": ""
}
]
curl -X DELETE "http://localhost:8081/videos/1" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjc4OTEyOTgsImlhdCI6MTcyNTI5OTI5OCwibmJmIjoxNzI1Mjk5Mjk4LCJzdWIiOjF9.uYzFWle0Apbk89vQ3azD8pe5yBghw8EAx_Jx_p_h884"
204 No Content
curl -X PUT http://localhost:8081/videos \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjc4OTEyOTgsImlhdCI6MTcyNTI5OTI5OCwibmJmIjoxNzI1Mjk5Mjk4LCJzdWIiOjF9.uYzFWle0Apbk89vQ3azD8pe5yBghw8EAx_Jx_p_h884" \
-H "Content-Type: multipart/form-data" \
-F "title=edit edit Data Structures" \
-F "description=edit edit Description for Data Structures" \
-F "id=4" \
-F "duration=edit edit 420" \
-F "thumbnail=@/home/agust/Pictures/test.png" \
-F "old_thumbnail=/web/uploads/thumbnails/b62d3919-0864-454c-bee3-e7c959c5b0a3.png" \
-F "old_video_hls=/web/uploads/videos/1/5b0f2475-6d88-4a75-bab1-284bdd375d29/master.m3u8" \
-F "video_tmp=/home/agust/work/iron-stream/backend/web/uploads/tmp/test.mp4"
200 OK
curl -X GET "http://localhost:8081/history/current/3" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjc4OTEyOTgsImlhdCI6MTcyNTI5OTI5OCwibmJmIjoxNzI1Mjk5Mjk4LCJzdWIiOjF9.uYzFWle0Apbk89vQ3azD8pe5yBghw8EAx_Jx_p_h884" | jq
{
"history_id": "",
"resume": "",
"video": {
"id": 2,
"title": "Data Structures 420",
"description": "Description for Data Structures 420",
"video_hls": "/web/uploads/previews/f059bce1-a9bc-479c-a738-f1d87ec63618/master.m3u8",
"thumbnail": "/web/uploads/thumbnails/0c364957-c0d9-4451-93e9-53e95c06897d.png",
"length": "4 hours, 20 minutes",
"duration": "119",
"views": 0,
"course_id": "1",
"created_at": "02/09/2024 14:54:44",
"video_resume": ""
}
}
curl -X PUT "http://localhost:8081/history/watch" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjc4OTEyOTgsImlhdCI6MTcyNTI5OTI5OCwibmJmIjoxNzI1Mjk5Mjk4LCJzdWIiOjF9.uYzFWle0Apbk89vQ3azD8pe5yBghw8EAx_Jx_p_h884" \
-d '{"history_id": "21", "video_id": 7, "course_id": "3", "resume": "69", "current_video_id": 7}'
{"id":22,"video_id":"","course_id":0,"user_id":0,"video_resume":"187.68","created_at":""}%
curl -X PUT "http://localhost:8081/videos/s_review/1/true" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjk0NTE0NTEsImlhdCI6MTcyNjg1OTQ1MSwibmJmIjoxNzI2ODU5NDUxLCJzdWIiOjF9.2aEv4OLcMfGzw7OBflhJSfYHlYIG_mrvn8-CtGQ3kJg"
$2a$10$8x1FC1wLZ2O.tzM86VEVs.w/B9uhKZrgoiEu0oPJ9mBwcF/kreL1i
200 OK
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjk0NTE0NTEsImlhdCI6MTcyNjg1OTQ1MSwibmJmIjoxNzI2ODU5NDUxLCJzdWIiOjF9.2aEv4OLcMfGzw7OBflhJSfYHlYIG_mrvn8-CtGQ3kJg
{"exp":1729451451,"fullName":"Agustin Fricke","isAdmin":true,"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjk0NTE0NTEsImlhdCI6MTcyNjg1OTQ1MSwibmJmIjoxNzI2ODU5NDUxLCJzdWIiOjF9.2aEv4OLcMfGzw7OBflhJSfYHlYIG_mrvn8-CtGQ3kJg","userId":1}%
curl -X POST "http://localhost:8081/users/login"
-H "Content-Type: application/json"
-d '{"email": "agustfricke@gmail.com", "password": "lincon05", "pc": "c48365f10b774834ae71853729371ac8"}'
curl -X GET "http://localhost:8081/history" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjg1NzM4NjIsImlhdCI6MTcyNTk4MTg2MiwibmJmIjoxNzI1OTgxODYyLCJzdWIiOjF9.g9MhXLOzQIoSMPmfey4XlJvbOdknNysLLNINgblVcGU" | jq
[
{
"history_id": 1,
"video_id": 1,
"course_id": 1,
"user_id": 1,
"video_resume": "120.8820645161291",
"history_date": "10/09/2024 15:36:42",
"video_title": "video 1",
"description": "some long ass",
"video_hls": "/web/uploads/videos/1/8e0a486f-ba98-4847-92e1-cb677d40bb8d/master.m3u8",
"thumbnail": "/web/uploads/thumbnails/dd046c69-07b3-4192-a756-0a1bfd5edf11.png",
"duration": "4",
"length": "187",
"views": 3,
"video_created": "10/09/2024 15:35:33"
},
{
"history_id": 2,
"video_id": 2,
"course_id": 1,
"user_id": 1,
"video_resume": "",
"history_date": "10/09/2024 15:38:18",
"video_title": "2222",
"description": "sdsdsd",
"video_hls": "/web/uploads/videos/1/fed969d9-bc0a-445f-a327-6c76fa6a0c62/master.m3u8",
"thumbnail": "/web/uploads/thumbnails/3416c96d-6dd1-4673-9ea6-5e4c3950dd6e.png",
"duration": "ddf",
"length": "119",
"views": 1,
"video_created": "10/09/2024 15:36:28"
}
]
curl -X PUT "http://localhost:8081/history/update" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjc4OTEyOTgsImlhdCI6MTcyNTI5OTI5OCwibmJmIjoxNzI1Mjk5Mjk4LCJzdWIiOjF9.uYzFWle0Apbk89vQ3azD8pe5yBghw8EAx_Jx_p_h884" \
-d '{"id": "23", "resume": "6969"}'
200 OK
curl -X POST "http://localhost:8081/apps/create" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjc5NzMwNDAsImlhdCI6MTcyNTM4MTA0MCwibmJmIjoxNzI1MzgxMDQwLCJzdWIiOjF9.e4RGUkZS75k8KkCNpczLhtl7mCtpMBz0EVXWH2fdZSM" \
-d '{"name": "OBS", "process_name": "obs", "is_active": true, "execute_always": true}'
200 OK
curl -X DELETE "http://localhost:8081/apps/delete/6" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjc5NzMwNDAsImlhdCI6MTcyNTM4MTA0MCwibmJmIjoxNzI1MzgxMDQwLCJzdWIiOjF9.e4RGUkZS75k8KkCNpczLhtl7mCtpMBz0EVXWH2fdZSM"
204 No Content
curl -X PUT "http://localhost:8081/apps/update" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjc5NzMwNDAsImlhdCI6MTcyNTM4MTA0MCwibmJmIjoxNzI1MzgxMDQwLCJzdWIiOjF9.e4RGUkZS75k8KkCNpczLhtl7mCtpMBz0EVXWH2fdZSM" \
-d '{"id": 6, "name": "obs", "process_name": "obs", "is_active": true, "execute_always": true}'
200 OK
curl -X GET "http://localhost:8081/apps/admin?q=&a=" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjc5NzMwNDAsImlhdCI6MTcyNTM4MTA0MCwibmJmIjoxNzI1MzgxMDQwLCJzdWIiOjF9.e4RGUkZS75k8KkCNpczLhtl7mCtpMBz0EVXWH2fdZSM" | jq
[
{
"id": 4,
"name": "OBS",
"process_name": "obs.app",
"is_active": true,
"execute_always": false,
"created_at": "03/09/2024 14:24:22"
},
{
"id": 1,
"name": "FireFox",
"process_name": "firefox.app",
"is_active": true,
"execute_always": false,
"created_at": "03/09/2024 13:31:09"
}
]
curl -X GET "http://localhost:8081/apps/forbidden" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjc5NzMwNDAsImlhdCI6MTcyNTM4MTA0MCwibmJmIjoxNzI1MzgxMDQwLCJzdWIiOjF9.e4RGUkZS75k8KkCNpczLhtl7mCtpMBz0EVXWH2fdZSM" | jq
[
{
"id": 0,
"name": "FireFox",
"process_name": "firefox.app",
"is_active": false,
"execute_always": false,
"created_at": ""
},
{
"id": 0,
"name": "OBS",
"process_name": "obs.app",
"is_active": false,
"execute_always": false,
"created_at": ""
}
]
curl -X PUT "http://localhost:8081/apps/update/status/5/false" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjc5NzMwNDAsImlhdCI6MTcyNTM4MTA0MCwibmJmIjoxNzI1MzgxMDQwLCJzdWIiOjF9.e4RGUkZS75k8KkCNpczLhtl7mCtpMBz0EVXWH2fdZSM"
200 OK
curl -X PUT "http://localhost:8081/apps/update/ea/7/false" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjc5NzMwNDAsImlhdCI6MTcyNTM4MTA0MCwibmJmIjoxNzI1MzgxMDQwLCJzdWIiOjF9.e4RGUkZS75k8KkCNpczLhtl7mCtpMBz0EVXWH2fdZSM"
200 OK
curl -X POST "http://localhost:8081/user/apps/create/1/5" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjc5NzMwNDAsImlhdCI6MTcyNTM4MTA0MCwibmJmIjoxNzI1MzgxMDQwLCJzdWIiOjF9.e4RGUkZS75k8KkCNpczLhtl7mCtpMBz0EVXWH2fdZSM"
curl -X GET "http://localhost:8081/user/apps/user/apps/1" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjc5NzMwNDAsImlhdCI6MTcyNTM4MTA0MCwibmJmIjoxNzI1MzgxMDQwLCJzdWIiOjF9.e4RGUkZS75k8KkCNpczLhtl7mCtpMBz0EVXWH2fdZSM" | jq
[
{
"id": 1,
"name": "FireFox",
"process_name": "firefox.app",
"is_active": false,
"execute_always": false,
"created_at": "",
"is_user_enrolled": false
},
{
"id": 4,
"name": "OBS",
"process_name": "obs.app",
"is_active": false,
"execute_always": false,
"created_at": "",
"is_user_enrolled": false
},
{
"id": 5,
"name": "ZSH",
"process_name": "zsh.app",
"is_active": false,
"execute_always": false,
"created_at": "",
"is_user_enrolled": true
}
]
curl -X DELETE "http://localhost:8081/user/apps/delete/user/apps/1/5" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjc5NzMwNDAsImlhdCI6MTcyNTM4MTA0MCwibmJmIjoxNzI1MzgxMDQwLCJzdWIiOjF9.e4RGUkZS75k8KkCNpczLhtl7mCtpMBz0EVXWH2fdZSM"
204 No Content
curl -X POST http://localhost:8081/files \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MjgwMDEzNzIsImlhdCI6MTcyNTQwOTM3MiwibmJmIjoxNzI1NDA5MzcyLCJzdWIiOjF9.sjhoW7xJcSsBcC4XqVYDyqGyas74OGwLz7dPobmmIjc" \
-H "Content-Type: multipart/form-data" \
-F "videoID=1" \
-F "page=1" \
-F "path=@/home/agust/Pictures/test.png"
200 OK
curl -X GET "http://localhost:8081/files/2/1" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MjgwMDQ5NTMsImlhdCI6MTcyNTQxMjk1MywibmJmIjoxNzI1NDEyOTUzLCJzdWIiOjF9._VLiflVTJ5tTP2Li0l0XE7TPFfqONkB341m6F_XFgOk" | jq
{
"files": [
{
"id": 1,
"path": "/web/uploads/files/43fb91b7-ecd6-4e0e-a43a-7ff0c55753a7.svg",
"video_id": "2",
"page": "1",
"created_at": "03/09/2024 22:13:59"
},
{
"id": 2,
"path": "/web/uploads/files/4ff3de3f-a344-4bd5-ad55-9fabd992b0d4.svg",
"video_id": "2",
"page": "1",
"created_at": "03/09/2024 22:27:57"
},
{
"id": 3,
"path": "/web/uploads/files/2d883b7d-cae3-4e74-9aa8-5267725d55a1.svg",
"video_id": "2",
"page": "1",
"created_at": "03/09/2024 22:28:20"
}
],
"pageCount": 1
}
curl -X DELETE "http://localhost:8081/files/1" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjc5NzMwNDAsImlhdCI6MTcyNTM4MTA0MCwibmJmIjoxNzI1MzgxMDQwLCJzdWIiOjF9.e4RGUkZS75k8KkCNpczLhtl7mCtpMBz0EVXWH2fdZSM" | jq
204 No Content
curl -X POST "http://localhost:8081/reviews" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MjgwNTU1NzksImlhdCI6MTcyNTQ2MzU3OSwibmJmIjoxNzI1NDYzNTc5LCJzdWIiOjF9.E0Q8S1gl7Ka560mM-8mSE0sepJQZHhbXIry9Qc7JMHA" \
-d '{
"course_id": "2",
"description": "I like this course v2",
"rating": 4.3
}'
200 OK
curl -X GET "http://localhost:8081/reviews/admin?q=&p=" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MjgwMDQ5NTMsImlhdCI6MTcyNTQxMjk1MywibmJmIjoxNzI1NDEyOTUzLCJzdWIiOjF9._VLiflVTJ5tTP2Li0l0XE7TPFfqONkB341m6F_XFgOk" | jq
[
{
"id": 2,
"course_id": 2,
"user_id": 1,
"author": "Agustin Fricke",
"description": "I like this course v2",
"rating": 4.3,
"public": false,
"course_title": "Data Structures",
"created_at": "04/09/2024 12:30:44"
}
]
curl -X GET "http://localhost:8081/reviews/public/1" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MjgwMDQ5NTMsImlhdCI6MTcyNTQxMjk1MywibmJmIjoxNzI1NDEyOTUzLCJzdWIiOjF9._VLiflVTJ5tTP2Li0l0XE7TPFfqONkB341m6F_XFgOk" | jq
[
{
"id": 2,
"course_id": 2,
"user_id": 1,
"author": "Agustin Fricke",
"description": "I like this course v2",
"rating": 4.3,
"public": true,
"course_title": "Data Structures",
"created_at": "04/09/2024 12:30:44"
}
]
curl -X PUT "http://localhost:8081/reviews/update/public/1/1" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MjgwMDQ5NTMsImlhdCI6MTcyNTQxMjk1MywibmJmIjoxNzI1NDEyOTUzLCJzdWIiOjF9._VLiflVTJ5tTP2Li0l0XE7TPFfqONkB341m6F_XFgOk"
200 OK
curl -X DELETE "http://localhost:8081/reviews/1" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MjgwMDQ5NTMsImlhdCI6MTcyNTQxMjk1MywibmJmIjoxNzI1NDEyOTUzLCJzdWIiOjF9._VLiflVTJ5tTP2Li0l0XE7TPFfqONkB341m6F_XFgOk"
204 No Content
curl -X POST "http://localhost:8081/notes/2" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MjgwNTU1NzksImlhdCI6MTcyNTQ2MzU3OSwibmJmIjoxNzI1NDYzNTc5LCJzdWIiOjF9.E0Q8S1gl7Ka560mM-8mSE0sepJQZHhbXIry9Qc7JMHA" \
-d '{
"body": "Note for some video",
"video_title": "The video title",
"time": "420.69"
}'
200 OK
curl -X GET "http://localhost:8081/notes/1" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MjgwMDQ5NTMsImlhdCI6MTcyNTQxMjk1MywibmJmIjoxNzI1NDEyOTUzLCJzdWIiOjF9._VLiflVTJ5tTP2Li0l0XE7TPFfqONkB341m6F_XFgOk" | jq
[
{
"id": 1,
"body": "Note for some video",
"video_title": "The video title",
"time": "420.69",
"course_id": "1",
"user_id": 1
}
]
curl -X PUT "http://localhost:8081/notes/1" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MjgwNTU1NzksImlhdCI6MTcyNTQ2MzU3OSwibmJmIjoxNzI1NDYzNTc5LCJzdWIiOjF9.E0Q8S1gl7Ka560mM-8mSE0sepJQZHhbXIry9Qc7JMHA" \
-d '{
"body": "edit Note for some video"
}'
200 OK
curl -X DELETE "http://localhost:8081/notes/1" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MjgwMDQ5NTMsImlhdCI6MTcyNTQxMjk1MywibmJmIjoxNzI1NDEyOTUzLCJzdWIiOjF9._VLiflVTJ5tTP2Li0l0XE7TPFfqONkB341m6F_XFgOk"
204 No Content
curl -X GET "http://localhost:8081/notifications" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MjgwMDQ5NTMsImlhdCI6MTcyNTQxMjk1MywibmJmIjoxNzI1NDEyOTUzLCJzdWIiOjF9._VLiflVTJ5tTP2Li0l0XE7TPFfqONkB341m6F_XFgOk" | jq
curl -X POST "http://localhost:8081/policy" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjg1MDMyNDksImlhdCI6MTcyNTkxMTI0OSwibmJmIjoxNzI1OTExMjQ5LCJzdWIiOjF9.0nxdOjcn6yyxLzkVwsF0sLKP3FiXfZQaTFd7QPnJ7mk" \
-d '{
"content": "La actual **Política** de Privacidad establece los límites y parámetros que Carolina Fricke emplea para el uso y protección del conjunto de datos de carácter personal proporcionados por los usuarios de “https://www.carofricke.com”, comprometida en la seguridad de todos ellos, para evitar su uso indebido.",
"p_type": "text"
}'
200 OK
curl -X GET "http://localhost:8081/policy" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjg1MDMyNDksImlhdCI6MTcyNTkxMTI0OSwibmJmIjoxNzI1OTExMjQ5LCJzdWIiOjF9.0nxdOjcn6yyxLzkVwsF0sLKP3FiXfZQaTFd7QPnJ7mk" | jq
[
{
"id": 1,
"content": "Información básica sobre protección de datos.",
"p_type": "li",
"created_at": "09/09/2024 16:47:54"
}
]
curl -X DELETE "http://localhost:8081/policy/1" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjg1MDMyNDksImlhdCI6MTcyNTkxMTI0OSwibmJmIjoxNzI1OTExMjQ5LCJzdWIiOjF9.0nxdOjcn6yyxLzkVwsF0sLKP3FiXfZQaTFd7QPnJ7mk"
204 No Content
curl -X POST "http://localhost:8081/log/user/logout" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjg2NzU0NDQsImlhdCI6MTcyNjA4MzQ0NCwibmJmIjoxNzI2MDgzNDQ0LCJzdWIiOjF9.UoA5afV7b4blotaaFfcyKnojjVMWupBRzAwF08dBPbM"
200 OK
- This is created at login
curl -X GET "http://localhost:8081/log/user/1" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjg2NzU0NDQsImlhdCI6MTcyNjA4MzQ0NCwibmJmIjoxNzI2MDgzNDQ0LCJzdWIiOjF9.UoA5afV7b4blotaaFfcyKnojjVMWupBRzAwF08dBPbM" | jq
[
{
"id": 5,
"content": "The user has logged in.",
"l_type": "1",
"user_id": 1,
"created_at": "11/09/2024 16:42:40"
},
{
"id": 6,
"content": "The user has logged out.",
"l_type": "1",
"user_id": 1,
"created_at": "11/09/2024 16:42:47"
},
{
"id": 7,
"content": "The app OBS was open while watching the video Data structures.",
"l_type": "3",
"user_id": 1,
"created_at": "11/09/2024 16:42:57"
},
{
"id": 8,
"content": "The apps OBS, Google Chrome where open while watching the video Data structures.",
"l_type": "3",
"user_id": 1,
"created_at": "11/09/2024 16:43:16"
}
]
curl -X POST "http://localhost:8081/log/user/found/apps" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjg2NzU0NDQsImlhdCI6MTcyNjA4MzQ0NCwibmJmIjoxNzI2MDgzNDQ0LCJzdWIiOjF9.UoA5afV7b4blotaaFfcyKnojjVMWupBRzAwF08dBPbM" \
-d '{
"video_title": "Data structures",
"apps": [
{ "name": "OBS" },
{ "name": "Google Chrome" }
]
}'
200 OK
curl -X POST "http://localhost:8081/log/admin" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjg2NzU0NDQsImlhdCI6MTcyNjA4MzQ0NCwibmJmIjoxNzI2MDgzNDQ0LCJzdWIiOjF9.UoA5afV7b4blotaaFfcyKnojjVMWupBRzAwF08dBPbM" \
-d '{
"content": "The user pepe@gmail.com was deleted.",
"l_type": "3"
}'
204 No Content
curl -X GET "http://localhost:8081/log/admin" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjg2NzU0NDQsImlhdCI6MTcyNjA4MzQ0NCwibmJmIjoxNzI2MDgzNDQ0LCJzdWIiOjF9.UoA5afV7b4blotaaFfcyKnojjVMWupBRzAwF08dBPbM" | jq
[
{
"id": 1,
"content": "The user pepe@gmail.com was deleted.",
"l_type": "3",
"created_at": "12/09/2024 15:46:03"
}
]
- Get basic data from September 2024
curl -X GET "http://localhost:8081/users/stats?from=2024-09-09&to=2024-09-16" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjg2NzU0NDQsImlhdCI6MTcyNjA4MzQ0NCwibmJmIjoxNzI2MDgzNDQ0LCJzdWIiOjF9.UoA5afV7b4blotaaFfcyKnojjVMWupBRzAwF08dBPbM" | jq
[
{
"date": "2024/09/09",
"windows": 0,
"mac": 0,
"linux": 1,
"all": 1
},
{
"date": "2024/09/10",
"windows": 0,
"mac": 0,
"linux": 0,
"all": 0
},
{
"date": "2024/09/11",
"windows": 0,
"mac": 0,
"linux": 0,
"all": 0
},
{
"date": "2024/09/12",
"windows": 0,
"mac": 0,
"linux": 0,
"all": 0
},
{
"date": "2024/09/13",
"windows": 0,
"mac": 0,
"linux": 0,
"all": 0
},
{
"date": "2024/09/14",
"windows": 0,
"mac": 0,
"linux": 0,
"all": 0
},
{
"date": "2024/09/15",
"windows": 0,
"mac": 0,
"linux": 0,
"all": 0
},
{
"date": "2024/09/16",
"windows": 0,
"mac": 0,
"linux": 1,
"all": 1
}
]
curl -X GET "http://localhost:8081/courses/stats?from=19/09/2024&to=19/09/2024" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mjg2NzU0NDQsImlhdCI6MTcyNjA4MzQ0NCwibmJmIjoxNzI2MDgzNDQ0LCJzdWIiOjF9.UoA5afV7b4blotaaFfcyKnojjVMWupBRzAwF08dBPbM" | jq
[
{
"Title": "new course",
"Profit": 138
}
]
go test ./internal/database/users_test.go -v
go test ./api/inputs/users_test.go -v
go test ./api/handlers/users_test.go -v
make test
cwebp image.jpg -o image.webp
cwebp some-png.png -o image-png.webp
cwebp -q 50 imagen.jpg -o imagen.webp
du -h *
If you want to run the tests before deploying, you can execute:
make test
Edit in cmd/main.go
to set the port to 80.
package main
import (
"iron-stream/api"
"iron-stream/internal/database"
"log"
)
func main() {
database.ConnectDB("DB_DEV_PATH")
app := api.Setup()
log.Fatal(app.Listen(":80")) // this here!
}
Build the app, this make command will create a binary file called iron-stream and create the tables in the database.
make deploy
Create a new file called iron-stream.service
with the the corresponding information.
[Unit]
Description=iron-stream
[Service]
Environment=DB_DEV_PATH=/path/to/sqlite.db
Environment=SECRET_KEY=someradomstring
Environment=EMAIL_SECRET_KEY=emailsecret
Environment=ROOT_PATH=/path/to/iron-stream.backend
Type=simple
Restart=always
RestartSec=5s
ExecStart=/path/to/iron-stream/binary/iron-stream
[Install]
WantedBy=multi-user.target
Move the file to /etc/systemd/system
.
sudo mv iron-stream.service /etc/systemd/system
Run the service and check the status.
sudo service iron-stream start
sudo service iron-stream status
You should see something like this:
● iron-stream.service - iron-stream
Loaded: loaded (/lib/systemd/system/iron-stream.service; disabled; vendor preset: enabled)
Active: active (running) since Fri 2024-08-30 14:44:31 -03; 15min ago
Main PID: 45633 (iron-stream)
Tasks: 6 (limit: 18713)
Memory: 2.3M
CPU: 849ms
CGroup: /system.slice/iron-stream.service
└─45633 /path/to/iron-stream/binary/iron-stream
Enable the port 80
sudo ufw enable
sudo ufw allow 80/tcp
Check the status
sudo ufw status
You should see something like this:
Status: active
To Action From
-- ------ ----
80/tcp ALLOW Anywhere
80/tcp (v6) ALLOW Anywhere (v6)
I personally let Cloudflare handle the SSL certificates. Just point your domain to your server's IP address, as it's running on HTTP port (80).
The Proxy Status: Redirected via Proxy
will add a SSL certificate.
- Type: A
- Name: domain.com
- Value: 420.69.420.73
- Proxy Status: Redirected via Proxy