npm package: @psyrenpark/storage
Description: viba storage
Author: psyrenpark
Latest version: 3.0.0

## storage

### 제작이유

amplify를 활용한 인증 파일 업로드 다운로드의 재사용성을 위함 \
s3를 사용 하며 권한 체크하여 클라이언트에서 직접 업로드하는 방식으로 사용

- react 지원
- react-native 지원
- vue.js 지원
- gatsby.js 지원
- next.js(테스트중)


### 업데이트 내용

- v3.0.0

라이브러리 최신화
제거된 기능 제거


## 필요 파일

각 프로젝트의 개발 환경에 맞는 aws-exports.js 요청

```
React- native는
<project root>/aws-exports.js

web/cms은
<project root>/src/aws-exports.js
```

### 설정 및 설치

```properties
yarn add @psyrenpark/auth
yarn add @psyrenpark/api
yarn add @psyrenpark/storage
yarn add amazon-cognito-identity-js
yarn add aws-amplify

// react-native 추가 설치
yarn add @react-native-community/netinfo
```

### 최신 버전 적용 방법

새버전 공지시 npm에 맞는것 재설치

```properties
yarn add @psyrenpark/auth
yarn add @psyrenpark/api
yarn add @psyrenpark/storage
```

- 이후 최신버전으로 변경되었는지 확인할것.

### 설정

```properties
yarn add @psyrenpark/auth
yarn add @psyrenpark/api
yarn add @psyrenpark/storage
yarn add amazon-cognito-identity-js
yarn add aws-amplify

// react-native
yarn add @react-native-community/netinfo
```

---

### 루트에서 세팅

```javascript
//--------------------------------------------------
// 각 프로젝트 루트
import { Auth } from "@psyrenpark/auth";
import { Api } from "@psyrenpark/api";
import { Storage } from "@psyrenpark/storage";
import awsmobile from "./aws-exports";
Auth.setConfigure(awsmobile);
Api.setConfigure(awsmobile);
Storage.setConfigure(awsmobile);

//--------------------------------------------------
// 혹 import가 지원 되지 않는 javascript 버전에서 사용시

// aws-exports
// export default awsmobile;
module.exports = awsmobile; // 로 변경

// 각 프로젝트 루트
const { apiObject } = require("./api");
const { Api } = require("@psyrenpark/api");
const { Auth, AuthType } = require("@psyrenpark/auth");
const { Storage } = require("@psyrenpark/storage");
const awsmobile = require("./aws-exports");

Auth.setConfigure(awsmobile);
Api.setConfigure(awsmobile);
Storage.setConfigure(awsmobile);
```

### 로딩 콜백 함수 샘플

로딩에 대한 불편함을 해결하기위해 콜백형식의 함수를 주입가능하도록 되어있음

```javascript
// 아래 auth 함수가 실행될때 로딩함수를 넣으면
// 시작시 isLoading => true
// 종료시 isLoading => false
// 로 주입한 함수가 호출됨
const loadingFunction = (isLoading) => {
  dispatch({ type: "SET_IS_LOADING", payload: isLoading });
  // or
  setIsLoading(isLoading);
};
```

---

### key 생성 관련 예시

```javascript
//--------------------------------------

//uuid
import { v4 as uuidv4 } from "uuid";


const file_name = uuidv4();

const file_extension = file.name
      .substring(file.name.lastIndexOf("."), file.name.length)
      .toLowerCase();
    console.log(`profile/${file_name}${file_extension}`);

const key =  `profile/${file_name}${file_extension}`,

// ex) 'profile/12d8496a-1cv6-43a8-b43b-9dcc3fd0b09a.png

```

---

### put

- 이미지 업로드시 사용
- 업로드후 나오는 data.key를 서버에 전달하여 DB에 저장한다.

```javascript
//--------------------------------------
import { Storage } from "@psyrenpark/storage";

// image
const putImageFunction = async (inputEvent) => {
  // web
  const file = inputEvent.target.files[0];

  // react-native
  // const response = await fetch(image.uri);
  // const file = await response.blob();

  try {
    var data = await Storage.put(
      {
        key: "profile/ce14f5ae-01c6-4a66-a282-13ede4795ec2.png",
        object: file,
        config: {
          contentType: "image/png", // "image/jpeg",
          //  level: 'public',   //  public, protected, private
        },
      },
      loadingFunction // 로딩이 필요하다면 넣는다.
    );

    console.log(data.key);

    // api 통신
  } catch (error) {
    //  실패
  }
};

// text
const putTextFunction = async (inputEvent) => {
  // web
  const file = inputEvent.target.files[0];

  // react-native
  // const response = await fetch(text.uri);
  // const file = await response.blob();

  try {
    var data = await Storage.put(
      {
        key: "profile/ce14f5ae-01c6-4a66-a282-13efe4795ec7.txt",
        object: file,
        config: {
          contentType: "text/plain; charset=utf-8",
          //  level: 'public',   //  public, protected, private
        },
      },
      loadingFunction /// 로딩이 필요하다면 넣는다.
    );

    console.log(data.key);

    // {
    //   key: "profile/ce14f5ae-01c6-4a66-a282-13ede4795ec7.png"
    // }

    // public
  } catch (error) {
    //  실패 처리
  }
};
```

---

---

### get

- 인증이 필요한 이미지를 가져올 경우 사용한다.
- 일반적으로는 사용할 일이 없을듯. // 필요시 문의

```javascript
//--------------------------------------
import { Storage } from "@psyrenpark/storage";

//--------------------------------------
// get image url

const getFileUrlFunction = async () => {
  try {
    var url = await Storage.get(
      {
        key: "profile/ce14f5ae-01c6-4a66-a282-13ede4795ec7.png",
        config: { level: "public", expires: 60 },
      },
      loadingFunction
    );
  } catch (error) {
    // 실패 처리
  }
};
```

---

---

### list

- 인증이 필요한 이미지를 가져올 경우 사용한다.
- 일반적으로는 사용할 일이 없을듯. // 필요시 문의

```javascript
//--------------------------------------
import { Storage } from "@psyrenpark/storage";

//--------------------------------------
// list

const listFileFunction = async () => {
  try {
    var data = await Storage.list(
      {
        path: "/",
      },
      loadingFunction
    );
  } catch (error) {
    // 실패 처리
  }
};
```

---

### delete

- 일단 특정 경우를 제외한 삭제 기능 차단
- 필요시 요청 할것

```javascript
//--------------------------------------
import { Storage } from "@psyrenpark/storage";

//--------------------------------------
// remove

const removeFileFunction = async () => {
  try {
    var data = await Storage.remove(
      {
        key: "profile/ce14f5ae-01c6-4a66-a282-13eae4795ec7.png",
      },
      loadingFunction
    );
  } catch (error) {
    // 실패 처리
  }
};
```