# Storage API
## Enums
```typescript=
export enum RecordState {
DRAFT,
ACTIVE,
INACTIVE,
}
enum FileState {
INITIALIZED,
COMMITTED
}
```
## Collections
```typescript=
class Record {
@Prop({ required: true, enum: RecordState, default: RecordState.DRAFT })
public state: RecordState;
@Prop({ required: true, type: Date })
public createdAt: Date;
@Prop({ required: false, type: Date })
public updatedAt: Date;
@Prop({ required: true, type: Boolean, default: false })
public deleted: boolean;
}
class Permission {
@Prop({ required: true, default: false })
public read: boolean;
@Prop({ required: true, default: false })
public write: boolean;
}
class FileMeta {
@Prop({ required: true })
public name: String;
@Prop({ required: true })
public size: number;
@Prop({ required: true })
public mimeType: String;
}
class S3 {
@Prop({ required: true })
public key: String;
@Prop({ required: true })
public eTag: String;
@Prop({ required: true })
public bucket: String;
}
class StateLog {
public createdAt: Date;
public value: FileState;
}
class State {
@Prop({ required: true, enum: FileState, default: FileState.INITIALIZED })
public value: FileState;
@Prop({ required: true })
public log: List<StateLog>;
}
@Schema({ collection: 'buckets' })
class Bucket {
@Prop({ required: true, unique: true })
public name: string;
@Prop({ required: true })
public accessMap: Map<String, Permission>;
@Prop({ required: true, type: Record })
public record: Record;
}
@Schema({ collection: 'files' })
export class File {
@Prop({ required: true, type: FileMeta })
public meta: FileMeta;
@Prop({ required: true, type: S3 })
public s3: S3;
@Prop({ required: true, type: State })
public state: State;
@Prop({ required: true, default: true })
public committed: boolean;
@Prop({ required: true, type: Record })
public record: Record;
}
```
## API Interfaces
**note:** this is business layer api
**upload file**
```
response is file meta data or standard json error object
POST http://fs.pdcems.ge/file
FormData (multipart/form)
file: File
key: string
meta.latitude: string
meta.longitude: string
meta.orientation: string
meta.etc: string
```
**commit file**
```
// response is file meta or standard json error object
POST http://fs.pdcems.ge/files/:fileId/commit?key=myToken
```
**get file stream**
```
// response is stream or standard json error object
GET http://fs.pdcems.ge/files/:fileId/stream?key=myToken
```
**get file base64**
```
// response is stream or standard json error object
GET http://fs.pdcems.ge/files/:fileId/base64?key=myToken
```
**get file meta info**
```
response is file meta data or standard json error object
GET http://fs.pdcems.ge/files/:fileId/meta?key=myToken
```
**soft delete - file**
```
// response is file meta or standard json error object
DELETE http://fs.pdcems.ge/files/:fileId/soft?key=myToken
```
**hard delete - file**
```
// response is file meta or standard json error object
DELETE http://fs.pdcems.ge/files/:fileId/hard
```
**calculate file hash**
```
response is file meta data or standard json error object
POST http://fs.pdcems.ge/files/:fileId/calculate-hash
```