Compare commits

..
15 Commits
Author SHA1 Message Date
Amirmahdi 0329755068 feat: add btn text 2026-06-25 10:09:39 +03:30
Amirmahdi b1f1fb33c2 feat:version 2026-06-24 18:10:04 +03:30
Amirmahdi a63cefb80b feat: announcement 2026-06-24 17:56:51 +03:30
Amirmahdi 91b9cbc09e feat: add faq 2026-06-17 16:19:56 +03:30
Amirmahdi 804efc8aad feat: add colors 2026-06-16 19:14:43 +03:30
Amirmahdi ef6649309e feat: add search media 2026-06-15 14:26:41 +03:30
Amirmahdi e645fe19c4 feat: add new route" 2026-06-13 17:20:28 +03:30
Amirmahdi 9323df1e02 feat 2026-06-13 17:04:47 +03:30
Amirmahdi 86f63f92e0 show: playlist id 2026-06-13 12:25:24 +03:30
Amirmahdi 801a2d4236 feat: add group 2026-06-12 20:54:17 +03:30
Amirmahdi a8676eafb1 feat: add group 2026-06-12 16:56:24 +03:30
Amirmahdi 311b8b2ada feat:add tags 2026-06-12 14:55:07 +03:30
Amirmahdi 6a033f6d07 feat: category type 2026-06-11 09:54:23 +03:30
Amirmahdi 3da6549edb feat 2026-06-10 12:12:59 +03:30
Amirmahdi fc732ae75f fix 2026-06-06 21:21:25 +03:30
68 changed files with 1058 additions and 36 deletions
+19
View File
@@ -0,0 +1,19 @@
meta {
name: delete announcement
type: http
seq: 6
}
delete {
url: {{baseUrl}}/announcements/:id
body: none
auth: inherit
}
params:path {
id: 1
}
settings {
encodeUrl: true
}
+8
View File
@@ -0,0 +1,8 @@
meta {
name: announcement
seq: 20
}
auth {
mode: inherit
}
+19
View File
@@ -0,0 +1,19 @@
meta {
name: get announcements
type: http
seq: 2
}
get {
url: {{baseUrl}}/announcements
body: none
auth: inherit
}
settings {
encodeUrl: true
}
docs {
Admin: all announcements, newest first.
}
+20
View File
@@ -0,0 +1,20 @@
meta {
name: latest announcement
type: http
seq: 1
}
get {
url: {{baseUrl}}/announcements/latest
body: none
auth: inherit
}
settings {
encodeUrl: true
}
docs {
App side: returns the single latest currently-active announcement
(start_date <= now <= end_date; null bounds are open-ended), or null.
}
+19
View File
@@ -0,0 +1,19 @@
meta {
name: show announcement
type: http
seq: 4
}
get {
url: {{baseUrl}}/announcements/:id
body: none
auth: inherit
}
params:path {
id: 1
}
settings {
encodeUrl: true
}
+27
View File
@@ -0,0 +1,27 @@
meta {
name: store announcement
type: http
seq: 3
}
post {
url: {{baseUrl}}/announcements
body: multipartForm
auth: inherit
}
body:multipart-form {
title: تخفیف ویژه
description: توضیح اعلان
link: https://example.com
button_text: مشاهده
start_date: 2026-06-24 00:00:00
end_date: 2026-07-24 00:00:00
~image: @file()
~image_id: 1
}
settings {
encodeUrl: true
timeout: 0
}
+31
View File
@@ -0,0 +1,31 @@
meta {
name: update announcement
type: http
seq: 5
}
post {
url: {{baseUrl}}/announcements/:id
body: multipartForm
auth: inherit
}
params:path {
id: 1
}
body:multipart-form {
title: عنوان جدید
description: توضیح جدید
link: https://example.com
button_text: مشاهده
start_date: 2026-06-24 00:00:00
end_date: 2026-07-24 00:00:00
~image: @file()
~image_id: 1
}
settings {
encodeUrl: true
timeout: 0
}
+19
View File
@@ -0,0 +1,19 @@
meta {
name: admin delete feedback
type: http
seq: 4
}
delete {
url: {{baseUrl}}/admin/app-feedback/:id
body: none
auth: inherit
}
params:path {
id: 1
}
settings {
encodeUrl: true
}
+21
View File
@@ -0,0 +1,21 @@
meta {
name: admin list feedback
type: http
seq: 3
}
get {
url: {{baseUrl}}/admin/app-feedback
body: none
auth: inherit
}
params:query {
~has_comment: 1
~stars: 5
~per_page: 20
}
settings {
encodeUrl: true
}
+8
View File
@@ -0,0 +1,8 @@
meta {
name: app feedback
seq: 24
}
auth {
mode: inherit
}
+15
View File
@@ -0,0 +1,15 @@
meta {
name: get my feedback
type: http
seq: 1
}
get {
url: {{baseUrl}}/app-feedback
body: none
auth: inherit
}
settings {
encodeUrl: true
}
+23
View File
@@ -0,0 +1,23 @@
meta {
name: submit feedback
type: http
seq: 2
}
post {
url: {{baseUrl}}/app-feedback
body: json
auth: inherit
}
body:json {
{
"stars": 4,
"content": "هیچ راه واحدی برای مدیتیشن وجود ندارد"
}
}
settings {
encodeUrl: true
timeout: 0
}
@@ -0,0 +1,19 @@
meta {
name: delete breathing color
type: http
seq: 4
}
delete {
url: {{baseUrl}}/breathing-colors/:id
body: none
auth: inherit
}
params:path {
id: 1
}
settings {
encodeUrl: true
}
@@ -0,0 +1,7 @@
meta {
name: breathing colors
}
auth {
mode: inherit
}
@@ -0,0 +1,21 @@
meta {
name: get breathing colors
type: http
seq: 1
}
get {
url: {{baseUrl}}/breathing-colors
body: none
auth: inherit
}
settings {
encodeUrl: true
}
docs {
Palette the app shows when creating a breathing template. Each item has
a `colors` array (one hex = solid, several = gradient). The user picks one
and sends its colors as `colors` on /breathing-templates.
}
@@ -0,0 +1,25 @@
meta {
name: store breathing color
type: http
seq: 2
}
post {
url: {{baseUrl}}/breathing-colors
body: json
auth: inherit
}
body:json {
{
"name": "بنفش",
"colors": ["#6829DD", "#1A50CC"],
"order": 1,
"is_active": true
}
}
settings {
encodeUrl: true
timeout: 0
}
@@ -0,0 +1,28 @@
meta {
name: update breathing color
type: http
seq: 3
}
put {
url: {{baseUrl}}/breathing-colors/:id
body: json
auth: inherit
}
params:path {
id: 1
}
body:json {
{
"name": "بنفش",
"colors": ["#6829DD", "#1A50CC"],
"is_active": true
}
}
settings {
encodeUrl: true
timeout: 0
}
+2 -1
View File
@@ -26,7 +26,8 @@ body:json {
"breath_hold":5,
"duration":45,
"description":"asdsadaasdas",
"image_id":3
"image_id":3,
"colors":["#6829DD","#1A50CC"]
}
}
+2
View File
@@ -15,6 +15,8 @@ body:multipart-form {
inhale: 8
exhale: 3
breath_hold: 4
~colors[]: #6829DD
~colors[]: #1A50CC
}
settings {
+3 -3
View File
@@ -11,9 +11,9 @@ auth:bearer {
}
vars:pre-request {
token: 2|gpnAibfdNxCcnEVbMMzw8akRoQyzCKfjoJtK5qOp7d0fcbb3
baseUrl: http://localhost:8000/api
~baseUrl: https://meditation.approagency.ir/api
token: 6525|frMOcyJV7elCdNV0tfbCo2IvDEhSCStG6LHJ21cq8dbd4b29
baseUrl: https://meditation.approagency.ir/api
~baseUrl: http://localhost:8000/api
~baseUrl:
~baseUrl:
~approo_token:
+34
View File
@@ -0,0 +1,34 @@
meta {
name: comment and rating (one call)
type: http
seq: 4
}
post {
url: {{baseUrl}}/interactions/:type/:id
body: json
auth: inherit
}
params:path {
type: media
id: 27
}
body:json {
{
"content": "این مدیتیشن فوق‌العاده بود",
"stars": 5
}
}
settings {
encodeUrl: true
timeout: 0
}
docs {
type: music | media | playlist. At least one field is required:
- content: adds a comment
- stars: 1-5, sets/updates this user's rating
}
+19
View File
@@ -0,0 +1,19 @@
meta {
name: delete faq category
type: http
seq: 5
}
delete {
url: {{baseUrl}}/faq-categories/:id
body: none
auth: inherit
}
params:path {
id: 1
}
settings {
encodeUrl: true
}
+19
View File
@@ -0,0 +1,19 @@
meta {
name: delete faq
type: http
seq: 8
}
delete {
url: {{baseUrl}}/faqs/:id
body: none
auth: inherit
}
params:path {
id: 1
}
settings {
encodeUrl: true
}
+8
View File
@@ -0,0 +1,8 @@
meta {
name: faq
seq: 25
}
auth {
mode: inherit
}
+15
View File
@@ -0,0 +1,15 @@
meta {
name: get faq categories
type: http
seq: 2
}
get {
url: {{baseUrl}}/faq-categories
body: none
auth: inherit
}
settings {
encodeUrl: true
}
+20
View File
@@ -0,0 +1,20 @@
meta {
name: get faqs
type: http
seq: 1
}
get {
url: {{baseUrl}}/faqs
body: none
auth: inherit
}
settings {
encodeUrl: true
}
docs {
App endpoint: active FAQ categories, each with their active questions
(grouped). Pass ?include_inactive=1 for admin to see everything.
}
+24
View File
@@ -0,0 +1,24 @@
meta {
name: store faq category
type: http
seq: 3
}
post {
url: {{baseUrl}}/faq-categories
body: json
auth: inherit
}
body:json {
{
"name": "حساب کاربری",
"order": 1,
"is_active": true
}
}
settings {
encodeUrl: true
timeout: 0
}
+26
View File
@@ -0,0 +1,26 @@
meta {
name: store faq
type: http
seq: 6
}
post {
url: {{baseUrl}}/faqs
body: json
auth: inherit
}
body:json {
{
"faq_category_id": 1,
"question": "چطور رمز عبورم را تغییر دهم؟",
"answer": "از بخش پروفایل، گزینه تغییر رمز عبور را انتخاب کنید.",
"order": 1,
"is_active": true
}
}
settings {
encodeUrl: true
timeout: 0
}
+28
View File
@@ -0,0 +1,28 @@
meta {
name: update faq category
type: http
seq: 4
}
put {
url: {{baseUrl}}/faq-categories/:id
body: json
auth: inherit
}
params:path {
id: 1
}
body:json {
{
"name": "حساب کاربری",
"order": 1,
"is_active": true
}
}
settings {
encodeUrl: true
timeout: 0
}
+28
View File
@@ -0,0 +1,28 @@
meta {
name: update faq
type: http
seq: 7
}
put {
url: {{baseUrl}}/faqs/:id
body: json
auth: inherit
}
params:path {
id: 1
}
body:json {
{
"question": "چطور رمز عبورم را تغییر دهم؟",
"answer": "از بخش پروفایل ...",
"is_active": true
}
}
settings {
encodeUrl: true
timeout: 0
}
+34
View File
@@ -0,0 +1,34 @@
meta {
name: comment and rating (one call)
type: http
seq: 7
}
post {
url: {{baseUrl}}/interactions/:type/:id
body: json
auth: inherit
}
params:path {
type: media
id: 27
}
body:json {
{
"content": "این مدیتیشن فوق‌العاده بود",
"stars": 5
}
}
settings {
encodeUrl: true
timeout: 0
}
docs {
type: music | media | playlist. At least one field is required:
- content: adds a comment
- stars: 1-5, sets/updates this user's rating
}
+6 -1
View File
@@ -5,11 +5,16 @@ meta {
}
delete {
url: {{baseUrl}}/categories
url: {{baseUrl}}/categories/:id
body: none
auth: inherit
}
params:path {
id: 40
}
settings {
encodeUrl: true
timeout: 0
}
+1
View File
@@ -16,6 +16,7 @@ params:path {
body:multipart-form {
name: کودکان
type: media
description: دسته‌بندی محتوای کودکان
~icon: @file()
}
+10 -1
View File
@@ -5,12 +5,21 @@ meta {
}
get {
url: {{baseUrl}}/categories
url: {{baseUrl}}/categories?type=playlist
body: none
auth: inherit
}
params:query {
type: playlist
}
settings {
encodeUrl: true
timeout: 0
}
docs {
General categories. Filter by `type`: media | playlist | breathing_template.
Omit the `type` query param to return categories of all types.
}
+26
View File
@@ -0,0 +1,26 @@
meta {
name: grouped category
type: http
seq: 5
}
get {
url: {{baseUrl}}/categories/:id/grouped
body: none
auth: inherit
}
params:path {
id: 37
}
settings {
encodeUrl: true
timeout: 0
}
docs {
A category with each of its sub-categories, and each sub-category's medias:
{ category: { id, title, description, icon_url },
sub_categories: [ { sub_category: { id, title, description }, medias: [...] } ] }
}
+5
View File
@@ -12,6 +12,7 @@ post {
body:multipart-form {
name: کودکان
type: media
description: دسته‌بندی محتوای کودکان
~icon: @file()
}
@@ -20,3 +21,7 @@ settings {
encodeUrl: true
timeout: 0
}
docs {
`type`: media | playlist | breathing_template (defaults to media).
}
+2 -1
View File
@@ -11,7 +11,7 @@ get {
}
params:path {
id: 1
id: 27
}
body:text {
@@ -23,4 +23,5 @@ body:text {
settings {
encodeUrl: true
timeout: 0
}
+2 -2
View File
@@ -5,15 +5,15 @@ meta {
}
get {
url: {{baseUrl}}/media/filters
url: {{baseUrl}}/media/filters?search=ش
body: none
auth: inherit
}
params:query {
search: ش
~categories: 1
~tags: relax,sleep
~search:
}
settings {
+2 -1
View File
@@ -5,7 +5,7 @@ meta {
}
get {
url: {{baseUrl}}/media/
url: {{baseUrl}}/media/1
body: none
auth: inherit
}
@@ -14,6 +14,7 @@ params:query {
~categories: 1
~tags: relax,sleep
~search:
~count: 10
}
settings {
+34
View File
@@ -0,0 +1,34 @@
meta {
name: media-search
type: http
seq: 10
}
get {
url: {{baseUrl}}/media/search?per_page=20&page=1&durations=20-30
body: none
auth: inherit
}
params:query {
per_page: 20
page: 1
durations: 20-30
~search: ش
~categories: 1,2
~subcategories: 1
~tags: relax,sleep
}
settings {
encodeUrl: true
timeout: 0
}
docs {
Paginated search/filter results. Same filters as /media:
- search, categories (ids, comma), subcategories (ids, comma),
durations (e.g. 1-2,2-5,5-10,10-30,30-60,60-120,other), tags (names, comma)
- pagination: page, per_page (default 20, max 100)
Use /media/filters for the filter chips/options.
}
+26
View File
@@ -0,0 +1,26 @@
meta {
name: newest-media
type: http
seq: 11
}
get {
url: {{baseUrl}}/media/newest?per_page=20&page=1
body: none
auth: inherit
}
params:query {
per_page: 20
page: 1
}
settings {
encodeUrl: true
timeout: 0
}
docs {
Newest media, paginated (Laravel paginator: data, total, current_page,
last_page, per_page). Same visibility scope as /media.
}
+4
View File
@@ -48,6 +48,10 @@ body:multipart-form {
duration: 3
visibility: public
type: video
~image: @file()
~image_id: 1
~detail_image: @file()
~detail_image_id: 1
}
settings {
+2
View File
@@ -24,6 +24,8 @@ body:multipart-form {
~is_premium: true
~image: @file()
~image_id: 1
~detail_image: @file()
~detail_image_id: 1
}
settings {
+34
View File
@@ -0,0 +1,34 @@
meta {
name: comment and rating (one call)
type: http
seq: 5
}
post {
url: {{baseUrl}}/interactions/:type/:id
body: json
auth: inherit
}
params:path {
type: media
id: 27
}
body:json {
{
"content": "این مدیتیشن فوق‌العاده بود",
"stars": 5
}
}
settings {
encodeUrl: true
timeout: 0
}
docs {
type: music | media | playlist. At least one field is required:
- content: adds a comment
- stars: 1-5, sets/updates this user's rating
}
+8
View File
@@ -0,0 +1,8 @@
meta {
name: referral
seq: 20
}
auth {
mode: inherit
}
+15
View File
@@ -0,0 +1,15 @@
meta {
name: get-referral
type: http
seq: 1
}
get {
url: {{baseUrl}}/referral
body: none
auth: inherit
}
settings {
encodeUrl: true
}
+1 -1
View File
@@ -12,7 +12,7 @@ post {
body:multipart-form {
type: playlist @contentType(music,media,breathing-template,playlist)
id: 1
id: 4
}
settings {
+3 -2
View File
@@ -11,8 +11,9 @@ post {
}
body:multipart-form {
type: playlist @contentType(music,media,breathing-template)
id: 1
type: media @contentType(music,media,breathing-template)
id: 27
~is_saved: true
}
settings {
+20
View File
@@ -0,0 +1,20 @@
meta {
name: get themes
type: http
seq: 7
}
get {
url: {{baseUrl}}/themes
body: none
auth: inherit
}
settings {
encodeUrl: true
}
docs {
Returns the color themes (blue, pink, green, orange, purple) a scene can use.
Each theme has key, name and a `colors` map. Assign one to a scene via theme_id.
}
+2
View File
@@ -14,6 +14,8 @@ body:multipart-form {
name: موج‌های دریا
order: 1
is_active: 1
~is_premium: 1
~theme_id: 1
image: @file(C:\Users\vada\Downloads\bale-border.png)
~video: @file()
~sound: @file()
+14 -2
View File
@@ -6,14 +6,26 @@ meta {
post {
url: {{baseUrl}}/scenes/:id
body: none
body: multipartForm
auth: inherit
}
params:path {
id:
id: 1
}
body:multipart-form {
~name: موج‌های دریا
~theme_id: 1
~order: 1
~is_active: 1
~is_premium: 1
~image: @file()
~video: @file()
~sound: @file()
}
settings {
encodeUrl: true
timeout: 0
}
+25
View File
@@ -0,0 +1,25 @@
meta {
name: bulk answer
type: http
seq: 9
}
post {
url: {{baseUrl}}/survey-questions/answers
body: json
auth: inherit
}
body:json {
{
"answers": [
{ "question_id": 2, "option_ids": [8, 9] },
{ "question_id": 3, "option_ids": [] }
]
}
}
settings {
encodeUrl: true
timeout: 0
}
+1 -1
View File
@@ -5,7 +5,7 @@ meta {
}
get {
url: {{baseUrl}}/survey-questions/2
url: {{baseUrl}}/survey-questions/
body: none
auth: inherit
}
+12 -3
View File
@@ -19,13 +19,16 @@ body:json {
"is_active": true,
"options": [
{
"label": "Laravel"
"label": "Laravel",
"tags": ["focus", "calm"]
},
{
"label": "React"
"label": "React",
"tags": ["energy"]
},
{
"label": "Vue.js"
"label": "Vue.js",
"tags": []
},
{
"label": "Django"
@@ -47,3 +50,9 @@ settings {
encodeUrl: true
timeout: 0
}
docs {
Each option may carry `tags` (array of tag names). Tags are firstOrCreate'd
and linked to the option; they drive `survey-questions/suggested-media`,
which matches media that share the tags behind the user's chosen options.
}
+11 -4
View File
@@ -19,14 +19,16 @@ body:json {
"options": [
{
"label": "Laravel"
"label": "Laravel",
"tags": ["focus", "calm"]
},
{
"label": "React.js"
"label": "React.js",
"tags": ["energy"]
},
{
"label": "Vue.js"
"label": "Vue.js",
"tags": []
},
{
"label": "Django"
@@ -39,3 +41,8 @@ settings {
encodeUrl: true
timeout: 0
}
docs {
Sending `options` replaces the whole option set (and clears existing answers).
Each option may include `tags` (array of tag names) used by suggested-media.
}
+4 -3
View File
@@ -13,9 +13,10 @@ post {
body:multipart-form {
name: انگیزشی
description: انگیزشی از موزیک های هایپ است
~order:
~image_id:
~is_active:
~order:
~image_id:
~image: @file()
~is_active:
}
settings {
+26
View File
@@ -0,0 +1,26 @@
meta {
name: grouped category
type: http
seq: 5
}
get {
url: {{baseUrl}}/music-categories/:id/grouped
body: none
auth: inherit
}
params:path {
id: 1
}
settings {
encodeUrl: true
timeout: 0
}
docs {
A music category with each of its sub-categories, and each sub-category's playlists:
{ category: { id, title, description, image_url },
sub_categories: [ { sub_category: { id, title, description, image_url }, playlists: [...] } ] }
}
+8 -3
View File
@@ -4,9 +4,9 @@ meta {
seq: 11
}
put {
url: {{baseUrl}}//music-categories/:id
body: json
post {
url: {{baseUrl}}/music-categories/:id
body: multipartForm
auth: inherit
}
@@ -21,7 +21,12 @@ body:json {
}
body:multipart-form {
name: لوبیا
description: Updated description
~order:
~image_id:
~image: @file()
~is_active:
}
settings {
@@ -5,11 +5,15 @@ meta {
}
get {
url: {{baseUrl}}/music-playlists/
url: {{baseUrl}}/music-playlists/:id
body: none
auth: inherit
}
params:path {
id: 4
}
settings {
encodeUrl: true
timeout: 0
+5
View File
@@ -21,6 +21,11 @@ body:multipart-form {
category_ids[]: 1
subcategory_ids[]: 1
name: انگیزشی هایپ 5
~description: Music for deep sleep
~image_id: 1
~image: @file()
~detail_image_id: 1
~detail_image: @file()
}
settings {
+11 -6
View File
@@ -4,9 +4,9 @@ meta {
seq: 12
}
put {
post {
url: {{baseUrl}}/music-playlists/:id
body: json
body: multipartForm
auth: inherit
}
@@ -14,10 +14,15 @@ params:path {
id: 1
}
body:json {
{
"name":"خواب"
}
body:multipart-form {
name: خواب
~description: Music for deep sleep
~image_id: 1
~image: @file()
~detail_image_id: 1
~detail_image: @file()
~category_ids[]: 1
~subcategory_ids[]: 1
}
settings {
+19
View File
@@ -0,0 +1,19 @@
meta {
name: delete version
type: http
seq: 6
}
delete {
url: {{baseUrl}}/versions/:id
body: none
auth: inherit
}
params:path {
id: 1
}
settings {
encodeUrl: true
}
+8
View File
@@ -0,0 +1,8 @@
meta {
name: version
seq: 21
}
auth {
mode: inherit
}
+19
View File
@@ -0,0 +1,19 @@
meta {
name: get versions
type: http
seq: 2
}
get {
url: {{baseUrl}}/versions
body: none
auth: inherit
}
settings {
encodeUrl: true
}
docs {
Admin: all versions, highest version_code first.
}
+19
View File
@@ -0,0 +1,19 @@
meta {
name: latest version
type: http
seq: 1
}
get {
url: {{baseUrl}}/versions/latest
body: none
auth: inherit
}
settings {
encodeUrl: true
}
docs {
App update check: returns the newest version (highest version_code), or null.
}
+19
View File
@@ -0,0 +1,19 @@
meta {
name: show version
type: http
seq: 4
}
get {
url: {{baseUrl}}/versions/:id
body: none
auth: inherit
}
params:path {
id: 1
}
settings {
encodeUrl: true
}
+27
View File
@@ -0,0 +1,27 @@
meta {
name: store version
type: http
seq: 3
}
post {
url: {{baseUrl}}/versions
body: multipartForm
auth: inherit
}
body:multipart-form {
title: نسخه ۱.۲.۰
description: توضیح تغییرات نسخه
version_name: 1.2.0
version_code: 42
link: https://example.com/app.apk
button_text: به‌روزرسانی
~image: @file()
~image_id: 1
}
settings {
encodeUrl: true
timeout: 0
}
+31
View File
@@ -0,0 +1,31 @@
meta {
name: update version
type: http
seq: 5
}
post {
url: {{baseUrl}}/versions/:id
body: multipartForm
auth: inherit
}
params:path {
id: 1
}
body:multipart-form {
title: نسخه جدید
description: توضیح جدید
version_name: 1.3.0
version_code: 43
link: https://example.com/app.apk
button_text: به‌روزرسانی
~image: @file()
~image_id: 1
}
settings {
encodeUrl: true
timeout: 0
}