LoginSignup
3
2

More than 5 years have passed since last update.

【Angular】in-memory-web-apiでクエリで返す値を絞る方法

Posted at

2,3ヶ月に1回調べては忘れるということがあったのでメモとして

この記事を書いたときのバージョン

{
 "angular-in-memory-web-api": "^0.5.2"
}

シチュエーション

種別の検索条件(kind)付きのGETリクエストで記事一覧を取得したい

期待動作

全取得

リクエスト

api/articles?kind=

レスポンス

[
    {
        title: 'Test Page 01',
        description: 'This is Test Page 01',
        image: 'path/your/image.png',
        kind: Kind.Sports
    },
    {
        title: 'Test Page 02',
        description: 'This is Test Page 02',
        image: 'path/your/image.png',
        kind: Kind.People
    },
    {
        title: 'Test Page 03',
        description: 'This is Test Page 03',
        image: 'path/your/image.png',
        kind: Kind.Technology
    }
]

検索条件有り(kind=sports)

リクエスト

api/artiles?kind=sports

レスポンス

[
    {
        title: 'Test Page 01',
        description: 'This is Test Page 01',
        image: 'path/your/image.png',
        kind: Kind.Sports
    }
]

コード

実コードから引っ張ったので、一部無理やりAnyにしてます。

in-memory-data.service.ts
import {
    InMemoryDbService,
    RequestInfo,
    RequestInfoUtilities,
    ParsedRequestUrl,
    ResponseOptions,
    getStatusText,
    STATUS
} from 'angular-in-memory-web-api';

enum Kind {
    Sports = 'sports',
    People = 'people',
    Technology = 'technology'
}

const feed: Any[] = [
    {
        title: 'Test Page 01',
        description: 'This is Test Page 01',
        image: 'path/your/image.png',
        kind: Kind.Sports
    },
    {
        title: 'Test Page 02',
        description: 'This is Test Page 02',
        image: 'path/your/image.png',
        kind: Kind.People
    },
    {
        title: 'Test Page 03',
        description: 'This is Test Page 03',
        image: 'path/your/image.png',
        kind: Kind.Technology
    }
];

export class InMemoryDataService implements InMemoryDbService {

    // オーバーライド
    get(reqInfo: RequestInfo) {
        const collectionName = reqInfo.collectionName;
        if (collectionName === 'articles') {
            return this.getArticles(reqInfo);
        }
        return undefined;
    }

    private getArticles(reqInfo: RequestInfo) {
        return reqInfo.utils.createResponse$(() => {
            console.log('HTTP GET override');

            const collection = feed.slice();
            const dataEncapsulation = reqInfo.utils.getConfig().dataEncapsulation;

            const kind = reqInfo.query.get('kind');
            const data = kind === undefined ? collection : this.filterFeed(kind[0]);

            const options: any = data ?
                {
                    body: dataEncapsulation ? { data } : data,
                    status: STATUS.OK
                } :
                {
                    body: { error: 'error' },
                    status: STATUS.NOT_FOUND
                };
            return this.finishOptions(options, reqInfo);
        });
    }

    private finishOptions(options: ResponseOptions, { headers, url }: RequestInfo) {
        options.statusText = getStatusText(options.status);
        options.headers = headers;
        options.url = url;
        return options;
    }

    private filterFeed(kind: string) {
        return feed.filter((value: FeedItem, index: number, array: FeedItem[]) => {
            return (value.kind === kind);
        });
    }

    createDb() {
        return { feed };
    }

}

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2