planningcenter_api 1.2.1 copy "planningcenter_api: ^1.2.1" to clipboard
planningcenter_api: ^1.2.1 copied to clipboard

This package gives you full coverage of the latest, non-beta version of the PlanningCenter API for each PlanningCenter application.

example/planningcenter_api_example.dart

import 'dart:async';
import 'dart:io'; // to exit the script faster
import 'dart:convert'; // for the pretty printing of json

import 'package:planningcenter_api/planningcenter_api.dart';

/// this is where I store my [appid], [secret], [oAuthClientId], and [oAuthClientSecret] constants
import '../secrets.dart';

void debug(Object o) {
  try {
    print(JsonEncoder.withIndent('  ').convert(o));
  } on JsonUnsupportedObjectError catch (e) {
    print('DEBUG AS STRING BECAUSE: $e');
    print(o);
  }
}

Future checkResponseError(PlanningCenterApiResponse res) async {
  if (res is PlanningCenterApiError) {
    debug(res.message);
    debug(res.responseBody);
  } else {
    debug('Success!');
  }
}

/// here's the real example code
void main() async {
  // begin by initializing the PlanningCenter api
  // this init will use a developer appid and secret giving you access to everything that developer can access
  // PlanningCenter.init(appid, secret);

  // this init will use oAuth
  var credentialsFile = File('credentials.json');
  if (await credentialsFile.exists()) {
    try {
      var credentials = json.decode(await credentialsFile.readAsString());
      var creds = PlanningCenterCredentials.fromJson(credentials);
      PlanningCenter.initWithCredentials(oAuthClientId, oAuthClientSecret, creds);
    } catch (e) {
      print(e);
      print('could not read credentials file');
    }
  }

  if (!PlanningCenter.initialized) {
    print('authorizing planning center with oauth');
    await PlanningCenter.authorize(
      oAuthClientId,
      oAuthClientSecret,
      PlanningCenter.oAuthScopes,
      redirectUri: 'http://localhost:64738/pco_callback',
    );
  }

  if (!PlanningCenter.initialized) {
    print('Planning Center authentication failed.');
    exit(1);
  }

  // Now, all classes beginning with Pco are available for use

  /// Get the service types on the default organization (defaults to grabbing 25)
  /// will return List<PcoServicesServiceType>
  var collection = await PcoServicesServiceType.get();
  debug(collection.response);
  if (!collection.isError) {
    var service = collection.items.first;
    print('Found Service Type: ${service.name}');

    /// most class instances have methods allowing you to fetch related items
    /// this time, we also are using a query object to request plans in descending order
    /// of their sort date
    var plans = await service.getPlans(
      query: PcoServicesPlanQuery(orderBy: PcoServicesPlanOrder.sortDate, reverse: true),
    );
    if (!plans.isError) {
      var plan = plans.items.first;
      print('Found Plan: ${plan.seriesTitle} - ${plan.title} - ${plan.lastTimeAt}');
      var items = await plan.getItems();
      for (var item in items.items) {
        print('Plan Item: ${item.title}\n${item.description}\n');
        if (item.title == 'CHANGE ME') {
          print('attempting to update this item');
          item.title = 'CHANGED';
          var result = await item.save();
          print(result.isError ? 'failed' : 'successful');
        }
      }
    }
  } else {
    print(collection.error!.message);
  }

  // to call the API directly, you can do this, but it will not return
  // typed data... just a moderately parsed PlanningCenterApiResponse object
  var res = await PlanningCenter.instance.call('/services/v2/songs');
  checkResponseError(res);
  debug(res.toJson());

  // Once we're done with the client, save the credentials file. This ensures
  // that if the credentials were automatically refreshed while using the
  // client, the new credentials are available for the next run of the
  // program.
  if (PlanningCenter.instance.oAuthCredentials != null) {
    await credentialsFile.create(recursive: true);
    await credentialsFile.writeAsString(json.encode(PlanningCenter.instance.oAuthCredentials));
  }

  // var email = PcoPeopleEmail('1', address: 'email@example.com', location: 'Home',isPrimary: true);
  // email.save();
  // PcoCollection<PcoPeopleEmail> emails = await PcoPeopleEmail.getFromPeople('1');
  // var myEmail = emails.data.first;
  // var myProfile = await myEmail.getPerson();
  // print(myProfile.data.first);

  var r = await PcoServicesPlan.getFromServiceType('1234567');
  if (!r.isError) {
    var plan = r.items.first;
    var r2 = await plan.itemReorder(PlanningCenterApiData('PlanItemReorder', attributes: {
      'sequence': ['5', '1', '3']
    }));
    checkResponseError(r2);
    debug(r2.toJson());
  }

  var r3 = await PlanningCenterApiFile.upload('myImage.jpg');
  if (r3.isError) {
    debug(r3.errorMessage);
    debug(r3.responseBody);
  } else {
    var f = (r3.data.first);
    print('File was successfully uploaded... it can now be attached to other objects by using its UUID');
    print('UUID: ${f.id}');
    print('CONTENT-TYPE: ${f.contentType}');
  }

  /// Here's an example for how to add a donation to the giving module

  // first, add a batch
  var batch = PcoGivingBatch();
  await batch.save();

  // now create a donation object
  var don = PcoGivingDonation(
    batchId: batch.id!,
    personId: '1234',
    paymentMethod: 'cash',
    paymentCheckNumber: 1234,
    paymentSourceId: '289',
    receivedAt: DateTime.now(),
  );

  // now save it to the server with two designations
  // note that saving donations without a designation
  // will fail.
  var r4 = await don.saveWithDesignations([
    PcoGivingDesignation(
      amountCents: 1234,
      withRelationships: {
        'fund': [PcoGivingFund(id: '1')]
      },
    ),
    PcoGivingDesignation(
      amountCents: 5678,
      withRelationships: {
        'fund': [PcoGivingFund(id: '2')]
      },
    )
  ]);
  checkResponseError(r4);
  debug(r4.toJson());

  exit(0);
}
5
likes
130
points
84
downloads

Publisher

verified publisherjeffmikels.com

Weekly Downloads

This package gives you full coverage of the latest, non-beta version of the PlanningCenter API for each PlanningCenter application.

Repository (GitHub)
View/report issues

Documentation

API reference

License

MIT (license)

Dependencies

http

More

Packages that depend on planningcenter_api