All files index.ts

89.47% Statements 34/38
75% Branches 3/4
100% Functions 4/4
89.47% Lines 34/38

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96                                  1x 1x     1x 1x 1x 1x   1x         1x   1x   1x   1x     1x 1x   1x 1x           1x       1x 1x   1x 1x           1x     1x 1x 1x           1x   3x   3x 3x   1x 1x   1x 1x   1x 1x            
'use strict';
/*
 * Copyright 2021 Algolia
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
 
import * as functions from 'firebase-functions';
import algoliaSearch from 'algoliasearch';
import { DocumentSnapshot } from 'firebase-functions/lib/providers/firestore';
 
import config from './config';
import extract from './extract';
import * as logs from './logs';
import { ChangeType, getChangeType } from './util';
 
const client = algoliaSearch(
  config.algoliaAppId,
  config.algoliaAPIKey,
);
 
client.addAlgoliaAgent('firestore_integration', '0.0.1');
 
export const index = client.initIndex(config.algoliaIndexName);
 
logs.init();
 
const handleCreateDocument = async (
  snapshot: DocumentSnapshot
) => {
  try {
    const data = extract(snapshot);
 
    logs.createIndex(snapshot.id, data);
    await index.saveObjects([ data ]);
  } catch (e) {
    logs.error(e);
  }
};
 
const handleUpdateDocument = async (
  before: DocumentSnapshot,
  after: DocumentSnapshot
) => {
  try {
    const data = extract(after);
 
    logs.updateIndex(after.id, data);
    await index.saveObjects([ data ]);
  } catch (e) {
    logs.error(e);
  }
};
 
const handleDeleteDocument = async (
  deleted: DocumentSnapshot,
) => {
  try {
    logs.deleteIndex(deleted.id);
    await index.deleteObject(deleted.id);
  } catch (e) {
    logs.error(e);
  }
};
 
export const executeIndexOperation = functions.handler.firestore.document
  .onWrite(async (change): Promise<void> => {
    logs.start();
 
    const changeType = getChangeType(change);
    switch (changeType) {
      case ChangeType.CREATE:
        await handleCreateDocument(change.after);
        break;
      case ChangeType.DELETE:
        await handleDeleteDocument(change.before);
        break;
      case ChangeType.UPDATE:
        await handleUpdateDocument(change.before, change.after);
        break;
      default: {
        throw new Error(`Invalid change type: ${ changeType }`);
      }
    }
  });