2017-10-09 19:06:40 +00:00
package models
2017-10-11 19:42:16 +00:00
/ * *
: : USAGE : :
Erwatet ein Struct mit einem Buch .
Wenn dieses Struct einen Publisher in Book . Publisher enthält und dieser existiert , wird diese
ID verwendet . Wenn die ID nicht existiert oder 0 ist , wird geguckt , ob der Publisher unter
Book . PublisherFull bereits existtiert ( über die ID ) , ist das nicht der Fall , wird er in
die Datenbank eingetragen und mit dem Buch verknüpft .
2017-11-08 09:55:17 +00:00
Bei den Autoren wird ebenfalls überprüft , ob sie bereits existieren , wenn dem nicht so ist werden
2017-10-11 19:42:16 +00:00
sie in die Datenbank eingetragen und mit dem Buch verknüpft .
2017-11-07 15:35:10 +00:00
* /
2017-10-11 19:42:16 +00:00
2017-11-18 08:32:30 +00:00
// AddOrUpdateBook adds a new book or updates an existing one, it takes a book struct with author and publisher. Inserts them if they don't already exist
func AddOrUpdateBook ( book Book ) ( newBook Book , err error ) {
2017-10-11 19:42:16 +00:00
// Take Publisher, check if it exists. If not, insert it
exists := false
publisherid := book . Publisher
if publisherid == 0 {
if book . PublisherFull . ID != 0 {
publisherid = book . PublisherFull . ID
}
}
2017-11-15 15:13:47 +00:00
// TODO: Check for empty values, should have at least a title. If no publisher is given (aka ID=0 & Name=""), don't insert an empty one.
2017-11-14 15:33:01 +00:00
_ , exists , err = GetPublisherByID ( publisherid )
2017-10-11 19:42:16 +00:00
if err != nil {
return Book { } , err
}
if ! exists {
2017-11-18 08:32:30 +00:00
newPublisher , err := AddPublisher ( Publisher { Name : book . PublisherFull . Name } )
2017-10-11 19:42:16 +00:00
if err != nil {
return Book { } , err
}
2017-11-18 08:32:30 +00:00
book . Publisher = newPublisher . ID
2017-10-11 19:42:16 +00:00
}
2017-11-16 18:07:32 +00:00
// Save the quantity for later use
qty := book . Quantity
2017-11-18 08:32:30 +00:00
// If we have an ID, try to update the book, otherwise create it
if book . ID == 0 {
// Insert the book
_ , err = x . Insert ( & book )
2017-10-11 16:17:51 +00:00
2017-11-18 08:32:30 +00:00
if err != nil {
return Book { } , err
}
} else {
// Update the book
_ , err := x . Id ( book . ID ) . Update ( book )
if err != nil {
return Book { } , err
}
2017-11-16 18:07:32 +00:00
}
// Set the Quantity
err = book . setBookQuantity ( qty )
if err != nil {
2017-10-11 16:17:51 +00:00
return Book { } , err
}
2017-10-11 19:42:16 +00:00
// Take the authors, look if they exist, if they don't create them
authorBookRelation := make ( [ ] AuthorBook , 0 )
for _ , author := range book . Authors {
_ , exists , err := GetAuthorByID ( author . ID )
if err != nil {
return Book { } , err
}
if ! exists {
// We have to insert authors on this inperformant way, because we need the ne ids afterwards
authorToBeInserted := new ( Author )
authorToBeInserted . Forename = author . Forename
authorToBeInserted . Lastname = author . Lastname
_ , err := x . Insert ( authorToBeInserted )
if err != nil {
return Book { } , err
}
author . ID = authorToBeInserted . ID
}
// Prepare new author Relateion
authorBookRelation = append ( authorBookRelation , AuthorBook { BookID : book . ID , AuthorID : author . ID } )
}
// Insert the connection between the author and the book
_ , err = x . Insert ( & authorBookRelation )
if err != nil {
return Book { } , err
}
2017-10-11 16:17:51 +00:00
// Get the newly inserted book
2017-11-08 09:57:38 +00:00
newBook , _ , err = GetBookByID ( book . ID )
2017-10-11 16:17:51 +00:00
2017-10-11 19:42:16 +00:00
return newBook , err
}