# 3. 상세요구사항(Specific Requirements)

## 3.1. 외부 인터페이스 요구사항(External interface requirements)

해당되지 않음.
## 3.2. 기능 요구사항(Functional requirements)

<%~ it.issues.map(i => `### (#${i.number}) ${i.title}\n${i.body.replaceAll("\r\n","\n")}`).join("\n\n") %>

## 3.3. 성능 요구사항(Performance requirements)

1. 최소 1000 RPS를 보장해야한다.
2. 첫 로드후 로딩하면 0.5s 이내에 동작해야합니다
3. 동시 편집 이용자를 5명까지는 허용해야 합니다.
4. 적어도 400개의 파일을 관리할 수 있어야 합니다.

## 3.4. 논리적 데이터베이스 요구사항(Logical database requirements)

```mermaid
erDiagram
    User {
        int id
        string accessToken
        date expiredAt
    }
    User ||--o{ Permission : has
    Permission {
        string name
        string path
    }
```

 단순하게 공유를 위한 User 구조만 있다.


## 3.5. 설계 제약사항(Design constraints)

2.1.1. 에서 언급했듯이 다음 브라우저에서 동작해야 한다.

- Chrome 버전 61 이상
- Firefox 버전 60 이상
- Edge 버전 79 이상
- Safari 버전 11 이상
- Chrome for Android 버전 100 이상
- Samsung internet 버전 8.2 이상

그리고 모바일에서도 큰 불편함 없이 원활히 동작해야 한다.

### 3.5.1. 표준 준수(Standards compliance)

해당되지 않음.

## 3.6. 소프트웨어 시스템 속성(Software system attributes)

해당되지 않음.

## 3.7. 상세 요구사항의 구성(Organizing the specific requirements)

### 3.7.1. 객체(Objects)

다음과 같은 UML을 그릴 수 있다.

```mermaid
classDiagram
    class Document{
        - URL path
        - string[] tags
        
        + renderChunk()
        + remove()
        + addTag(name: string)
        + deleteTag(name: string)
        + async share(option: ShareOption): URL
        + renderNavigator()
    }
    class Chunk{
        - id_t id
        - Content data
        - bool focused
        - pos_t cursorPos

        + focus(index: number)
        + unfocus(index: number)
        + remove(index: number)
        + insertBefore()
        + draw()
        + drawPreview()
        + autoComplete(ctx: AutoCompleteContext)
        + swapWith(p : Chunk)
        + edit()
    }
    Document "1" <-- "n" Chunk : List
    class Fileview{
        + listDirectory(path: URL)
        + open(path: URL)
        + remove(path: URL)
        + create(path: URL)
        + upload(file: Uint8Array| FileStream)
        + download(path: URL)
        + export(path: URL, option: ExportOption)
    }
    Fileview <.. Document : create
    class StashList{
        Content[] stash
        int maxStash
        createFromServer()
        push(c: Content)
        pop()
    }
    class DnDManager{
        + dropTo(Fileview)
        + dropTo(Document)
        + dropTo(Stash)
        + dragFrom(Fileview)
        + dragFrom(Document)
        + dragFrom(Stash)
    }
    DnDManager <.. Fileview : param
    DnDManager <.. Document : param
    DnDManager <.. StashList : param
    class SearchManager{
        search(query,option)
    }
    SearchManager <.. Document : return
```

```mermaid
classDiagram
    class Management{
        login(auth:Auth)
        setServerConfigure(config: Configure)
        setLocale(lang: string)
        setTheme(theme: string)
        getLocale()
        getTheme()
        getServerConfigure()
    }
    class Extension{
        registerPlugin(plugin: Plugin)
    }
```

Chunk는 문서를 이루는 기본적인 단위이다. 글의 문단이라고 생각 할 수 있다. Document는 그런 Chunk의 리스트이다. FileView는 파일에 접근하고 Document를 열 수 있는 파일 브라우저이다. StashList는 단순한 파일이나 텍스트 등을 임시로 저장하고 꺼내쓰는 컨테이너이다.

### 3.7.2. 사용자 인터페이스 상세

![interface](./interface.png)

다음과 같이 컴포넌트가 배치될 것이다. 배치될 컴포넌트는 Treeview, Chunk, ChunkList, Appbar, GeneralDialogue, Drawer, ContextMenu, StashList가 있다.