# Projeler

Projeler bir kullanıcı grubu olarak oluşturulur. Bu nedenle`group` ve `project` kavramları API'da aynı şeyi temsil etmektedir.

## Uç Noktaları

## Projeleri Getir

<mark style="color:blue;">`GET`</mark> `https://cubicl.io/api/v1/groups`

#### Query Parameters

| Name      | Type    | Description                                                                                                                                                                                  |
| --------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| parent    | string  | <p>Üst projenin ID'si.</p><p></p><p>Bu değer ayarlanmazsa kurumdaki tüm projeler gösterilir.</p>                                                                                             |
| recursive | boolean | <p><code>false</code> : sadece 1. seviye alt projeleri de getirir.</p><p><code>true</code> : tüm seviyelerdeki alt projeleri de getirir.</p><p><br>Varsayılan değer : <code>false</code></p> |

{% tabs %}
{% tab title="200: OK Proje listesi" %}

```javascript
Project[]
```

{% endtab %}
{% endtabs %}

## Veriler

#### Projeler

```typescript
type Project = {
    _id: string;
    name: string;
    // Projelerin birden çok üst projesi olabilir. Ana projenin bir üst projesi yoktur.
    parents: string[] | null;
    // "yönetici" rolüne sahip kullanıcıların ID'leri
    admins: string[];
    // "üye" rolüne sahip kullanıcıların ID'leri
    members: string[];
    // alt grupların ID'leri
    groups: string[];
    // Görev aşamaları tanımları. Yalnızca aşamalar özelleştirildiğinde mevcuttur.
    // Daha fazla bilgi için Görev Aşamaları bölümünü okuyun.
    taskStates?: TaskState[];
    // Projede ayarlanan izinler. Yalnızca proje izinleri özelleştirildiğinde mevcuttur.
    // Daha fazla bilgi için İzinler bölümünü okuyun.
    perms?: {
        members: PermissionLevels,
        everybody: PermissionLevels,
        // Kullanıcı ID'lerinin ve izin seviyelerinin bulunduğu nesne
        users?: {
            [userId: string]: PermissionLevels,
        }
    }
}
```

#### Görev Aşamaları

```typescript
type TaskState = {
    name: string;
    type: 'waiting' | 'active' | 'completed' | 'suspended';
    color: string; // Hex renk kodu
    textColor: string; // Hex renk kodu
    // Bir görev oluştururken aşama belirtilmemişse varsayılan olarak hangi
    // aşamanın tanımlanacağını belirtir.
    isDefault?: boolean;
}
```

Projede görev durumları özelleştirilmişse, "taskStates" özelliği, görev aşamaları tanımlanmış nesnelerinin listesini tutar. Aksi takdirde, aşağıdaki varsayılan değerler kullanılır.

```typescript
[
	{
		name : 'cb_waiting',
		type : 'waiting',
		color : '#f39c12',
		textColor : '#fff',
		isDefault : true
	},
	{
		name : 'cb_active',
		type : 'active',
		color : '#2ecc71',
		textColor : '#fff'
	},
	{
		name : 'cb_completed',
		type : 'completed',
		color : '#d8d8d8',
		textColor : '#333'
	},
	{
		name : 'cb_suspended',
		type : 'suspended',
		color : '#7d5fff',
		textColor : '#fff'
	}
]
```

#### İzinler

İzinler aşağıdaki sırayla 4 adımda ayarlanır ve kontrol edilir:

1. **Yöneticiler:** Yöneticiler, projedeki tüm eylemleri gerçekleştirebilir. Bir yönetici, alt projelerin üyesi olmasa bile tüm alt projelerde de yönetici ayrıcalığına sahiptir.
2. **Kullanıcı İzinleri:** İzinler bir kullanıcı için tanımlandıysa, aşağıdaki adımlar kontrol edilmeden kullanılacaktır. Kullanıcı izinleri `perms.users` özelliğinde tanımlanır.
3. **Proje Üyeleri:** Proje üyeleri ve diğer kullanıcılar için genel izinler belirlenir. Kullanıcı bir proje üyesiyse, bir sonraki adım kontrol edilmeden bu izinler kullanılacaktır.
4. **Proje Haricindeki Üyeler:** Bu izin düzeyi `perms.everybody` özelliğinde tanımlaır.

Projedeki her ana özellik için izin seviyeleri ayrı ayrı belirlenir.

```typescript
type FeaturePermLevels = {
    // Görevler, Takvim ve Zaman Çizelgesi sayfalarında kullanılır
    tasks: 'none' | 'view' | 'contribute' | 'edit' | 'manage',
    files: 'none' | 'view' | 'edit' | 'manage',
    gantt: 'none' | 'view' | 'edit',
    reports: 'none' | 'view',
}
```
